From 08ca590e929e7e3d7cf4487435baa94358b810b9 Mon Sep 17 00:00:00 2001 From: Musab Erdem Date: Mon, 15 Jul 2024 11:21:11 +0200 Subject: [PATCH] venv wird nicht mehr synchronisiert. --- .venv/.gitignore | 1 - .venv/Lib/site-packages/PIL/BdfFontFile.py | 133 - .venv/Lib/site-packages/PIL/BlpImagePlugin.py | 488 - .venv/Lib/site-packages/PIL/BmpImagePlugin.py | 489 - .../site-packages/PIL/BufrStubImagePlugin.py | 76 - .venv/Lib/site-packages/PIL/ContainerIO.py | 121 - .venv/Lib/site-packages/PIL/CurImagePlugin.py | 75 - .venv/Lib/site-packages/PIL/DcxImagePlugin.py | 80 - .venv/Lib/site-packages/PIL/DdsImagePlugin.py | 575 - .venv/Lib/site-packages/PIL/EpsImagePlugin.py | 478 - .venv/Lib/site-packages/PIL/ExifTags.py | 381 - .../Lib/site-packages/PIL/FitsImagePlugin.py | 152 - .venv/Lib/site-packages/PIL/FliImagePlugin.py | 174 - .venv/Lib/site-packages/PIL/FontFile.py | 134 - .venv/Lib/site-packages/PIL/FpxImagePlugin.py | 255 - .../Lib/site-packages/PIL/FtexImagePlugin.py | 115 - .venv/Lib/site-packages/PIL/GbrImagePlugin.py | 103 - .venv/Lib/site-packages/PIL/GdImageFile.py | 102 - .venv/Lib/site-packages/PIL/GifImagePlugin.py | 1159 - .../Lib/site-packages/PIL/GimpGradientFile.py | 149 - .../Lib/site-packages/PIL/GimpPaletteFile.py | 58 - .../site-packages/PIL/GribStubImagePlugin.py | 76 - .../site-packages/PIL/Hdf5StubImagePlugin.py | 76 - .../Lib/site-packages/PIL/IcnsImagePlugin.py | 399 - .venv/Lib/site-packages/PIL/IcoImagePlugin.py | 360 - .venv/Lib/site-packages/PIL/ImImagePlugin.py | 374 - .venv/Lib/site-packages/PIL/Image.py | 4147 -- .venv/Lib/site-packages/PIL/ImageChops.py | 311 - .venv/Lib/site-packages/PIL/ImageCms.py | 1127 - .venv/Lib/site-packages/PIL/ImageColor.py | 320 - .venv/Lib/site-packages/PIL/ImageDraw.py | 1206 - .venv/Lib/site-packages/PIL/ImageDraw2.py | 206 - .venv/Lib/site-packages/PIL/ImageEnhance.py | 107 - .venv/Lib/site-packages/PIL/ImageFile.py | 810 - .venv/Lib/site-packages/PIL/ImageFilter.py | 604 - .venv/Lib/site-packages/PIL/ImageFont.py | 1290 - .venv/Lib/site-packages/PIL/ImageGrab.py | 194 - .venv/Lib/site-packages/PIL/ImageMath.py | 357 - .venv/Lib/site-packages/PIL/ImageMode.py | 92 - .venv/Lib/site-packages/PIL/ImageMorph.py | 265 - .venv/Lib/site-packages/PIL/ImageOps.py | 728 - .venv/Lib/site-packages/PIL/ImagePalette.py | 284 - .venv/Lib/site-packages/PIL/ImagePath.py | 20 - .venv/Lib/site-packages/PIL/ImageQt.py | 205 - .venv/Lib/site-packages/PIL/ImageSequence.py | 86 - .venv/Lib/site-packages/PIL/ImageShow.py | 363 - .venv/Lib/site-packages/PIL/ImageStat.py | 160 - .venv/Lib/site-packages/PIL/ImageTk.py | 284 - .venv/Lib/site-packages/PIL/ImageTransform.py | 135 - .venv/Lib/site-packages/PIL/ImageWin.py | 238 - .venv/Lib/site-packages/PIL/ImtImagePlugin.py | 103 - .../Lib/site-packages/PIL/IptcImagePlugin.py | 235 - .../site-packages/PIL/Jpeg2KImagePlugin.py | 408 - .../Lib/site-packages/PIL/JpegImagePlugin.py | 861 - .venv/Lib/site-packages/PIL/JpegPresets.py | 242 - .../site-packages/PIL/McIdasImagePlugin.py | 78 - .venv/Lib/site-packages/PIL/MicImagePlugin.py | 107 - .../Lib/site-packages/PIL/MpegImagePlugin.py | 88 - .venv/Lib/site-packages/PIL/MpoImagePlugin.py | 180 - .venv/Lib/site-packages/PIL/MspImagePlugin.py | 200 - .venv/Lib/site-packages/PIL/PSDraw.py | 237 - .venv/Lib/site-packages/PIL/PaletteFile.py | 54 - .../Lib/site-packages/PIL/PalmImagePlugin.py | 229 - .venv/Lib/site-packages/PIL/PcdImagePlugin.py | 66 - .venv/Lib/site-packages/PIL/PcfFontFile.py | 254 - .venv/Lib/site-packages/PIL/PcxImagePlugin.py | 227 - .venv/Lib/site-packages/PIL/PdfImagePlugin.py | 304 - .venv/Lib/site-packages/PIL/PdfParser.py | 1003 - .../Lib/site-packages/PIL/PixarImagePlugin.py | 72 - .venv/Lib/site-packages/PIL/PngImagePlugin.py | 1489 - .venv/Lib/site-packages/PIL/PpmImagePlugin.py | 371 - .venv/Lib/site-packages/PIL/PsdImagePlugin.py | 326 - .venv/Lib/site-packages/PIL/PyAccess.py | 381 - .venv/Lib/site-packages/PIL/QoiImagePlugin.py | 115 - .venv/Lib/site-packages/PIL/SgiImagePlugin.py | 238 - .../site-packages/PIL/SpiderImagePlugin.py | 325 - .venv/Lib/site-packages/PIL/SunImagePlugin.py | 141 - .venv/Lib/site-packages/PIL/TarIO.py | 67 - .venv/Lib/site-packages/PIL/TgaImagePlugin.py | 262 - .../Lib/site-packages/PIL/TiffImagePlugin.py | 2200 - .venv/Lib/site-packages/PIL/TiffTags.py | 555 - .venv/Lib/site-packages/PIL/WalImageFile.py | 124 - .../Lib/site-packages/PIL/WebPImagePlugin.py | 363 - .venv/Lib/site-packages/PIL/WmfImagePlugin.py | 181 - .../site-packages/PIL/XVThumbImagePlugin.py | 81 - .venv/Lib/site-packages/PIL/XbmImagePlugin.py | 98 - .venv/Lib/site-packages/PIL/XpmImagePlugin.py | 125 - .venv/Lib/site-packages/PIL/__init__.py | 86 - .venv/Lib/site-packages/PIL/__main__.py | 7 - .../__pycache__/BdfFontFile.cpython-311.pyc | Bin 5215 -> 0 bytes .../BlpImagePlugin.cpython-311.pyc | Bin 25878 -> 0 bytes .../BmpImagePlugin.cpython-311.pyc | Bin 18616 -> 0 bytes .../BufrStubImagePlugin.cpython-311.pyc | Bin 3097 -> 0 bytes .../__pycache__/ContainerIO.cpython-311.pyc | Bin 4556 -> 0 bytes .../CurImagePlugin.cpython-311.pyc | Bin 2570 -> 0 bytes .../DcxImagePlugin.cpython-311.pyc | Bin 3006 -> 0 bytes .../DdsImagePlugin.cpython-311.pyc | Bin 22835 -> 0 bytes .../EpsImagePlugin.cpython-311.pyc | Bin 18641 -> 0 bytes .../PIL/__pycache__/ExifTags.cpython-311.pyc | Bin 12041 -> 0 bytes .../FitsImagePlugin.cpython-311.pyc | Bin 6780 -> 0 bytes .../FliImagePlugin.cpython-311.pyc | Bin 7412 -> 0 bytes .../PIL/__pycache__/FontFile.cpython-311.pyc | Bin 5187 -> 0 bytes .../FpxImagePlugin.cpython-311.pyc | Bin 8123 -> 0 bytes .../FtexImagePlugin.cpython-311.pyc | Bin 5516 -> 0 bytes .../GbrImagePlugin.cpython-311.pyc | Bin 3965 -> 0 bytes .../__pycache__/GdImageFile.cpython-311.pyc | Bin 3764 -> 0 bytes .../GifImagePlugin.cpython-311.pyc | Bin 45090 -> 0 bytes .../GimpGradientFile.cpython-311.pyc | Bin 6654 -> 0 bytes .../GimpPaletteFile.cpython-311.pyc | Bin 2697 -> 0 bytes .../GribStubImagePlugin.cpython-311.pyc | Bin 3089 -> 0 bytes .../Hdf5StubImagePlugin.cpython-311.pyc | Bin 3060 -> 0 bytes .../IcnsImagePlugin.cpython-311.pyc | Bin 18707 -> 0 bytes .../IcoImagePlugin.cpython-311.pyc | Bin 15407 -> 0 bytes .../__pycache__/ImImagePlugin.cpython-311.pyc | Bin 13307 -> 0 bytes .../PIL/__pycache__/Image.cpython-311.pyc | Bin 179967 -> 0 bytes .../__pycache__/ImageChops.cpython-311.pyc | Bin 11925 -> 0 bytes .../PIL/__pycache__/ImageCms.cpython-311.pyc | Bin 46291 -> 0 bytes .../__pycache__/ImageColor.cpython-311.pyc | Bin 13870 -> 0 bytes .../PIL/__pycache__/ImageDraw.cpython-311.pyc | Bin 47548 -> 0 bytes .../__pycache__/ImageDraw2.cpython-311.pyc | Bin 9377 -> 0 bytes .../__pycache__/ImageEnhance.cpython-311.pyc | Bin 5682 -> 0 bytes .../PIL/__pycache__/ImageFile.cpython-311.pyc | Bin 32383 -> 0 bytes .../__pycache__/ImageFilter.cpython-311.pyc | Bin 25718 -> 0 bytes .../PIL/__pycache__/ImageFont.cpython-311.pyc | Bin 68479 -> 0 bytes .../PIL/__pycache__/ImageGrab.cpython-311.pyc | Bin 7602 -> 0 bytes .../PIL/__pycache__/ImageMath.cpython-311.pyc | Bin 17429 -> 0 bytes .../PIL/__pycache__/ImageMode.cpython-311.pyc | Bin 3118 -> 0 bytes .../__pycache__/ImageMorph.cpython-311.pyc | Bin 12663 -> 0 bytes .../PIL/__pycache__/ImageOps.cpython-311.pyc | Bin 31560 -> 0 bytes .../__pycache__/ImagePalette.cpython-311.pyc | Bin 14322 -> 0 bytes .../PIL/__pycache__/ImagePath.cpython-311.pyc | Bin 399 -> 0 bytes .../PIL/__pycache__/ImageQt.cpython-311.pyc | Bin 8800 -> 0 bytes .../__pycache__/ImageSequence.cpython-311.pyc | Bin 4010 -> 0 bytes .../PIL/__pycache__/ImageShow.cpython-311.pyc | Bin 15764 -> 0 bytes .../PIL/__pycache__/ImageStat.cpython-311.pyc | Bin 8730 -> 0 bytes .../PIL/__pycache__/ImageTk.cpython-311.pyc | Bin 11327 -> 0 bytes .../ImageTransform.cpython-311.pyc | Bin 5659 -> 0 bytes .../PIL/__pycache__/ImageWin.cpython-311.pyc | Bin 12129 -> 0 bytes .../ImtImagePlugin.cpython-311.pyc | Bin 2837 -> 0 bytes .../IptcImagePlugin.cpython-311.pyc | Bin 9371 -> 0 bytes .../Jpeg2KImagePlugin.cpython-311.pyc | Bin 18136 -> 0 bytes .../JpegImagePlugin.cpython-311.pyc | Bin 35478 -> 0 bytes .../__pycache__/JpegPresets.cpython-311.pyc | Bin 8502 -> 0 bytes .../McIdasImagePlugin.cpython-311.pyc | Bin 2505 -> 0 bytes .../MicImagePlugin.cpython-311.pyc | Bin 4396 -> 0 bytes .../MpegImagePlugin.cpython-311.pyc | Bin 4006 -> 0 bytes .../MpoImagePlugin.cpython-311.pyc | Bin 8389 -> 0 bytes .../MspImagePlugin.cpython-311.pyc | Bin 6336 -> 0 bytes .../PIL/__pycache__/PSDraw.cpython-311.pyc | Bin 8571 -> 0 bytes .../__pycache__/PaletteFile.cpython-311.pyc | Bin 2543 -> 0 bytes .../PalmImagePlugin.cpython-311.pyc | Bin 10380 -> 0 bytes .../PcdImagePlugin.cpython-311.pyc | Bin 2157 -> 0 bytes .../__pycache__/PcfFontFile.cpython-311.pyc | Bin 12293 -> 0 bytes .../PcxImagePlugin.cpython-311.pyc | Bin 8205 -> 0 bytes .../PdfImagePlugin.cpython-311.pyc | Bin 10001 -> 0 bytes .../PIL/__pycache__/PdfParser.cpython-311.pyc | Bin 55494 -> 0 bytes .../PixarImagePlugin.cpython-311.pyc | Bin 2147 -> 0 bytes .../PngImagePlugin.cpython-311.pyc | Bin 63551 -> 0 bytes .../PpmImagePlugin.cpython-311.pyc | Bin 15450 -> 0 bytes .../PsdImagePlugin.cpython-311.pyc | Bin 11748 -> 0 bytes .../PIL/__pycache__/PyAccess.cpython-311.pyc | Bin 19490 -> 0 bytes .../QoiImagePlugin.cpython-311.pyc | Bin 6676 -> 0 bytes .../SgiImagePlugin.cpython-311.pyc | Bin 8960 -> 0 bytes .../SpiderImagePlugin.cpython-311.pyc | Bin 13915 -> 0 bytes .../SunImagePlugin.cpython-311.pyc | Bin 3686 -> 0 bytes .../PIL/__pycache__/TarIO.cpython-311.pyc | Bin 2860 -> 0 bytes .../TgaImagePlugin.cpython-311.pyc | Bin 8637 -> 0 bytes .../TiffImagePlugin.cpython-311.pyc | Bin 101343 -> 0 bytes .../PIL/__pycache__/TiffTags.cpython-311.pyc | Bin 18930 -> 0 bytes .../__pycache__/WalImageFile.cpython-311.pyc | Bin 4175 -> 0 bytes .../WebPImagePlugin.cpython-311.pyc | Bin 15527 -> 0 bytes .../WmfImagePlugin.cpython-311.pyc | Bin 6808 -> 0 bytes .../XVThumbImagePlugin.cpython-311.pyc | Bin 2919 -> 0 bytes .../XbmImagePlugin.cpython-311.pyc | Bin 4472 -> 0 bytes .../XpmImagePlugin.cpython-311.pyc | Bin 5004 -> 0 bytes .../PIL/__pycache__/__init__.cpython-311.pyc | Bin 2163 -> 0 bytes .../PIL/__pycache__/__main__.cpython-311.pyc | Bin 480 -> 0 bytes .../PIL/__pycache__/_binary.cpython-311.pyc | Bin 3974 -> 0 bytes .../__pycache__/_deprecate.cpython-311.pyc | Bin 2762 -> 0 bytes .../_tkinter_finder.cpython-311.pyc | Bin 847 -> 0 bytes .../PIL/__pycache__/_typing.cpython-311.pyc | Bin 2149 -> 0 bytes .../PIL/__pycache__/_util.cpython-311.pyc | Bin 2173 -> 0 bytes .../PIL/__pycache__/_version.cpython-311.pyc | Bin 324 -> 0 bytes .../PIL/__pycache__/features.cpython-311.pyc | Bin 15266 -> 0 bytes .../PIL/__pycache__/report.cpython-311.pyc | Bin 420 -> 0 bytes .venv/Lib/site-packages/PIL/_binary.py | 112 - .venv/Lib/site-packages/PIL/_deprecate.py | 71 - .../PIL/_imaging.cp311-win_amd64.pyd | Bin 2341888 -> 0 bytes .venv/Lib/site-packages/PIL/_imaging.pyi | 30 - .../PIL/_imagingcms.cp311-win_amd64.pyd | Bin 263168 -> 0 bytes .venv/Lib/site-packages/PIL/_imagingcms.pyi | 141 - .../PIL/_imagingft.cp311-win_amd64.pyd | Bin 1819136 -> 0 bytes .venv/Lib/site-packages/PIL/_imagingft.pyi | 69 - .../PIL/_imagingmath.cp311-win_amd64.pyd | Bin 24064 -> 0 bytes .venv/Lib/site-packages/PIL/_imagingmath.pyi | 3 - .../PIL/_imagingmorph.cp311-win_amd64.pyd | Bin 13824 -> 0 bytes .venv/Lib/site-packages/PIL/_imagingmorph.pyi | 3 - .../PIL/_imagingtk.cp311-win_amd64.pyd | Bin 14848 -> 0 bytes .../Lib/site-packages/PIL/_tkinter_finder.py | 21 - .venv/Lib/site-packages/PIL/_typing.py | 39 - .venv/Lib/site-packages/PIL/_util.py | 31 - .venv/Lib/site-packages/PIL/_version.py | 4 - .../PIL/_webp.cp311-win_amd64.pyd | Bin 412672 -> 0 bytes .venv/Lib/site-packages/PIL/_webp.pyi | 3 - .venv/Lib/site-packages/PIL/features.py | 340 - .venv/Lib/site-packages/PIL/py.typed | 0 .venv/Lib/site-packages/PIL/report.py | 5 - .../__pycache__/pylab.cpython-311.pyc | Bin 351 -> 0 bytes .../__pycache__/six.cpython-311.pyc | Bin 46455 -> 0 bytes .../site-packages/_distutils_hack/__init__.py | 222 - .../__pycache__/__init__.cpython-311.pyc | Bin 11213 -> 0 bytes .../__pycache__/override.cpython-311.pyc | Bin 370 -> 0 bytes .../site-packages/_distutils_hack/override.py | 1 - .../contourpy-1.2.1.dist-info/INSTALLER | 1 - .../contourpy-1.2.1.dist-info/LICENSE | 29 - .../contourpy-1.2.1.dist-info/METADATA | 91 - .../contourpy-1.2.1.dist-info/RECORD | 43 - .../contourpy-1.2.1.dist-info/WHEEL | 4 - .venv/Lib/site-packages/contourpy/__init__.py | 267 - .../__pycache__/__init__.cpython-311.pyc | Bin 12968 -> 0 bytes .../__pycache__/_version.cpython-311.pyc | Bin 262 -> 0 bytes .../__pycache__/array.cpython-311.pyc | Bin 15370 -> 0 bytes .../__pycache__/chunk.cpython-311.pyc | Bin 4021 -> 0 bytes .../__pycache__/convert.cpython-311.pyc | Bin 26388 -> 0 bytes .../__pycache__/dechunk.cpython-311.pyc | Bin 6352 -> 0 bytes .../__pycache__/enum_util.cpython-311.pyc | Bin 2396 -> 0 bytes .../__pycache__/typecheck.cpython-311.pyc | Bin 13837 -> 0 bytes .../__pycache__/types.cpython-311.pyc | Bin 527 -> 0 bytes .../contourpy/_contourpy.cp311-win_amd64.lib | Bin 2068 -> 0 bytes .../contourpy/_contourpy.cp311-win_amd64.pyd | Bin 395776 -> 0 bytes .../site-packages/contourpy/_contourpy.pyi | 197 - .venv/Lib/site-packages/contourpy/_version.py | 1 - .venv/Lib/site-packages/contourpy/array.py | 261 - .venv/Lib/site-packages/contourpy/chunk.py | 95 - .venv/Lib/site-packages/contourpy/convert.py | 555 - .venv/Lib/site-packages/contourpy/dechunk.py | 144 - .../Lib/site-packages/contourpy/enum_util.py | 57 - .venv/Lib/site-packages/contourpy/py.typed | 0 .../Lib/site-packages/contourpy/typecheck.py | 203 - .venv/Lib/site-packages/contourpy/types.py | 13 - .../site-packages/contourpy/util/__init__.py | 5 - .../util/__pycache__/__init__.cpython-311.pyc | Bin 414 -> 0 bytes .../__pycache__/_build_config.cpython-311.pyc | Bin 2269 -> 0 bytes .../bokeh_renderer.cpython-311.pyc | Bin 19600 -> 0 bytes .../__pycache__/bokeh_util.cpython-311.pyc | Bin 4226 -> 0 bytes .../util/__pycache__/data.cpython-311.pyc | Bin 4374 -> 0 bytes .../__pycache__/mpl_renderer.cpython-311.pyc | Bin 28491 -> 0 bytes .../util/__pycache__/mpl_util.cpython-311.pyc | Bin 6064 -> 0 bytes .../util/__pycache__/renderer.cpython-311.pyc | Bin 4354 -> 0 bytes .../contourpy/util/_build_config.py | 60 - .../contourpy/util/bokeh_renderer.py | 336 - .../contourpy/util/bokeh_util.py | 74 - .../Lib/site-packages/contourpy/util/data.py | 78 - .../contourpy/util/mpl_renderer.py | 534 - .../site-packages/contourpy/util/mpl_util.py | 76 - .../site-packages/contourpy/util/renderer.py | 106 - .../customtkinter-5.2.2.dist-info/INSTALLER | 1 - .../customtkinter-5.2.2.dist-info/LICENSE | 21 - .../customtkinter-5.2.2.dist-info/METADATA | 18 - .../customtkinter-5.2.2.dist-info/RECORD | 102 - .../customtkinter-5.2.2.dist-info/REQUESTED | 0 .../customtkinter-5.2.2.dist-info/WHEEL | 5 - .../top_level.txt | 1 - .../site-packages/customtkinter/__init__.py | 88 - .../__pycache__/__init__.cpython-311.pyc | Bin 4239 -> 0 bytes .../customtkinter/assets/.DS_Store | Bin 6148 -> 0 bytes .../fonts/CustomTkinter_shapes_font.otf | Bin 3528 -> 0 bytes .../assets/fonts/Roboto/Roboto-Medium.ttf | Bin 168644 -> 0 bytes .../assets/fonts/Roboto/Roboto-Regular.ttf | Bin 168260 -> 0 bytes .../customtkinter/assets/icons/.DS_Store | Bin 6148 -> 0 bytes .../icons/CustomTkinter_icon_Windows.ico | Bin 13238 -> 0 bytes .../customtkinter/assets/themes/blue.json | 155 - .../assets/themes/dark-blue.json | 155 - .../customtkinter/assets/themes/green.json | 155 - .../customtkinter/windows/__init__.py | 3 - .../__pycache__/__init__.cpython-311.pyc | Bin 438 -> 0 bytes .../ctk_input_dialog.cpython-311.pyc | Bin 8126 -> 0 bytes .../__pycache__/ctk_tk.cpython-311.pyc | Bin 21407 -> 0 bytes .../__pycache__/ctk_toplevel.cpython-311.pyc | Bin 21399 -> 0 bytes .../customtkinter/windows/ctk_input_dialog.py | 117 - .../customtkinter/windows/ctk_tk.py | 333 - .../customtkinter/windows/ctk_toplevel.py | 307 - .../customtkinter/windows/widgets/__init__.py | 16 - .../__pycache__/__init__.cpython-311.pyc | Bin 1299 -> 0 bytes .../__pycache__/ctk_button.cpython-311.pyc | Bin 33778 -> 0 bytes .../__pycache__/ctk_checkbox.cpython-311.pyc | Bin 28996 -> 0 bytes .../__pycache__/ctk_combobox.cpython-311.pyc | Bin 28000 -> 0 bytes .../__pycache__/ctk_entry.cpython-311.pyc | Bin 25678 -> 0 bytes .../__pycache__/ctk_frame.cpython-311.pyc | Bin 12385 -> 0 bytes .../__pycache__/ctk_label.cpython-311.pyc | Bin 18580 -> 0 bytes .../ctk_optionmenu.cpython-311.pyc | Bin 26566 -> 0 bytes .../ctk_progressbar.cpython-311.pyc | Bin 18035 -> 0 bytes .../ctk_radiobutton.cpython-311.pyc | Bin 26338 -> 0 bytes .../ctk_scrollable_frame.cpython-311.pyc | Bin 23814 -> 0 bytes .../__pycache__/ctk_scrollbar.cpython-311.pyc | Bin 17411 -> 0 bytes .../ctk_segmented_button.cpython-311.pyc | Bin 28209 -> 0 bytes .../__pycache__/ctk_slider.cpython-311.pyc | Bin 23953 -> 0 bytes .../__pycache__/ctk_switch.cpython-311.pyc | Bin 29165 -> 0 bytes .../__pycache__/ctk_tabview.cpython-311.pyc | Bin 28477 -> 0 bytes .../__pycache__/ctk_textbox.cpython-311.pyc | Bin 34104 -> 0 bytes .../widgets/appearance_mode/__init__.py | 4 - .../__pycache__/__init__.cpython-311.pyc | Bin 525 -> 0 bytes ...appearance_mode_base_class.cpython-311.pyc | Bin 4659 -> 0 bytes .../appearance_mode_tracker.cpython-311.pyc | Bin 5760 -> 0 bytes .../appearance_mode_base_class.py | 61 - .../appearance_mode_tracker.py | 122 - .../widgets/core_rendering/__init__.py | 12 - .../__pycache__/__init__.cpython-311.pyc | Bin 665 -> 0 bytes .../__pycache__/ctk_canvas.cpython-311.pyc | Bin 8530 -> 0 bytes .../__pycache__/draw_engine.cpython-311.pyc | Bin 80857 -> 0 bytes .../widgets/core_rendering/ctk_canvas.py | 117 - .../widgets/core_rendering/draw_engine.py | 1235 - .../widgets/core_widget_classes/__init__.py | 2 - .../__pycache__/__init__.cpython-311.pyc | Bin 414 -> 0 bytes .../ctk_base_class.cpython-311.pyc | Bin 21387 -> 0 bytes .../__pycache__/dropdown_menu.cpython-311.pyc | Bin 13723 -> 0 bytes .../core_widget_classes/ctk_base_class.py | 326 - .../core_widget_classes/dropdown_menu.py | 198 - .../windows/widgets/ctk_button.py | 594 - .../windows/widgets/ctk_checkbox.py | 469 - .../windows/widgets/ctk_combobox.py | 424 - .../windows/widgets/ctk_entry.py | 384 - .../windows/widgets/ctk_frame.py | 196 - .../windows/widgets/ctk_label.py | 291 - .../windows/widgets/ctk_optionmenu.py | 426 - .../windows/widgets/ctk_progressbar.py | 312 - .../windows/widgets/ctk_radiobutton.py | 430 - .../windows/widgets/ctk_scrollable_frame.py | 316 - .../windows/widgets/ctk_scrollbar.py | 281 - .../windows/widgets/ctk_segmented_button.py | 447 - .../windows/widgets/ctk_slider.py | 413 - .../windows/widgets/ctk_switch.py | 483 - .../windows/widgets/ctk_tabview.py | 433 - .../windows/widgets/ctk_textbox.py | 500 - .../windows/widgets/font/__init__.py | 24 - .../font/__pycache__/__init__.cpython-311.pyc | Bin 1919 -> 0 bytes .../font/__pycache__/ctk_font.cpython-311.pyc | Bin 6684 -> 0 bytes .../__pycache__/font_manager.cpython-311.pyc | Bin 4074 -> 0 bytes .../windows/widgets/font/ctk_font.py | 94 - .../windows/widgets/font/font_manager.py | 66 - .../windows/widgets/image/__init__.py | 1 - .../__pycache__/__init__.cpython-311.pyc | Bin 325 -> 0 bytes .../__pycache__/ctk_image.cpython-311.pyc | Bin 7638 -> 0 bytes .../windows/widgets/image/ctk_image.py | 122 - .../windows/widgets/scaling/__init__.py | 7 - .../__pycache__/__init__.cpython-311.pyc | Bin 734 -> 0 bytes .../scaling_base_class.cpython-311.pyc | Bin 11210 -> 0 bytes .../scaling_tracker.cpython-311.pyc | Bin 9868 -> 0 bytes .../widgets/scaling/scaling_base_class.py | 159 - .../widgets/scaling/scaling_tracker.py | 206 - .../windows/widgets/theme/__init__.py | 9 - .../__pycache__/__init__.cpython-311.pyc | Bin 831 -> 0 bytes .../__pycache__/theme_manager.cpython-311.pyc | Bin 4160 -> 0 bytes .../windows/widgets/theme/theme_manager.py | 55 - .../windows/widgets/utility/__init__.py | 1 - .../__pycache__/__init__.cpython-311.pyc | Bin 382 -> 0 bytes .../utility_functions.cpython-311.pyc | Bin 1450 -> 0 bytes .../widgets/utility/utility_functions.py | 22 - .../cycler-0.12.1.dist-info/INSTALLER | 1 - .../cycler-0.12.1.dist-info/LICENSE | 27 - .../cycler-0.12.1.dist-info/METADATA | 78 - .../cycler-0.12.1.dist-info/RECORD | 9 - .../cycler-0.12.1.dist-info/WHEEL | 5 - .../cycler-0.12.1.dist-info/top_level.txt | 1 - .venv/Lib/site-packages/cycler/__init__.py | 573 - .../__pycache__/__init__.cpython-311.pyc | Bin 25692 -> 0 bytes .venv/Lib/site-packages/cycler/py.typed | 0 .../darkdetect-0.8.0.dist-info/INSTALLER | 1 - .../darkdetect-0.8.0.dist-info/LICENSE | 24 - .../darkdetect-0.8.0.dist-info/METADATA | 87 - .../darkdetect-0.8.0.dist-info/RECORD | 18 - .../darkdetect-0.8.0.dist-info/WHEEL | 5 - .../darkdetect-0.8.0.dist-info/top_level.txt | 1 - .../Lib/site-packages/darkdetect/__init__.py | 44 - .../Lib/site-packages/darkdetect/__main__.py | 9 - .../__pycache__/__init__.cpython-311.pyc | Bin 1705 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 446 -> 0 bytes .../__pycache__/_dummy.cpython-311.pyc | Bin 880 -> 0 bytes .../__pycache__/_linux_detect.cpython-311.pyc | Bin 2467 -> 0 bytes .../__pycache__/_mac_detect.cpython-311.pyc | Bin 6793 -> 0 bytes .../_windows_detect.cpython-311.pyc | Bin 5307 -> 0 bytes .venv/Lib/site-packages/darkdetect/_dummy.py | 19 - .../site-packages/darkdetect/_linux_detect.py | 45 - .../site-packages/darkdetect/_mac_detect.py | 124 - .../darkdetect/_windows_detect.py | 122 - .venv/Lib/site-packages/dateutil/__init__.py | 24 - .../__pycache__/__init__.cpython-311.pyc | Bin 1441 -> 0 bytes .../__pycache__/_common.cpython-311.pyc | Bin 2057 -> 0 bytes .../__pycache__/_version.cpython-311.pyc | Bin 358 -> 0 bytes .../__pycache__/easter.cpython-311.pyc | Bin 2983 -> 0 bytes .../__pycache__/relativedelta.cpython-311.pyc | Bin 26608 -> 0 bytes .../__pycache__/rrule.cpython-311.pyc | Bin 74106 -> 0 bytes .../__pycache__/tzwin.cpython-311.pyc | Bin 270 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 2739 -> 0 bytes .venv/Lib/site-packages/dateutil/_common.py | 43 - .venv/Lib/site-packages/dateutil/_version.py | 4 - .venv/Lib/site-packages/dateutil/easter.py | 89 - .../site-packages/dateutil/parser/__init__.py | 61 - .../__pycache__/__init__.cpython-311.pyc | Bin 3195 -> 0 bytes .../__pycache__/_parser.cpython-311.pyc | Bin 69846 -> 0 bytes .../__pycache__/isoparser.cpython-311.pyc | Bin 17402 -> 0 bytes .../site-packages/dateutil/parser/_parser.py | 1613 - .../dateutil/parser/isoparser.py | 416 - .../site-packages/dateutil/relativedelta.py | 599 - .venv/Lib/site-packages/dateutil/rrule.py | 1737 - .../Lib/site-packages/dateutil/tz/__init__.py | 12 - .../tz/__pycache__/__init__.cpython-311.pyc | Bin 864 -> 0 bytes .../tz/__pycache__/_common.cpython-311.pyc | Bin 15302 -> 0 bytes .../tz/__pycache__/_factories.cpython-311.pyc | Bin 5261 -> 0 bytes .../tz/__pycache__/tz.cpython-311.pyc | Bin 70540 -> 0 bytes .../tz/__pycache__/win.cpython-311.pyc | Bin 18450 -> 0 bytes .../Lib/site-packages/dateutil/tz/_common.py | 419 - .../site-packages/dateutil/tz/_factories.py | 80 - .venv/Lib/site-packages/dateutil/tz/tz.py | 1849 - .venv/Lib/site-packages/dateutil/tz/win.py | 370 - .venv/Lib/site-packages/dateutil/tzwin.py | 2 - .venv/Lib/site-packages/dateutil/utils.py | 71 - .../dateutil/zoneinfo/__init__.py | 167 - .../__pycache__/__init__.cpython-311.pyc | Bin 8516 -> 0 bytes .../__pycache__/rebuild.cpython-311.pyc | Bin 4686 -> 0 bytes .../zoneinfo/dateutil-zoneinfo.tar.gz | Bin 156400 -> 0 bytes .../dateutil/zoneinfo/rebuild.py | 75 - .../site-packages/distutils-precedence.pth | 1 - .venv/Lib/site-packages/fontTools/__init__.py | 8 - .venv/Lib/site-packages/fontTools/__main__.py | 35 - .../__pycache__/__init__.cpython-311.pyc | Bin 514 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 1350 -> 0 bytes .../__pycache__/afmLib.cpython-311.pyc | Bin 18904 -> 0 bytes .../fontTools/__pycache__/agl.cpython-311.pyc | Bin 114276 -> 0 bytes .../__pycache__/fontBuilder.cpython-311.pyc | Bin 38663 -> 0 bytes .../__pycache__/help.cpython-311.pyc | Bin 2302 -> 0 bytes .../__pycache__/tfmLib.cpython-311.pyc | Bin 19679 -> 0 bytes .../fontTools/__pycache__/ttx.cpython-311.pyc | Bin 20198 -> 0 bytes .../__pycache__/unicode.cpython-311.pyc | Bin 2835 -> 0 bytes .venv/Lib/site-packages/fontTools/afmLib.py | 439 - .venv/Lib/site-packages/fontTools/agl.py | 5233 -- .../fontTools/cffLib/__init__.py | 3829 -- .../__pycache__/__init__.cpython-311.pyc | Bin 145452 -> 0 bytes .../__pycache__/specializer.cpython-311.pyc | Bin 33326 -> 0 bytes .../cffLib/__pycache__/width.cpython-311.pyc | Bin 11489 -> 0 bytes .../fontTools/cffLib/specializer.py | 849 - .../site-packages/fontTools/cffLib/width.py | 207 - .../fontTools/colorLib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 252 -> 0 bytes .../__pycache__/builder.cpython-311.pyc | Bin 33679 -> 0 bytes .../__pycache__/errors.cpython-311.pyc | Bin 488 -> 0 bytes .../__pycache__/geometry.cpython-311.pyc | Bin 5943 -> 0 bytes .../__pycache__/table_builder.cpython-311.pyc | Bin 11813 -> 0 bytes .../__pycache__/unbuilder.cpython-311.pyc | Bin 4301 -> 0 bytes .../fontTools/colorLib/builder.py | 664 - .../fontTools/colorLib/errors.py | 2 - .../fontTools/colorLib/geometry.py | 143 - .../fontTools/colorLib/table_builder.py | 223 - .../fontTools/colorLib/unbuilder.py | 81 - .../fontTools/config/__init__.py | 75 - .../__pycache__/__init__.cpython-311.pyc | Bin 3421 -> 0 bytes .../site-packages/fontTools/cu2qu/__init__.py | 15 - .../site-packages/fontTools/cu2qu/__main__.py | 6 - .../__pycache__/__init__.cpython-311.pyc | Bin 281 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 457 -> 0 bytes .../__pycache__/benchmark.cpython-311.pyc | Bin 3549 -> 0 bytes .../cu2qu/__pycache__/cli.cpython-311.pyc | Bin 9844 -> 0 bytes .../cu2qu/__pycache__/cu2qu.cpython-311.pyc | Bin 22781 -> 0 bytes .../cu2qu/__pycache__/errors.cpython-311.pyc | Bin 5897 -> 0 bytes .../cu2qu/__pycache__/ufo.cpython-311.pyc | Bin 17155 -> 0 bytes .../fontTools/cu2qu/benchmark.py | 55 - .../Lib/site-packages/fontTools/cu2qu/cli.py | 198 - .../Lib/site-packages/fontTools/cu2qu/cu2qu.c | 14915 ------ .../fontTools/cu2qu/cu2qu.cp311-win_amd64.pyd | Bin 104448 -> 0 bytes .../site-packages/fontTools/cu2qu/cu2qu.py | 534 - .../site-packages/fontTools/cu2qu/errors.py | 77 - .../Lib/site-packages/fontTools/cu2qu/ufo.py | 349 - .../fontTools/designspaceLib/__init__.py | 3337 -- .../fontTools/designspaceLib/__main__.py | 6 - .../__pycache__/__init__.cpython-311.pyc | Bin 138871 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 482 -> 0 bytes .../__pycache__/split.cpython-311.pyc | Bin 18857 -> 0 bytes .../__pycache__/statNames.cpython-311.pyc | Bin 9970 -> 0 bytes .../__pycache__/types.cpython-311.pyc | Bin 6901 -> 0 bytes .../fontTools/designspaceLib/split.py | 475 - .../fontTools/designspaceLib/statNames.py | 253 - .../fontTools/designspaceLib/types.py | 147 - .../fontTools/encodings/MacRoman.py | 258 - .../fontTools/encodings/StandardEncoding.py | 258 - .../fontTools/encodings/__init__.py | 1 - .../__pycache__/MacRoman.cpython-311.pyc | Bin 2312 -> 0 bytes .../StandardEncoding.cpython-311.pyc | Bin 1904 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 335 -> 0 bytes .../__pycache__/codecs.cpython-311.pyc | Bin 6420 -> 0 bytes .../fontTools/encodings/codecs.py | 135 - .../fontTools/feaLib/__init__.py | 4 - .../fontTools/feaLib/__main__.py | 78 - .../__pycache__/__init__.cpython-311.pyc | Bin 334 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 3698 -> 0 bytes .../feaLib/__pycache__/ast.cpython-311.pyc | Bin 133874 -> 0 bytes .../__pycache__/builder.cpython-311.pyc | Bin 88105 -> 0 bytes .../feaLib/__pycache__/error.cpython-311.pyc | Bin 1675 -> 0 bytes .../feaLib/__pycache__/lexer.cpython-311.pyc | Bin 15776 -> 0 bytes .../__pycache__/location.cpython-311.pyc | Bin 939 -> 0 bytes .../lookupDebugInfo.cpython-311.pyc | Bin 872 -> 0 bytes .../feaLib/__pycache__/parser.cpython-311.pyc | Bin 120726 -> 0 bytes .../variableScalar.cpython-311.pyc | Bin 9185 -> 0 bytes .../Lib/site-packages/fontTools/feaLib/ast.py | 2134 - .../site-packages/fontTools/feaLib/builder.py | 1714 - .../site-packages/fontTools/feaLib/error.py | 22 - .../site-packages/fontTools/feaLib/lexer.c | 17993 ------- .../feaLib/lexer.cp311-win_amd64.pyd | Bin 140800 -> 0 bytes .../site-packages/fontTools/feaLib/lexer.py | 287 - .../fontTools/feaLib/location.py | 12 - .../fontTools/feaLib/lookupDebugInfo.py | 12 - .../site-packages/fontTools/feaLib/parser.py | 2359 - .../fontTools/feaLib/variableScalar.py | 112 - .../site-packages/fontTools/fontBuilder.py | 993 - .venv/Lib/site-packages/fontTools/help.py | 35 - .../site-packages/fontTools/merge/__init__.py | 248 - .../site-packages/fontTools/merge/__main__.py | 6 - .../__pycache__/__init__.cpython-311.pyc | Bin 13685 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 464 -> 0 bytes .../merge/__pycache__/base.cpython-311.pyc | Bin 4574 -> 0 bytes .../merge/__pycache__/cmap.cpython-311.pyc | Bin 5927 -> 0 bytes .../merge/__pycache__/layout.cpython-311.pyc | Bin 24549 -> 0 bytes .../merge/__pycache__/options.cpython-311.pyc | Bin 4030 -> 0 bytes .../merge/__pycache__/tables.cpython-311.pyc | Bin 13669 -> 0 bytes .../merge/__pycache__/unicode.cpython-311.pyc | Bin 2120 -> 0 bytes .../merge/__pycache__/util.cpython-311.pyc | Bin 9089 -> 0 bytes .../Lib/site-packages/fontTools/merge/base.py | 81 - .../Lib/site-packages/fontTools/merge/cmap.py | 141 - .../site-packages/fontTools/merge/layout.py | 526 - .../site-packages/fontTools/merge/options.py | 85 - .../site-packages/fontTools/merge/tables.py | 339 - .../site-packages/fontTools/merge/unicode.py | 78 - .../Lib/site-packages/fontTools/merge/util.py | 143 - .../site-packages/fontTools/misc/__init__.py | 1 - .../misc/__pycache__/__init__.cpython-311.pyc | Bin 330 -> 0 bytes .../__pycache__/arrayTools.cpython-311.pyc | Bin 16489 -> 0 bytes .../__pycache__/bezierTools.cpython-311.pyc | Bin 60517 -> 0 bytes .../__pycache__/classifyTools.cpython-311.pyc | Bin 7366 -> 0 bytes .../misc/__pycache__/cliTools.cpython-311.pyc | Bin 2735 -> 0 bytes .../__pycache__/configTools.cpython-311.pyc | Bin 17630 -> 0 bytes .../misc/__pycache__/cython.cpython-311.pyc | Bin 1285 -> 0 bytes .../__pycache__/dictTools.cpython-311.pyc | Bin 4297 -> 0 bytes .../misc/__pycache__/eexec.cpython-311.pyc | Bin 4813 -> 0 bytes .../__pycache__/encodingTools.cpython-311.pyc | Bin 2018 -> 0 bytes .../misc/__pycache__/etree.cpython-311.pyc | Bin 18434 -> 0 bytes .../__pycache__/filenames.cpython-311.pyc | Bin 9287 -> 0 bytes .../__pycache__/fixedTools.cpython-311.pyc | Bin 8825 -> 0 bytes .../misc/__pycache__/intTools.cpython-311.pyc | Bin 1253 -> 0 bytes .../__pycache__/loggingTools.cpython-311.pyc | Bin 26321 -> 0 bytes .../macCreatorType.cpython-311.pyc | Bin 2823 -> 0 bytes .../misc/__pycache__/macRes.cpython-311.pyc | Bin 14341 -> 0 bytes .../__pycache__/psCharStrings.cpython-311.pyc | Bin 68615 -> 0 bytes .../misc/__pycache__/psLib.cpython-311.pyc | Bin 18958 -> 0 bytes .../__pycache__/psOperators.cpython-311.pyc | Bin 34882 -> 0 bytes .../misc/__pycache__/py23.cpython-311.pyc | Bin 3218 -> 0 bytes .../__pycache__/roundTools.cpython-311.pyc | Bin 4316 -> 0 bytes .../misc/__pycache__/sstruct.cpython-311.pyc | Bin 9223 -> 0 bytes .../misc/__pycache__/symfont.cpython-311.pyc | Bin 15841 -> 0 bytes .../__pycache__/testTools.cpython-311.pyc | Bin 14527 -> 0 bytes .../__pycache__/textTools.cpython-311.pyc | Bin 7906 -> 0 bytes .../__pycache__/timeTools.cpython-311.pyc | Bin 4013 -> 0 bytes .../__pycache__/transform.cpython-311.pyc | Bin 19858 -> 0 bytes .../__pycache__/treeTools.cpython-311.pyc | Bin 2129 -> 0 bytes .../misc/__pycache__/vector.cpython-311.pyc | Bin 10269 -> 0 bytes .../misc/__pycache__/visitor.cpython-311.pyc | Bin 7777 -> 0 bytes .../__pycache__/xmlReader.cpython-311.pyc | Bin 9498 -> 0 bytes .../__pycache__/xmlWriter.cpython-311.pyc | Bin 11149 -> 0 bytes .../fontTools/misc/arrayTools.py | 424 - .../fontTools/misc/bezierTools.c | 41588 ---------------- .../misc/bezierTools.cp311-win_amd64.pyd | Bin 384512 -> 0 bytes .../fontTools/misc/bezierTools.py | 1490 - .../fontTools/misc/classifyTools.py | 170 - .../site-packages/fontTools/misc/cliTools.py | 53 - .../fontTools/misc/configTools.py | 349 - .../site-packages/fontTools/misc/cython.py | 27 - .../site-packages/fontTools/misc/dictTools.py | 83 - .../Lib/site-packages/fontTools/misc/eexec.py | 119 - .../fontTools/misc/encodingTools.py | 72 - .../Lib/site-packages/fontTools/misc/etree.py | 479 - .../site-packages/fontTools/misc/filenames.py | 245 - .../fontTools/misc/fixedTools.py | 253 - .../site-packages/fontTools/misc/intTools.py | 25 - .../fontTools/misc/loggingTools.py | 543 - .../fontTools/misc/macCreatorType.py | 56 - .../site-packages/fontTools/misc/macRes.py | 261 - .../fontTools/misc/plistlib/__init__.py | 681 - .../__pycache__/__init__.cpython-311.pyc | Bin 29207 -> 0 bytes .../fontTools/misc/plistlib/py.typed | 0 .../fontTools/misc/psCharStrings.py | 1476 - .../Lib/site-packages/fontTools/misc/psLib.py | 398 - .../fontTools/misc/psOperators.py | 572 - 590 files changed, 166048 deletions(-) delete mode 100644 .venv/.gitignore delete mode 100644 .venv/Lib/site-packages/PIL/BdfFontFile.py delete mode 100644 .venv/Lib/site-packages/PIL/BlpImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/BmpImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/BufrStubImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/ContainerIO.py delete mode 100644 .venv/Lib/site-packages/PIL/CurImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/DcxImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/DdsImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/EpsImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/ExifTags.py delete mode 100644 .venv/Lib/site-packages/PIL/FitsImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/FliImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/FontFile.py delete mode 100644 .venv/Lib/site-packages/PIL/FpxImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/FtexImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/GbrImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/GdImageFile.py delete mode 100644 .venv/Lib/site-packages/PIL/GifImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/GimpGradientFile.py delete mode 100644 .venv/Lib/site-packages/PIL/GimpPaletteFile.py delete mode 100644 .venv/Lib/site-packages/PIL/GribStubImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/Hdf5StubImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/IcnsImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/IcoImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/ImImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/Image.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageChops.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageCms.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageColor.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageDraw.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageDraw2.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageEnhance.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageFile.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageFilter.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageFont.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageGrab.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageMath.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageMode.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageMorph.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageOps.py delete mode 100644 .venv/Lib/site-packages/PIL/ImagePalette.py delete mode 100644 .venv/Lib/site-packages/PIL/ImagePath.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageQt.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageSequence.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageShow.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageStat.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageTk.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageTransform.py delete mode 100644 .venv/Lib/site-packages/PIL/ImageWin.py delete mode 100644 .venv/Lib/site-packages/PIL/ImtImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/IptcImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/Jpeg2KImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/JpegImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/JpegPresets.py delete mode 100644 .venv/Lib/site-packages/PIL/McIdasImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/MicImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/MpegImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/MpoImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/MspImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/PSDraw.py delete mode 100644 .venv/Lib/site-packages/PIL/PaletteFile.py delete mode 100644 .venv/Lib/site-packages/PIL/PalmImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/PcdImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/PcfFontFile.py delete mode 100644 .venv/Lib/site-packages/PIL/PcxImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/PdfImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/PdfParser.py delete mode 100644 .venv/Lib/site-packages/PIL/PixarImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/PngImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/PpmImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/PsdImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/PyAccess.py delete mode 100644 .venv/Lib/site-packages/PIL/QoiImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/SgiImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/SpiderImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/SunImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/TarIO.py delete mode 100644 .venv/Lib/site-packages/PIL/TgaImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/TiffImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/TiffTags.py delete mode 100644 .venv/Lib/site-packages/PIL/WalImageFile.py delete mode 100644 .venv/Lib/site-packages/PIL/WebPImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/WmfImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/XVThumbImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/XbmImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/XpmImagePlugin.py delete mode 100644 .venv/Lib/site-packages/PIL/__init__.py delete mode 100644 .venv/Lib/site-packages/PIL/__main__.py delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/BdfFontFile.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ContainerIO.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/CurImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ExifTags.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/FliImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/FontFile.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/GdImageFile.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/GifImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/GimpGradientFile.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/Image.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageChops.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageCms.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageColor.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageDraw.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageDraw2.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageEnhance.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageFile.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageFilter.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageFont.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageGrab.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageMath.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageMode.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageMorph.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageOps.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImagePalette.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImagePath.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageQt.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageSequence.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageShow.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageStat.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageTk.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageTransform.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImageWin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/JpegPresets.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/MicImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/MspImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/PSDraw.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/PaletteFile.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/PcfFontFile.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/PdfParser.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/PngImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/PyAccess.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/SunImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/TarIO.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/TiffTags.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/WalImageFile.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/__main__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/_binary.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/_deprecate.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/_tkinter_finder.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/_typing.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/_util.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/_version.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/features.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/__pycache__/report.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/PIL/_binary.py delete mode 100644 .venv/Lib/site-packages/PIL/_deprecate.py delete mode 100644 .venv/Lib/site-packages/PIL/_imaging.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/PIL/_imaging.pyi delete mode 100644 .venv/Lib/site-packages/PIL/_imagingcms.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/PIL/_imagingcms.pyi delete mode 100644 .venv/Lib/site-packages/PIL/_imagingft.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/PIL/_imagingft.pyi delete mode 100644 .venv/Lib/site-packages/PIL/_imagingmath.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/PIL/_imagingmath.pyi delete mode 100644 .venv/Lib/site-packages/PIL/_imagingmorph.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/PIL/_imagingmorph.pyi delete mode 100644 .venv/Lib/site-packages/PIL/_imagingtk.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/PIL/_tkinter_finder.py delete mode 100644 .venv/Lib/site-packages/PIL/_typing.py delete mode 100644 .venv/Lib/site-packages/PIL/_util.py delete mode 100644 .venv/Lib/site-packages/PIL/_version.py delete mode 100644 .venv/Lib/site-packages/PIL/_webp.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/PIL/_webp.pyi delete mode 100644 .venv/Lib/site-packages/PIL/features.py delete mode 100644 .venv/Lib/site-packages/PIL/py.typed delete mode 100644 .venv/Lib/site-packages/PIL/report.py delete mode 100644 .venv/Lib/site-packages/__pycache__/pylab.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/__pycache__/six.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/_distutils_hack/__init__.py delete mode 100644 .venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/_distutils_hack/override.py delete mode 100644 .venv/Lib/site-packages/contourpy-1.2.1.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/contourpy-1.2.1.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/contourpy-1.2.1.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/contourpy-1.2.1.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/contourpy-1.2.1.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/contourpy/__init__.py delete mode 100644 .venv/Lib/site-packages/contourpy/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/contourpy/__pycache__/_version.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/contourpy/__pycache__/array.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/contourpy/__pycache__/chunk.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/contourpy/__pycache__/convert.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/contourpy/__pycache__/dechunk.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/contourpy/__pycache__/enum_util.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/contourpy/__pycache__/typecheck.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/contourpy/__pycache__/types.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/contourpy/_contourpy.cp311-win_amd64.lib delete mode 100644 .venv/Lib/site-packages/contourpy/_contourpy.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/contourpy/_contourpy.pyi delete mode 100644 .venv/Lib/site-packages/contourpy/_version.py delete mode 100644 .venv/Lib/site-packages/contourpy/array.py delete mode 100644 .venv/Lib/site-packages/contourpy/chunk.py delete mode 100644 .venv/Lib/site-packages/contourpy/convert.py delete mode 100644 .venv/Lib/site-packages/contourpy/dechunk.py delete mode 100644 .venv/Lib/site-packages/contourpy/enum_util.py delete mode 100644 .venv/Lib/site-packages/contourpy/py.typed delete mode 100644 .venv/Lib/site-packages/contourpy/typecheck.py delete mode 100644 .venv/Lib/site-packages/contourpy/types.py delete mode 100644 .venv/Lib/site-packages/contourpy/util/__init__.py delete mode 100644 .venv/Lib/site-packages/contourpy/util/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/contourpy/util/__pycache__/_build_config.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/contourpy/util/__pycache__/bokeh_renderer.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/contourpy/util/__pycache__/bokeh_util.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/contourpy/util/__pycache__/data.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/contourpy/util/__pycache__/mpl_renderer.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/contourpy/util/__pycache__/mpl_util.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/contourpy/util/__pycache__/renderer.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/contourpy/util/_build_config.py delete mode 100644 .venv/Lib/site-packages/contourpy/util/bokeh_renderer.py delete mode 100644 .venv/Lib/site-packages/contourpy/util/bokeh_util.py delete mode 100644 .venv/Lib/site-packages/contourpy/util/data.py delete mode 100644 .venv/Lib/site-packages/contourpy/util/mpl_renderer.py delete mode 100644 .venv/Lib/site-packages/contourpy/util/mpl_util.py delete mode 100644 .venv/Lib/site-packages/contourpy/util/renderer.py delete mode 100644 .venv/Lib/site-packages/customtkinter-5.2.2.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/customtkinter-5.2.2.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/customtkinter-5.2.2.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/customtkinter-5.2.2.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/customtkinter-5.2.2.dist-info/REQUESTED delete mode 100644 .venv/Lib/site-packages/customtkinter-5.2.2.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/customtkinter-5.2.2.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/customtkinter/__init__.py delete mode 100644 .venv/Lib/site-packages/customtkinter/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/assets/.DS_Store delete mode 100644 .venv/Lib/site-packages/customtkinter/assets/fonts/CustomTkinter_shapes_font.otf delete mode 100644 .venv/Lib/site-packages/customtkinter/assets/fonts/Roboto/Roboto-Medium.ttf delete mode 100644 .venv/Lib/site-packages/customtkinter/assets/fonts/Roboto/Roboto-Regular.ttf delete mode 100644 .venv/Lib/site-packages/customtkinter/assets/icons/.DS_Store delete mode 100644 .venv/Lib/site-packages/customtkinter/assets/icons/CustomTkinter_icon_Windows.ico delete mode 100644 .venv/Lib/site-packages/customtkinter/assets/themes/blue.json delete mode 100644 .venv/Lib/site-packages/customtkinter/assets/themes/dark-blue.json delete mode 100644 .venv/Lib/site-packages/customtkinter/assets/themes/green.json delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/__init__.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/__pycache__/ctk_input_dialog.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/__pycache__/ctk_tk.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/__pycache__/ctk_toplevel.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/ctk_input_dialog.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/ctk_tk.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/ctk_toplevel.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__init__.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_button.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_checkbox.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_combobox.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_entry.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_frame.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_label.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_optionmenu.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_progressbar.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_radiobutton.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_scrollable_frame.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_scrollbar.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_segmented_button.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_slider.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_switch.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_tabview.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_textbox.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/__init__.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/__pycache__/appearance_mode_base_class.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/__pycache__/appearance_mode_tracker.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/appearance_mode_base_class.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/appearance_mode_tracker.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/__init__.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/__pycache__/ctk_canvas.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/__pycache__/draw_engine.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/ctk_canvas.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/draw_engine.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/__init__.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/__pycache__/ctk_base_class.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/__pycache__/dropdown_menu.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/ctk_base_class.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/dropdown_menu.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/ctk_button.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/ctk_checkbox.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/ctk_combobox.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/ctk_entry.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/ctk_frame.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/ctk_label.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/ctk_optionmenu.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/ctk_progressbar.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/ctk_radiobutton.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/ctk_scrollable_frame.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/ctk_scrollbar.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/ctk_segmented_button.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/ctk_slider.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/ctk_switch.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/ctk_tabview.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/ctk_textbox.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/font/__init__.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/font/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/font/__pycache__/ctk_font.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/font/__pycache__/font_manager.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/font/ctk_font.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/font/font_manager.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/image/__init__.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/image/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/image/__pycache__/ctk_image.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/image/ctk_image.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/scaling/__init__.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/scaling/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/scaling/__pycache__/scaling_base_class.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/scaling/__pycache__/scaling_tracker.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/scaling/scaling_base_class.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/scaling/scaling_tracker.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/theme/__init__.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/theme/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/theme/__pycache__/theme_manager.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/theme/theme_manager.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/utility/__init__.py delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/utility/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/utility/__pycache__/utility_functions.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/customtkinter/windows/widgets/utility/utility_functions.py delete mode 100644 .venv/Lib/site-packages/cycler-0.12.1.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/cycler-0.12.1.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/cycler-0.12.1.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/cycler-0.12.1.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/cycler-0.12.1.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/cycler-0.12.1.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/cycler/__init__.py delete mode 100644 .venv/Lib/site-packages/cycler/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/cycler/py.typed delete mode 100644 .venv/Lib/site-packages/darkdetect-0.8.0.dist-info/INSTALLER delete mode 100644 .venv/Lib/site-packages/darkdetect-0.8.0.dist-info/LICENSE delete mode 100644 .venv/Lib/site-packages/darkdetect-0.8.0.dist-info/METADATA delete mode 100644 .venv/Lib/site-packages/darkdetect-0.8.0.dist-info/RECORD delete mode 100644 .venv/Lib/site-packages/darkdetect-0.8.0.dist-info/WHEEL delete mode 100644 .venv/Lib/site-packages/darkdetect-0.8.0.dist-info/top_level.txt delete mode 100644 .venv/Lib/site-packages/darkdetect/__init__.py delete mode 100644 .venv/Lib/site-packages/darkdetect/__main__.py delete mode 100644 .venv/Lib/site-packages/darkdetect/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/darkdetect/__pycache__/__main__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/darkdetect/__pycache__/_dummy.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/darkdetect/__pycache__/_linux_detect.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/darkdetect/__pycache__/_mac_detect.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/darkdetect/__pycache__/_windows_detect.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/darkdetect/_dummy.py delete mode 100644 .venv/Lib/site-packages/darkdetect/_linux_detect.py delete mode 100644 .venv/Lib/site-packages/darkdetect/_mac_detect.py delete mode 100644 .venv/Lib/site-packages/darkdetect/_windows_detect.py delete mode 100644 .venv/Lib/site-packages/dateutil/__init__.py delete mode 100644 .venv/Lib/site-packages/dateutil/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/__pycache__/_common.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/__pycache__/_version.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/__pycache__/easter.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/__pycache__/relativedelta.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/__pycache__/rrule.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/__pycache__/tzwin.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/__pycache__/utils.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/_common.py delete mode 100644 .venv/Lib/site-packages/dateutil/_version.py delete mode 100644 .venv/Lib/site-packages/dateutil/easter.py delete mode 100644 .venv/Lib/site-packages/dateutil/parser/__init__.py delete mode 100644 .venv/Lib/site-packages/dateutil/parser/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/parser/__pycache__/_parser.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/parser/__pycache__/isoparser.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/parser/_parser.py delete mode 100644 .venv/Lib/site-packages/dateutil/parser/isoparser.py delete mode 100644 .venv/Lib/site-packages/dateutil/relativedelta.py delete mode 100644 .venv/Lib/site-packages/dateutil/rrule.py delete mode 100644 .venv/Lib/site-packages/dateutil/tz/__init__.py delete mode 100644 .venv/Lib/site-packages/dateutil/tz/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/tz/__pycache__/_common.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/tz/__pycache__/_factories.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/tz/__pycache__/tz.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/tz/__pycache__/win.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/tz/_common.py delete mode 100644 .venv/Lib/site-packages/dateutil/tz/_factories.py delete mode 100644 .venv/Lib/site-packages/dateutil/tz/tz.py delete mode 100644 .venv/Lib/site-packages/dateutil/tz/win.py delete mode 100644 .venv/Lib/site-packages/dateutil/tzwin.py delete mode 100644 .venv/Lib/site-packages/dateutil/utils.py delete mode 100644 .venv/Lib/site-packages/dateutil/zoneinfo/__init__.py delete mode 100644 .venv/Lib/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz delete mode 100644 .venv/Lib/site-packages/dateutil/zoneinfo/rebuild.py delete mode 100644 .venv/Lib/site-packages/distutils-precedence.pth delete mode 100644 .venv/Lib/site-packages/fontTools/__init__.py delete mode 100644 .venv/Lib/site-packages/fontTools/__main__.py delete mode 100644 .venv/Lib/site-packages/fontTools/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/__pycache__/__main__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/__pycache__/afmLib.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/__pycache__/agl.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/__pycache__/fontBuilder.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/__pycache__/help.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/__pycache__/tfmLib.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/__pycache__/ttx.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/__pycache__/unicode.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/afmLib.py delete mode 100644 .venv/Lib/site-packages/fontTools/agl.py delete mode 100644 .venv/Lib/site-packages/fontTools/cffLib/__init__.py delete mode 100644 .venv/Lib/site-packages/fontTools/cffLib/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/cffLib/__pycache__/specializer.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/cffLib/__pycache__/width.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/cffLib/specializer.py delete mode 100644 .venv/Lib/site-packages/fontTools/cffLib/width.py delete mode 100644 .venv/Lib/site-packages/fontTools/colorLib/__init__.py delete mode 100644 .venv/Lib/site-packages/fontTools/colorLib/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/colorLib/__pycache__/builder.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/colorLib/__pycache__/errors.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/colorLib/__pycache__/geometry.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/colorLib/__pycache__/table_builder.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/colorLib/__pycache__/unbuilder.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/colorLib/builder.py delete mode 100644 .venv/Lib/site-packages/fontTools/colorLib/errors.py delete mode 100644 .venv/Lib/site-packages/fontTools/colorLib/geometry.py delete mode 100644 .venv/Lib/site-packages/fontTools/colorLib/table_builder.py delete mode 100644 .venv/Lib/site-packages/fontTools/colorLib/unbuilder.py delete mode 100644 .venv/Lib/site-packages/fontTools/config/__init__.py delete mode 100644 .venv/Lib/site-packages/fontTools/config/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/cu2qu/__init__.py delete mode 100644 .venv/Lib/site-packages/fontTools/cu2qu/__main__.py delete mode 100644 .venv/Lib/site-packages/fontTools/cu2qu/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/cu2qu/__pycache__/__main__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/cu2qu/__pycache__/benchmark.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/cu2qu/__pycache__/cli.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/cu2qu/__pycache__/cu2qu.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/cu2qu/__pycache__/errors.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/cu2qu/__pycache__/ufo.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/cu2qu/benchmark.py delete mode 100644 .venv/Lib/site-packages/fontTools/cu2qu/cli.py delete mode 100644 .venv/Lib/site-packages/fontTools/cu2qu/cu2qu.c delete mode 100644 .venv/Lib/site-packages/fontTools/cu2qu/cu2qu.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/fontTools/cu2qu/cu2qu.py delete mode 100644 .venv/Lib/site-packages/fontTools/cu2qu/errors.py delete mode 100644 .venv/Lib/site-packages/fontTools/cu2qu/ufo.py delete mode 100644 .venv/Lib/site-packages/fontTools/designspaceLib/__init__.py delete mode 100644 .venv/Lib/site-packages/fontTools/designspaceLib/__main__.py delete mode 100644 .venv/Lib/site-packages/fontTools/designspaceLib/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/designspaceLib/__pycache__/__main__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/designspaceLib/__pycache__/split.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/designspaceLib/__pycache__/statNames.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/designspaceLib/__pycache__/types.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/designspaceLib/split.py delete mode 100644 .venv/Lib/site-packages/fontTools/designspaceLib/statNames.py delete mode 100644 .venv/Lib/site-packages/fontTools/designspaceLib/types.py delete mode 100644 .venv/Lib/site-packages/fontTools/encodings/MacRoman.py delete mode 100644 .venv/Lib/site-packages/fontTools/encodings/StandardEncoding.py delete mode 100644 .venv/Lib/site-packages/fontTools/encodings/__init__.py delete mode 100644 .venv/Lib/site-packages/fontTools/encodings/__pycache__/MacRoman.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/encodings/__pycache__/StandardEncoding.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/encodings/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/encodings/__pycache__/codecs.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/encodings/codecs.py delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/__init__.py delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/__main__.py delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/__pycache__/__main__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/__pycache__/ast.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/__pycache__/builder.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/__pycache__/error.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/__pycache__/lexer.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/__pycache__/location.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/__pycache__/lookupDebugInfo.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/__pycache__/parser.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/__pycache__/variableScalar.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/ast.py delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/builder.py delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/error.py delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/lexer.c delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/lexer.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/lexer.py delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/location.py delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/lookupDebugInfo.py delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/parser.py delete mode 100644 .venv/Lib/site-packages/fontTools/feaLib/variableScalar.py delete mode 100644 .venv/Lib/site-packages/fontTools/fontBuilder.py delete mode 100644 .venv/Lib/site-packages/fontTools/help.py delete mode 100644 .venv/Lib/site-packages/fontTools/merge/__init__.py delete mode 100644 .venv/Lib/site-packages/fontTools/merge/__main__.py delete mode 100644 .venv/Lib/site-packages/fontTools/merge/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/merge/__pycache__/__main__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/merge/__pycache__/base.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/merge/__pycache__/cmap.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/merge/__pycache__/layout.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/merge/__pycache__/options.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/merge/__pycache__/tables.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/merge/__pycache__/unicode.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/merge/__pycache__/util.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/merge/base.py delete mode 100644 .venv/Lib/site-packages/fontTools/merge/cmap.py delete mode 100644 .venv/Lib/site-packages/fontTools/merge/layout.py delete mode 100644 .venv/Lib/site-packages/fontTools/merge/options.py delete mode 100644 .venv/Lib/site-packages/fontTools/merge/tables.py delete mode 100644 .venv/Lib/site-packages/fontTools/merge/unicode.py delete mode 100644 .venv/Lib/site-packages/fontTools/merge/util.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__init__.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/arrayTools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/bezierTools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/classifyTools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/cliTools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/configTools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/cython.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/dictTools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/eexec.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/encodingTools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/etree.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/filenames.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/fixedTools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/intTools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/loggingTools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/macCreatorType.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/macRes.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/psCharStrings.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/psLib.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/psOperators.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/py23.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/roundTools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/sstruct.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/symfont.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/testTools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/textTools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/timeTools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/transform.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/treeTools.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/vector.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/visitor.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/xmlReader.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/__pycache__/xmlWriter.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/arrayTools.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/bezierTools.c delete mode 100644 .venv/Lib/site-packages/fontTools/misc/bezierTools.cp311-win_amd64.pyd delete mode 100644 .venv/Lib/site-packages/fontTools/misc/bezierTools.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/classifyTools.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/cliTools.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/configTools.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/cython.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/dictTools.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/eexec.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/encodingTools.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/etree.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/filenames.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/fixedTools.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/intTools.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/loggingTools.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/macCreatorType.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/macRes.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/plistlib/__init__.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/plistlib/__pycache__/__init__.cpython-311.pyc delete mode 100644 .venv/Lib/site-packages/fontTools/misc/plistlib/py.typed delete mode 100644 .venv/Lib/site-packages/fontTools/misc/psCharStrings.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/psLib.py delete mode 100644 .venv/Lib/site-packages/fontTools/misc/psOperators.py diff --git a/.venv/.gitignore b/.venv/.gitignore deleted file mode 100644 index f59ec20..0000000 --- a/.venv/.gitignore +++ /dev/null @@ -1 +0,0 @@ -* \ No newline at end of file diff --git a/.venv/Lib/site-packages/PIL/BdfFontFile.py b/.venv/Lib/site-packages/PIL/BdfFontFile.py deleted file mode 100644 index bc1416c..0000000 --- a/.venv/Lib/site-packages/PIL/BdfFontFile.py +++ /dev/null @@ -1,133 +0,0 @@ -# -# 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. -# - -""" -Parse X Bitmap Distribution Format (BDF) -""" -from __future__ import annotations - -from typing import BinaryIO - -from . import FontFile, Image - -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: BinaryIO, -) -> ( - tuple[ - str, - int, - tuple[tuple[int, int], tuple[int, int, int, int], tuple[int, int, int, int]], - Image.Image, - ] - | None -): - # 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 = bytearray() - while True: - s = f.readline() - if not s or s[:7] == b"ENDCHAR": - break - bitmap += s[:-1] - - # The word BBX - # followed by the width in x (BBw), height in y (BBh), - # and x and y displacement (BBxoff0, BByoff0) - # of the lower left corner from the origin of the character. - width, height, x_disp, y_disp = (int(p) for p in props["BBX"].split()) - - # The word DWIDTH - # followed by the width in x and y of the character in device pixels. - dwx, dwy = (int(p) for p in props["DWIDTH"].split()) - - bbox = ( - (dwx, dwy), - (x_disp, -y_disp - height, width + x_disp, -y_disp), - (0, 0, width, height), - ) - - try: - im = Image.frombytes("1", (width, height), bitmap, "hex", "1") - except ValueError: - # deal with zero-width characters - im = Image.new("1", (width, height)) - - return id, int(props["ENCODING"]), bbox, im - - -class BdfFontFile(FontFile.FontFile): - """Font file plugin for the X11 BDF format.""" - - def __init__(self, fp: BinaryIO) -> None: - super().__init__() - - s = fp.readline() - if s[:13] != b"STARTFONT 2.1": - msg = "not a valid BDF file" - raise SyntaxError(msg) - - 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")) - - 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/.venv/Lib/site-packages/PIL/BlpImagePlugin.py b/.venv/Lib/site-packages/PIL/BlpImagePlugin.py deleted file mode 100644 index b9cefaf..0000000 --- a/.venv/Lib/site-packages/PIL/BlpImagePlugin.py +++ /dev/null @@ -1,488 +0,0 @@ -""" -Blizzard Mipmap Format (.blp) -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/ - -BLP1 files, used mostly in Warcraft III, are not fully supported. -All types of BLP2 files used in World of Warcraft are supported. - -The BLP file structure consists of a header, up to 16 mipmaps of the -texture - -Texture sizes must be powers of two, though the two dimensions do -not have to be equal; 512x256 is valid, but 512x200 is not. -The first mipmap (mipmap #0) is the full size image; each subsequent -mipmap halves both dimensions. The final mipmap should be 1x1. - -BLP files come in many different flavours: -* JPEG-compressed (type == 0) - only supported for BLP1. -* RAW images (type == 1, encoding == 1). Each mipmap is stored as an - array of 8-bit values, one per pixel, left to right, top to bottom. - Each value is an index to the palette. -* DXT-compressed (type == 1, encoding == 2): -- DXT1 compression is used if alpha_encoding == 0. - - An additional alpha bit is used if alpha_depth == 1. - - DXT3 compression is used if alpha_encoding == 1. - - DXT5 compression is used if alpha_encoding == 7. -""" - -from __future__ import annotations - -import abc -import os -import struct -from enum import IntEnum -from io import BytesIO -from typing import IO - -from . import Image, ImageFile - - -class Format(IntEnum): - JPEG = 0 - - -class Encoding(IntEnum): - UNCOMPRESSED = 1 - DXT = 2 - UNCOMPRESSED_RAW_BGRA = 3 - - -class AlphaEncoding(IntEnum): - DXT1 = 0 - DXT3 = 1 - DXT5 = 7 - - -def unpack_565(i: int) -> tuple[int, int, int]: - return ((i >> 11) & 0x1F) << 3, ((i >> 5) & 0x3F) << 2, (i & 0x1F) << 3 - - -def decode_dxt1( - data: bytes, alpha: bool = False -) -> tuple[bytearray, bytearray, bytearray, bytearray]: - """ - input: one "row" of data (i.e. will produce 4*width pixels) - """ - - blocks = len(data) // 8 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block_index in range(blocks): - # Decode next 8-byte block. - idx = block_index * 8 - color0, color1, bits = struct.unpack_from("> 2 - - a = 0xFF - if control == 0: - r, g, b = r0, g0, b0 - elif control == 1: - r, g, b = r1, g1, b1 - elif control == 2: - if color0 > color1: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - else: - r = (r0 + r1) // 2 - g = (g0 + g1) // 2 - b = (b0 + b1) // 2 - elif control == 3: - if color0 > color1: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - else: - r, g, b, a = 0, 0, 0, 0 - - if alpha: - ret[j].extend([r, g, b, a]) - else: - ret[j].extend([r, g, b]) - - return ret - - -def decode_dxt3(data: bytes) -> tuple[bytearray, bytearray, bytearray, bytearray]: - """ - input: one "row" of data (i.e. will produce 4*width pixels) - """ - - blocks = len(data) // 16 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block_index in range(blocks): - idx = block_index * 16 - block = data[idx : idx + 16] - # Decode next 16-byte block. - bits = struct.unpack_from("<8B", block) - color0, color1 = struct.unpack_from(">= 4 - else: - high = True - a &= 0xF - a *= 17 # We get a value between 0 and 15 - - color_code = (code >> 2 * (4 * j + i)) & 0x03 - - if color_code == 0: - r, g, b = r0, g0, b0 - elif color_code == 1: - r, g, b = r1, g1, b1 - elif color_code == 2: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - elif color_code == 3: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - - ret[j].extend([r, g, b, a]) - - return ret - - -def decode_dxt5(data: bytes) -> tuple[bytearray, bytearray, bytearray, bytearray]: - """ - input: one "row" of data (i.e. will produce 4 * width pixels) - """ - - blocks = len(data) // 16 # number of blocks in row - ret = (bytearray(), bytearray(), bytearray(), bytearray()) - - for block_index in range(blocks): - idx = block_index * 16 - block = data[idx : idx + 16] - # Decode next 16-byte block. - a0, a1 = struct.unpack_from("> alphacode_index) & 0x07 - elif alphacode_index == 15: - alphacode = (alphacode2 >> 15) | ((alphacode1 << 1) & 0x06) - else: # alphacode_index >= 18 and alphacode_index <= 45 - alphacode = (alphacode1 >> (alphacode_index - 16)) & 0x07 - - if alphacode == 0: - a = a0 - elif alphacode == 1: - a = a1 - elif a0 > a1: - a = ((8 - alphacode) * a0 + (alphacode - 1) * a1) // 7 - elif alphacode == 6: - a = 0 - elif alphacode == 7: - a = 255 - else: - a = ((6 - alphacode) * a0 + (alphacode - 1) * a1) // 5 - - color_code = (code >> 2 * (4 * j + i)) & 0x03 - - if color_code == 0: - r, g, b = r0, g0, b0 - elif color_code == 1: - r, g, b = r1, g1, b1 - elif color_code == 2: - r = (2 * r0 + r1) // 3 - g = (2 * g0 + g1) // 3 - b = (2 * b0 + b1) // 3 - elif color_code == 3: - r = (2 * r1 + r0) // 3 - g = (2 * g1 + g0) // 3 - b = (2 * b1 + b0) // 3 - - ret[j].extend([r, g, b, a]) - - return ret - - -class BLPFormatError(NotImplementedError): - pass - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] in (b"BLP1", b"BLP2") - - -class BlpImageFile(ImageFile.ImageFile): - """ - Blizzard Mipmap Format - """ - - format = "BLP" - format_description = "Blizzard Mipmap Format" - - def _open(self) -> None: - self.magic = self.fp.read(4) - - self.fp.seek(5, os.SEEK_CUR) - (self._blp_alpha_depth,) = struct.unpack(" tuple[int, int]: - try: - self._read_blp_header() - self._load() - except struct.error as e: - msg = "Truncated BLP file" - raise OSError(msg) from e - return -1, 0 - - @abc.abstractmethod - def _load(self) -> None: - pass - - def _read_blp_header(self) -> None: - assert self.fd is not None - self.fd.seek(4) - (self._blp_compression,) = struct.unpack(" bytes: - return ImageFile._safe_read(self.fd, length) - - def _read_palette(self) -> list[tuple[int, int, int, int]]: - ret = [] - for i in range(256): - try: - b, g, r, a = struct.unpack("<4B", self._safe_read(4)) - except struct.error: - break - ret.append((b, g, r, a)) - return ret - - def _read_bgra(self, palette: list[tuple[int, int, int, int]]) -> bytearray: - data = bytearray() - _data = BytesIO(self._safe_read(self._blp_lengths[0])) - while True: - try: - (offset,) = struct.unpack(" None: - if self._blp_compression == Format.JPEG: - self._decode_jpeg_stream() - - elif self._blp_compression == 1: - if self._blp_encoding in (4, 5): - palette = self._read_palette() - data = self._read_bgra(palette) - self.set_as_raw(data) - else: - msg = f"Unsupported BLP encoding {repr(self._blp_encoding)}" - raise BLPFormatError(msg) - else: - msg = f"Unsupported BLP compression {repr(self._blp_encoding)}" - raise BLPFormatError(msg) - - def _decode_jpeg_stream(self) -> None: - from .JpegImagePlugin import JpegImageFile - - (jpeg_header_size,) = struct.unpack(" None: - palette = self._read_palette() - - assert self.fd is not None - self.fd.seek(self._blp_offsets[0]) - - if self._blp_compression == 1: - # Uncompressed or DirectX compression - - if self._blp_encoding == Encoding.UNCOMPRESSED: - data = self._read_bgra(palette) - - elif self._blp_encoding == Encoding.DXT: - data = bytearray() - if self._blp_alpha_encoding == AlphaEncoding.DXT1: - linesize = (self.size[0] + 3) // 4 * 8 - for yb in range((self.size[1] + 3) // 4): - for d in decode_dxt1( - self._safe_read(linesize), alpha=bool(self._blp_alpha_depth) - ): - data += d - - elif self._blp_alpha_encoding == AlphaEncoding.DXT3: - linesize = (self.size[0] + 3) // 4 * 16 - for yb in range((self.size[1] + 3) // 4): - for d in decode_dxt3(self._safe_read(linesize)): - data += d - - elif self._blp_alpha_encoding == AlphaEncoding.DXT5: - linesize = (self.size[0] + 3) // 4 * 16 - for yb in range((self.size[1] + 3) // 4): - for d in decode_dxt5(self._safe_read(linesize)): - data += d - else: - msg = f"Unsupported alpha encoding {repr(self._blp_alpha_encoding)}" - raise BLPFormatError(msg) - else: - msg = f"Unknown BLP encoding {repr(self._blp_encoding)}" - raise BLPFormatError(msg) - - else: - msg = f"Unknown BLP compression {repr(self._blp_compression)}" - raise BLPFormatError(msg) - - self.set_as_raw(data) - - -class BLPEncoder(ImageFile.PyEncoder): - _pushes_fd = True - - def _write_palette(self) -> bytes: - data = b"" - assert self.im is not None - palette = self.im.getpalette("RGBA", "RGBA") - for i in range(len(palette) // 4): - r, g, b, a = palette[i * 4 : (i + 1) * 4] - data += struct.pack("<4B", b, g, r, a) - while len(data) < 256 * 4: - data += b"\x00" * 4 - return data - - def encode(self, bufsize: int) -> tuple[int, int, bytes]: - palette_data = self._write_palette() - - offset = 20 + 16 * 4 * 2 + len(palette_data) - data = struct.pack("<16I", offset, *((0,) * 15)) - - assert self.im is not None - w, h = self.im.size - data += struct.pack("<16I", w * h, *((0,) * 15)) - - data += palette_data - - for y in range(h): - for x in range(w): - data += struct.pack(" None: - if im.mode != "P": - msg = "Unsupported BLP image mode" - raise ValueError(msg) - - magic = b"BLP1" if im.encoderinfo.get("blp_version") == "BLP1" else b"BLP2" - fp.write(magic) - - fp.write(struct.pack(" 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: bytes) -> bool: - return prefix[:2] == b"BM" - - -def _dib_accept(prefix: bytes) -> bool: - return i32(prefix) in [12, 40, 52, 56, 64, 108, 124] - - -# ============================================================================= -# 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} - for k, v in COMPRESSIONS.items(): - vars()[k] = v - - 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) - # read bmp header size @offset 14 (this is part of the header size) - file_info = {"header_size": i32(read(4)), "direction": -1} - - # -------------------- If requested, read header at a specific position - # read the rest of the bmp header, without its size - header_data = ImageFile._safe_read(self.fp, file_info["header_size"] - 4) - - # ------------------------------- Windows Bitmap v2, IBM OS/2 Bitmap v1 - # ----- This format has different offsets because of width/height types - # 12: BITMAPCOREHEADER/OS21XBITMAPHEADER - if file_info["header_size"] == 12: - file_info["width"] = i16(header_data, 0) - file_info["height"] = i16(header_data, 2) - file_info["planes"] = i16(header_data, 4) - file_info["bits"] = i16(header_data, 6) - file_info["compression"] = self.RAW - file_info["palette_padding"] = 3 - - # --------------------------------------------- Windows Bitmap v3 to v5 - # 40: BITMAPINFOHEADER - # 52: BITMAPV2HEADER - # 56: BITMAPV3HEADER - # 64: BITMAPCOREHEADER2/OS22XBITMAPHEADER - # 108: BITMAPV4HEADER - # 124: BITMAPV5HEADER - elif file_info["header_size"] in (40, 52, 56, 64, 108, 124): - file_info["y_flip"] = header_data[7] == 0xFF - file_info["direction"] = 1 if file_info["y_flip"] else -1 - file_info["width"] = i32(header_data, 0) - file_info["height"] = ( - i32(header_data, 4) - if not file_info["y_flip"] - else 2**32 - i32(header_data, 4) - ) - file_info["planes"] = i16(header_data, 8) - file_info["bits"] = i16(header_data, 10) - file_info["compression"] = i32(header_data, 12) - # byte size of pixel data - file_info["data_size"] = i32(header_data, 16) - file_info["pixels_per_meter"] = ( - i32(header_data, 20), - i32(header_data, 24), - ) - file_info["colors"] = i32(header_data, 28) - file_info["palette_padding"] = 4 - self.info["dpi"] = tuple(x / 39.3701 for x in file_info["pixels_per_meter"]) - if file_info["compression"] == self.BITFIELDS: - masks = ["r_mask", "g_mask", "b_mask"] - if len(header_data) >= 48: - if len(header_data) >= 52: - masks.append("a_mask") - else: - file_info["a_mask"] = 0x0 - for idx, mask in enumerate(masks): - file_info[mask] = i32(header_data, 36 + 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 masks: - 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: - msg = f"Unsupported BMP header type ({file_info['header_size']})" - raise OSError(msg) - - # ------------------ 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"]) - ) - if offset == 14 + file_info["header_size"] and file_info["bits"] <= 8: - offset += 4 * file_info["colors"] - - # ---------------------- Check bit depth for unusual unsupported values - self._mode, raw_mode = BIT2MODE.get(file_info["bits"], (None, None)) - if self.mode is None: - msg = f"Unsupported BMP pixel depth ({file_info['bits']})" - raise OSError(msg) - - # ---------------- Process BMP with Bitfields compression (not palette) - decoder_name = "raw" - if file_info["compression"] == self.BITFIELDS: - SUPPORTED = { - 32: [ - (0xFF0000, 0xFF00, 0xFF, 0x0), - (0xFF000000, 0xFF0000, 0xFF00, 0x0), - (0xFF000000, 0xFF00, 0xFF, 0x0), - (0xFF000000, 0xFF0000, 0xFF00, 0xFF), - (0xFF, 0xFF00, 0xFF0000, 0xFF000000), - (0xFF0000, 0xFF00, 0xFF, 0xFF000000), - (0xFF000000, 0xFF00, 0xFF, 0xFF0000), - (0x0, 0x0, 0x0, 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, (0xFF000000, 0xFF00, 0xFF, 0x0)): "BGXR", - (32, (0xFF000000, 0xFF0000, 0xFF00, 0xFF)): "ABGR", - (32, (0xFF, 0xFF00, 0xFF0000, 0xFF000000)): "RGBA", - (32, (0xFF0000, 0xFF00, 0xFF, 0xFF000000)): "BGRA", - (32, (0xFF000000, 0xFF00, 0xFF, 0xFF0000)): "BGAR", - (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 "A" in raw_mode 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: - msg = "Unsupported BMP bitfields layout" - raise OSError(msg) - else: - msg = "Unsupported BMP bitfields layout" - raise OSError(msg) - elif file_info["compression"] == self.RAW: - if file_info["bits"] == 32 and header == 22: # 32-bit .cur offset - raw_mode, self._mode = "BGRA", "RGBA" - elif file_info["compression"] in (self.RLE8, self.RLE4): - decoder_name = "bmp_rle" - else: - msg = f"Unsupported BMP compression ({file_info['compression']})" - raise OSError(msg) - - # --------------- 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): - msg = f"Unsupported BMP Palette size ({file_info['colors']})" - raise OSError(msg) - else: - padding = file_info["palette_padding"] - palette = read(padding * file_info["colors"]) - grayscale = True - indices = ( - (0, 255) - if file_info["colors"] == 2 - else list(range(file_info["colors"])) - ) - - # ----------------- Check if grayscale and ignore palette if so - for ind, val in enumerate(indices): - rgb = palette[ind * padding : ind * padding + 3] - if rgb != o8(val) * 3: - grayscale = False - - # ------- If all colors are gray, white or black, ditch palette - if grayscale: - 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"] - args = [raw_mode] - if decoder_name == "bmp_rle": - args.append(file_info["compression"] == self.RLE4) - else: - args.append(((file_info["width"] * file_info["bits"] + 31) >> 3) & (~3)) - args.append(file_info["direction"]) - self.tile = [ - ( - decoder_name, - (0, 0, file_info["width"], file_info["height"]), - offset or self.fp.tell(), - tuple(args), - ) - ] - - def _open(self) -> None: - """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 not _accept(head_data): - msg = "Not a BMP file" - raise SyntaxError(msg) - # read the start position of the BMP image data (u32) - offset = i32(head_data, 10) - # load bitmap information (offset=raster info) - self._bitmap(offset=offset) - - -class BmpRleDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer: bytes) -> tuple[int, int]: - assert self.fd is not None - rle4 = self.args[1] - data = bytearray() - x = 0 - dest_length = self.state.xsize * self.state.ysize - while len(data) < dest_length: - pixels = self.fd.read(1) - byte = self.fd.read(1) - if not pixels or not byte: - break - num_pixels = pixels[0] - if num_pixels: - # encoded mode - if x + num_pixels > self.state.xsize: - # Too much data for row - num_pixels = max(0, self.state.xsize - x) - if rle4: - first_pixel = o8(byte[0] >> 4) - second_pixel = o8(byte[0] & 0x0F) - for index in range(num_pixels): - if index % 2 == 0: - data += first_pixel - else: - data += second_pixel - else: - data += byte * num_pixels - x += num_pixels - else: - if byte[0] == 0: - # end of line - while len(data) % self.state.xsize != 0: - data += b"\x00" - x = 0 - elif byte[0] == 1: - # end of bitmap - break - elif byte[0] == 2: - # delta - bytes_read = self.fd.read(2) - if len(bytes_read) < 2: - break - right, up = self.fd.read(2) - data += b"\x00" * (right + up * self.state.xsize) - x = len(data) % self.state.xsize - else: - # absolute mode - if rle4: - # 2 pixels per byte - byte_count = byte[0] // 2 - bytes_read = self.fd.read(byte_count) - for byte_read in bytes_read: - data += o8(byte_read >> 4) - data += o8(byte_read & 0x0F) - else: - byte_count = byte[0] - bytes_read = self.fd.read(byte_count) - data += bytes_read - if len(bytes_read) < byte_count: - break - x += byte[0] - - # align to 16-bit word boundary - if self.fd.tell() % 2 != 0: - self.fd.seek(1, os.SEEK_CUR) - rawmode = "L" if self.mode == "L" else "P" - self.set_as_raw(bytes(data), (rawmode, 0, self.args[-1])) - return -1, 0 - - -# ============================================================================= -# Image plugin for the DIB format (BMP alias) -# ============================================================================= -class DibImageFile(BmpImageFile): - format = "DIB" - format_description = "Windows Bitmap" - - def _open(self) -> None: - 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 _dib_save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - _save(im, fp, filename, False) - - -def _save( - im: Image.Image, fp: IO[bytes], filename: str | bytes, bitmap_header: bool = True -) -> None: - try: - rawmode, bits, colors = SAVE[im.mode] - except KeyError as e: - msg = f"cannot write mode {im.mode} as BMP" - raise OSError(msg) from e - - info = im.encoderinfo - - dpi = info.get("dpi", (96, 96)) - - # 1 meter == 39.3701 inches - ppm = tuple(int(x * 39.3701 + 0.5) for x in dpi) - - stride = ((im.size[0] * bits + 7) // 8 + 3) & (~3) - header = 40 # or 64 for OS/2 version 2 - image = stride * im.size[1] - - if im.mode == "1": - palette = b"".join(o8(i) * 4 for i in (0, 255)) - elif im.mode == "L": - palette = b"".join(o8(i) * 4 for i in range(256)) - elif im.mode == "P": - palette = im.im.getpalette("RGB", "BGRX") - colors = len(palette) // 4 - else: - palette = None - - # bitmap header - if bitmap_header: - offset = 14 + header + colors * 4 - file_size = offset + image - if file_size > 2**32 - 1: - msg = "File size is too large for the BMP format" - raise ValueError(msg) - fp.write( - b"BM" # file type (magic) - + o32(file_size) # 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]) # resolution - + o32(ppm[1]) # resolution - + o32(colors) # colors used - + o32(colors) # colors important - ) - - fp.write(b"\0" * (header - 40)) # padding (for OS/2 format) - - if palette: - fp.write(palette) - - 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") - -Image.register_decoder("bmp_rle", BmpRleDecoder) - -Image.register_open(DibImageFile.format, DibImageFile, _dib_accept) -Image.register_save(DibImageFile.format, _dib_save) - -Image.register_extension(DibImageFile.format, ".dib") - -Image.register_mime(DibImageFile.format, "image/bmp") diff --git a/.venv/Lib/site-packages/PIL/BufrStubImagePlugin.py b/.venv/Lib/site-packages/PIL/BufrStubImagePlugin.py deleted file mode 100644 index 0ee2f65..0000000 --- a/.venv/Lib/site-packages/PIL/BufrStubImagePlugin.py +++ /dev/null @@ -1,76 +0,0 @@ -# -# 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 __future__ import annotations - -from typing import IO - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler: ImageFile.StubHandler | None) -> None: - """ - Install application-specific BUFR image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == b"BUFR" or prefix[:4] == b"ZCZC" - - -class BufrStubImageFile(ImageFile.StubImageFile): - format = "BUFR" - format_description = "BUFR" - - def _open(self) -> None: - offset = self.fp.tell() - - if not _accept(self.fp.read(4)): - msg = "Not a BUFR file" - raise SyntaxError(msg) - - 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) -> ImageFile.StubHandler | None: - return _handler - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if _handler is None or not hasattr(_handler, "save"): - msg = "BUFR save handler not installed" - raise OSError(msg) - _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/.venv/Lib/site-packages/PIL/ContainerIO.py b/.venv/Lib/site-packages/PIL/ContainerIO.py deleted file mode 100644 index 0035296..0000000 --- a/.venv/Lib/site-packages/PIL/ContainerIO.py +++ /dev/null @@ -1,121 +0,0 @@ -# -# 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. -# -from __future__ import annotations - -import io -from typing import IO, AnyStr, Generic, Literal - - -class ContainerIO(Generic[AnyStr]): - """ - A file object that provides read access to a part of an existing - file (for example a TAR file). - """ - - def __init__(self, file: IO[AnyStr], offset: int, length: int) -> None: - """ - Create file object. - - :param file: Existing file. - :param offset: Start of region, in bytes. - :param length: Size of region, in bytes. - """ - self.fh: IO[AnyStr] = file - self.pos = 0 - self.offset = offset - self.length = length - self.fh.seek(offset) - - ## - # Always false. - - def isatty(self) -> bool: - return False - - def seek(self, offset: int, mode: Literal[0, 1, 2] = io.SEEK_SET) -> None: - """ - 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) -> int: - """ - Get current file pointer. - - :returns: Offset from start of region, in bytes. - """ - return self.pos - - def read(self, n: int = 0) -> AnyStr: - """ - 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 b"" if "b" in self.fh.mode else "" # type: ignore[return-value] - self.pos = self.pos + n - return self.fh.read(n) - - def readline(self) -> AnyStr: - """ - Read a line of text. - - :returns: An 8-bit string. - """ - s: AnyStr = b"" if "b" in self.fh.mode else "" # type: ignore[assignment] - newline_character = b"\n" if "b" in self.fh.mode else "\n" - while True: - c = self.read(1) - if not c: - break - s = s + c - if c == newline_character: - break - return s - - def readlines(self) -> list[AnyStr]: - """ - Read multiple lines of text. - - :returns: A list of 8-bit strings. - """ - lines = [] - while True: - s = self.readline() - if not s: - break - lines.append(s) - return lines diff --git a/.venv/Lib/site-packages/PIL/CurImagePlugin.py b/.venv/Lib/site-packages/PIL/CurImagePlugin.py deleted file mode 100644 index 85e2145..0000000 --- a/.venv/Lib/site-packages/PIL/CurImagePlugin.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# 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 annotations - -from . import BmpImagePlugin, Image -from ._binary import i16le as i16 -from ._binary import i32le as i32 - -# -# -------------------------------------------------------------------- - - -def _accept(prefix: bytes) -> bool: - 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) -> None: - offset = self.fp.tell() - - # check magic - s = self.fp.read(6) - if not _accept(s): - msg = "not a CUR file" - raise SyntaxError(msg) - - # 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 s[0] > m[0] and s[1] > m[1]: - m = s - if not m: - msg = "No cursors were found" - raise TypeError(msg) - - # 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 - - -# -# -------------------------------------------------------------------- - -Image.register_open(CurImageFile.format, CurImageFile, _accept) - -Image.register_extension(CurImageFile.format, ".cur") diff --git a/.venv/Lib/site-packages/PIL/DcxImagePlugin.py b/.venv/Lib/site-packages/PIL/DcxImagePlugin.py deleted file mode 100644 index f67f27d..0000000 --- a/.venv/Lib/site-packages/PIL/DcxImagePlugin.py +++ /dev/null @@ -1,80 +0,0 @@ -# -# 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 __future__ import annotations - -from . import Image -from ._binary import i32le as i32 -from .PcxImagePlugin import PcxImageFile - -MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then? - - -def _accept(prefix: bytes) -> bool: - 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) -> None: - # Header - s = self.fp.read(4) - if not _accept(s): - msg = "not a DCX file" - raise SyntaxError(msg) - - # 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 = -1 - self.n_frames = len(self._offset) - self.is_animated = self.n_frames > 1 - self.seek(0) - - def seek(self, frame: int) -> None: - 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) -> int: - return self.frame - - -Image.register_open(DcxImageFile.format, DcxImageFile, _accept) - -Image.register_extension(DcxImageFile.format, ".dcx") diff --git a/.venv/Lib/site-packages/PIL/DdsImagePlugin.py b/.venv/Lib/site-packages/PIL/DdsImagePlugin.py deleted file mode 100644 index a57e4ae..0000000 --- a/.venv/Lib/site-packages/PIL/DdsImagePlugin.py +++ /dev/null @@ -1,575 +0,0 @@ -""" -A Pillow loader for .dds files (S3TC-compressed aka DXTC) -Jerome Leclanche - -Documentation: -https://web.archive.org/web/20170802060935/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/ -""" - -from __future__ import annotations - -import io -import struct -import sys -from enum import IntEnum, IntFlag -from typing import IO - -from . import Image, ImageFile, ImagePalette -from ._binary import i32le as i32 -from ._binary import o8 -from ._binary import o32le as o32 - -# Magic ("DDS ") -DDS_MAGIC = 0x20534444 - - -# DDS flags -class DDSD(IntFlag): - CAPS = 0x1 - HEIGHT = 0x2 - WIDTH = 0x4 - PITCH = 0x8 - PIXELFORMAT = 0x1000 - MIPMAPCOUNT = 0x20000 - LINEARSIZE = 0x80000 - DEPTH = 0x800000 - - -# DDS caps -class DDSCAPS(IntFlag): - COMPLEX = 0x8 - TEXTURE = 0x1000 - MIPMAP = 0x400000 - - -class DDSCAPS2(IntFlag): - CUBEMAP = 0x200 - CUBEMAP_POSITIVEX = 0x400 - CUBEMAP_NEGATIVEX = 0x800 - CUBEMAP_POSITIVEY = 0x1000 - CUBEMAP_NEGATIVEY = 0x2000 - CUBEMAP_POSITIVEZ = 0x4000 - CUBEMAP_NEGATIVEZ = 0x8000 - VOLUME = 0x200000 - - -# Pixel Format -class DDPF(IntFlag): - ALPHAPIXELS = 0x1 - ALPHA = 0x2 - FOURCC = 0x4 - PALETTEINDEXED8 = 0x20 - RGB = 0x40 - LUMINANCE = 0x20000 - - -# dxgiformat.h -class DXGI_FORMAT(IntEnum): - UNKNOWN = 0 - R32G32B32A32_TYPELESS = 1 - R32G32B32A32_FLOAT = 2 - R32G32B32A32_UINT = 3 - R32G32B32A32_SINT = 4 - R32G32B32_TYPELESS = 5 - R32G32B32_FLOAT = 6 - R32G32B32_UINT = 7 - R32G32B32_SINT = 8 - R16G16B16A16_TYPELESS = 9 - R16G16B16A16_FLOAT = 10 - R16G16B16A16_UNORM = 11 - R16G16B16A16_UINT = 12 - R16G16B16A16_SNORM = 13 - R16G16B16A16_SINT = 14 - R32G32_TYPELESS = 15 - R32G32_FLOAT = 16 - R32G32_UINT = 17 - R32G32_SINT = 18 - R32G8X24_TYPELESS = 19 - D32_FLOAT_S8X24_UINT = 20 - R32_FLOAT_X8X24_TYPELESS = 21 - X32_TYPELESS_G8X24_UINT = 22 - R10G10B10A2_TYPELESS = 23 - R10G10B10A2_UNORM = 24 - R10G10B10A2_UINT = 25 - R11G11B10_FLOAT = 26 - R8G8B8A8_TYPELESS = 27 - R8G8B8A8_UNORM = 28 - R8G8B8A8_UNORM_SRGB = 29 - R8G8B8A8_UINT = 30 - R8G8B8A8_SNORM = 31 - R8G8B8A8_SINT = 32 - R16G16_TYPELESS = 33 - R16G16_FLOAT = 34 - R16G16_UNORM = 35 - R16G16_UINT = 36 - R16G16_SNORM = 37 - R16G16_SINT = 38 - R32_TYPELESS = 39 - D32_FLOAT = 40 - R32_FLOAT = 41 - R32_UINT = 42 - R32_SINT = 43 - R24G8_TYPELESS = 44 - D24_UNORM_S8_UINT = 45 - R24_UNORM_X8_TYPELESS = 46 - X24_TYPELESS_G8_UINT = 47 - R8G8_TYPELESS = 48 - R8G8_UNORM = 49 - R8G8_UINT = 50 - R8G8_SNORM = 51 - R8G8_SINT = 52 - R16_TYPELESS = 53 - R16_FLOAT = 54 - D16_UNORM = 55 - R16_UNORM = 56 - R16_UINT = 57 - R16_SNORM = 58 - R16_SINT = 59 - R8_TYPELESS = 60 - R8_UNORM = 61 - R8_UINT = 62 - R8_SNORM = 63 - R8_SINT = 64 - A8_UNORM = 65 - R1_UNORM = 66 - R9G9B9E5_SHAREDEXP = 67 - R8G8_B8G8_UNORM = 68 - G8R8_G8B8_UNORM = 69 - BC1_TYPELESS = 70 - BC1_UNORM = 71 - BC1_UNORM_SRGB = 72 - BC2_TYPELESS = 73 - BC2_UNORM = 74 - BC2_UNORM_SRGB = 75 - BC3_TYPELESS = 76 - BC3_UNORM = 77 - BC3_UNORM_SRGB = 78 - BC4_TYPELESS = 79 - BC4_UNORM = 80 - BC4_SNORM = 81 - BC5_TYPELESS = 82 - BC5_UNORM = 83 - BC5_SNORM = 84 - B5G6R5_UNORM = 85 - B5G5R5A1_UNORM = 86 - B8G8R8A8_UNORM = 87 - B8G8R8X8_UNORM = 88 - R10G10B10_XR_BIAS_A2_UNORM = 89 - B8G8R8A8_TYPELESS = 90 - B8G8R8A8_UNORM_SRGB = 91 - B8G8R8X8_TYPELESS = 92 - B8G8R8X8_UNORM_SRGB = 93 - BC6H_TYPELESS = 94 - BC6H_UF16 = 95 - BC6H_SF16 = 96 - BC7_TYPELESS = 97 - BC7_UNORM = 98 - BC7_UNORM_SRGB = 99 - AYUV = 100 - Y410 = 101 - Y416 = 102 - NV12 = 103 - P010 = 104 - P016 = 105 - OPAQUE_420 = 106 - YUY2 = 107 - Y210 = 108 - Y216 = 109 - NV11 = 110 - AI44 = 111 - IA44 = 112 - P8 = 113 - A8P8 = 114 - B4G4R4A4_UNORM = 115 - P208 = 130 - V208 = 131 - V408 = 132 - SAMPLER_FEEDBACK_MIN_MIP_OPAQUE = 189 - SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE = 190 - - -class D3DFMT(IntEnum): - UNKNOWN = 0 - R8G8B8 = 20 - A8R8G8B8 = 21 - X8R8G8B8 = 22 - R5G6B5 = 23 - X1R5G5B5 = 24 - A1R5G5B5 = 25 - A4R4G4B4 = 26 - R3G3B2 = 27 - A8 = 28 - A8R3G3B2 = 29 - X4R4G4B4 = 30 - A2B10G10R10 = 31 - A8B8G8R8 = 32 - X8B8G8R8 = 33 - G16R16 = 34 - A2R10G10B10 = 35 - A16B16G16R16 = 36 - A8P8 = 40 - P8 = 41 - L8 = 50 - A8L8 = 51 - A4L4 = 52 - V8U8 = 60 - L6V5U5 = 61 - X8L8V8U8 = 62 - Q8W8V8U8 = 63 - V16U16 = 64 - A2W10V10U10 = 67 - D16_LOCKABLE = 70 - D32 = 71 - D15S1 = 73 - D24S8 = 75 - D24X8 = 77 - D24X4S4 = 79 - D16 = 80 - D32F_LOCKABLE = 82 - D24FS8 = 83 - D32_LOCKABLE = 84 - S8_LOCKABLE = 85 - L16 = 81 - VERTEXDATA = 100 - INDEX16 = 101 - INDEX32 = 102 - Q16W16V16U16 = 110 - R16F = 111 - G16R16F = 112 - A16B16G16R16F = 113 - R32F = 114 - G32R32F = 115 - A32B32G32R32F = 116 - CxV8U8 = 117 - A1 = 118 - A2B10G10R10_XR_BIAS = 119 - BINARYBUFFER = 199 - - UYVY = i32(b"UYVY") - R8G8_B8G8 = i32(b"RGBG") - YUY2 = i32(b"YUY2") - G8R8_G8B8 = i32(b"GRGB") - DXT1 = i32(b"DXT1") - DXT2 = i32(b"DXT2") - DXT3 = i32(b"DXT3") - DXT4 = i32(b"DXT4") - DXT5 = i32(b"DXT5") - DX10 = i32(b"DX10") - BC4S = i32(b"BC4S") - BC4U = i32(b"BC4U") - BC5S = i32(b"BC5S") - BC5U = i32(b"BC5U") - ATI1 = i32(b"ATI1") - ATI2 = i32(b"ATI2") - MULTI2_ARGB8 = i32(b"MET1") - - -# Backward compatibility layer -module = sys.modules[__name__] -for item in DDSD: - assert item.name is not None - setattr(module, f"DDSD_{item.name}", item.value) -for item1 in DDSCAPS: - assert item1.name is not None - setattr(module, f"DDSCAPS_{item1.name}", item1.value) -for item2 in DDSCAPS2: - assert item2.name is not None - setattr(module, f"DDSCAPS2_{item2.name}", item2.value) -for item3 in DDPF: - assert item3.name is not None - setattr(module, f"DDPF_{item3.name}", item3.value) - -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_FOURCC = D3DFMT.DXT1 -DXT3_FOURCC = D3DFMT.DXT3 -DXT5_FOURCC = D3DFMT.DXT5 - -DXGI_FORMAT_R8G8B8A8_TYPELESS = DXGI_FORMAT.R8G8B8A8_TYPELESS -DXGI_FORMAT_R8G8B8A8_UNORM = DXGI_FORMAT.R8G8B8A8_UNORM -DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = DXGI_FORMAT.R8G8B8A8_UNORM_SRGB -DXGI_FORMAT_BC5_TYPELESS = DXGI_FORMAT.BC5_TYPELESS -DXGI_FORMAT_BC5_UNORM = DXGI_FORMAT.BC5_UNORM -DXGI_FORMAT_BC5_SNORM = DXGI_FORMAT.BC5_SNORM -DXGI_FORMAT_BC6H_UF16 = DXGI_FORMAT.BC6H_UF16 -DXGI_FORMAT_BC6H_SF16 = DXGI_FORMAT.BC6H_SF16 -DXGI_FORMAT_BC7_TYPELESS = DXGI_FORMAT.BC7_TYPELESS -DXGI_FORMAT_BC7_UNORM = DXGI_FORMAT.BC7_UNORM -DXGI_FORMAT_BC7_UNORM_SRGB = DXGI_FORMAT.BC7_UNORM_SRGB - - -class DdsImageFile(ImageFile.ImageFile): - format = "DDS" - format_description = "DirectDraw Surface" - - def _open(self) -> None: - if not _accept(self.fp.read(4)): - msg = "not a DDS file" - raise SyntaxError(msg) - (header_size,) = struct.unpack(" None: - pass - - -class DdsRgbDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer: bytes) -> tuple[int, int]: - assert self.fd is not None - bitcount, masks = self.args - - # Some masks will be padded with zeros, e.g. R 0b11 G 0b1100 - # Calculate how many zeros each mask is padded with - mask_offsets = [] - # And the maximum value of each channel without the padding - mask_totals = [] - for mask in masks: - offset = 0 - if mask != 0: - while mask >> (offset + 1) << (offset + 1) == mask: - offset += 1 - mask_offsets.append(offset) - mask_totals.append(mask >> offset) - - data = bytearray() - bytecount = bitcount // 8 - dest_length = self.state.xsize * self.state.ysize * len(masks) - while len(data) < dest_length: - value = int.from_bytes(self.fd.read(bytecount), "little") - for i, mask in enumerate(masks): - masked_value = value & mask - # Remove the zero padding, and scale it to 8 bits - data += o8( - int(((masked_value >> mask_offsets[i]) / mask_totals[i]) * 255) - ) - self.set_as_raw(data) - return -1, 0 - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode not in ("RGB", "RGBA", "L", "LA"): - msg = f"cannot write mode {im.mode} as DDS" - raise OSError(msg) - - alpha = im.mode[-1] == "A" - if im.mode[0] == "L": - pixel_flags = DDPF.LUMINANCE - rawmode = im.mode - if alpha: - rgba_mask = [0x000000FF, 0x000000FF, 0x000000FF] - else: - rgba_mask = [0xFF000000, 0xFF000000, 0xFF000000] - else: - pixel_flags = DDPF.RGB - rawmode = im.mode[::-1] - rgba_mask = [0x00FF0000, 0x0000FF00, 0x000000FF] - - if alpha: - r, g, b, a = im.split() - im = Image.merge("RGBA", (a, r, g, b)) - if alpha: - pixel_flags |= DDPF.ALPHAPIXELS - rgba_mask.append(0xFF000000 if alpha else 0) - - flags = DDSD.CAPS | DDSD.HEIGHT | DDSD.WIDTH | DDSD.PITCH | DDSD.PIXELFORMAT - bitcount = len(im.getbands()) * 8 - pitch = (im.width * bitcount + 7) // 8 - - fp.write( - o32(DDS_MAGIC) - + struct.pack( - "<7I", - 124, # header size - flags, # flags - im.height, - im.width, - pitch, - 0, # depth - 0, # mipmaps - ) - + struct.pack("11I", *((0,) * 11)) # reserved - # pfsize, pfflags, fourcc, bitcount - + struct.pack("<4I", 32, pixel_flags, 0, bitcount) - + struct.pack("<4I", *rgba_mask) # dwRGBABitMask - + struct.pack("<5I", DDSCAPS.TEXTURE, 0, 0, 0, 0) - ) - ImageFile._save( - im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, 1))] - ) - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == b"DDS " - - -Image.register_open(DdsImageFile.format, DdsImageFile, _accept) -Image.register_decoder("dds_rgb", DdsRgbDecoder) -Image.register_save(DdsImageFile.format, _save) -Image.register_extension(DdsImageFile.format, ".dds") diff --git a/.venv/Lib/site-packages/PIL/EpsImagePlugin.py b/.venv/Lib/site-packages/PIL/EpsImagePlugin.py deleted file mode 100644 index f31b1c1..0000000 --- a/.venv/Lib/site-packages/PIL/EpsImagePlugin.py +++ /dev/null @@ -1,478 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# EPS file handling -# -# History: -# 1995-09-01 fl Created (0.1) -# 1996-05-18 fl Don't choke on "atend" fields, Ghostscript interface (0.2) -# 1996-08-22 fl Don't choke on floating point BoundingBox values -# 1996-08-23 fl Handle files from Macintosh (0.3) -# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) -# 2003-09-07 fl Check gs.close status (from Federico Di Gregorio) (0.5) -# 2014-05-07 e Handling of EPS with binary preview and fixed resolution -# resizing -# -# 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 __future__ import annotations - -import io -import os -import re -import subprocess -import sys -import tempfile -from typing import IO - -from . import Image, ImageFile -from ._binary import i32le as i32 -from ._deprecate import deprecate - -# -------------------------------------------------------------------- - - -split = re.compile(r"^%%([^:]*):[ \t]*(.*)[ \t]*$") -field = re.compile(r"^%[%!\w]([^:]*)[ \t]*$") - -gs_binary: str | bool | None = None -gs_windows_binary = None - - -def has_ghostscript() -> bool: - global gs_binary, gs_windows_binary - if gs_binary is None: - if sys.platform.startswith("win"): - if gs_windows_binary is None: - import shutil - - for binary in ("gswin32c", "gswin64c", "gs"): - if shutil.which(binary) is not None: - gs_windows_binary = binary - break - else: - gs_windows_binary = False - gs_binary = gs_windows_binary - else: - try: - subprocess.check_call(["gs", "--version"], stdout=subprocess.DEVNULL) - gs_binary = "gs" - except OSError: - gs_binary = False - return gs_binary is not False - - -def Ghostscript(tile, size, fp, scale=1, transparency=False): - """Render an image using Ghostscript""" - global gs_binary - if not has_ghostscript(): - msg = "Unable to locate Ghostscript on paths" - raise OSError(msg) - - # Unpack decoder tile - decoder, tile, offset, data = tile[0] - length, bbox = data - - # Hack to support hi-res rendering - scale = int(scale) or 1 - width = size[0] * scale - height = size[1] * scale - # resolution is dependent on bbox and size - res_x = 72.0 * width / (bbox[2] - bbox[0]) - res_y = 72.0 * height / (bbox[3] - bbox[1]) - - out_fd, outfile = tempfile.mkstemp() - os.close(out_fd) - - infile_temp = None - if hasattr(fp, "name") and os.path.exists(fp.name): - infile = fp.name - else: - in_fd, infile_temp = tempfile.mkstemp() - os.close(in_fd) - infile = infile_temp - - # Ignore length and offset! - # Ghostscript can read it - # Copy whole file to read in Ghostscript - with open(infile_temp, "wb") as f: - # fetch length of fp - fp.seek(0, io.SEEK_END) - fsize = fp.tell() - # ensure start position - # go back - fp.seek(0) - lengthfile = fsize - while lengthfile > 0: - s = fp.read(min(lengthfile, 100 * 1024)) - if not s: - break - lengthfile -= len(s) - f.write(s) - - device = "pngalpha" if transparency else "ppmraw" - - # Build Ghostscript command - command = [ - gs_binary, - "-q", # quiet mode - f"-g{width:d}x{height:d}", # set output geometry (pixels) - f"-r{res_x:f}x{res_y:f}", # set input DPI (dots per inch) - "-dBATCH", # exit after processing - "-dNOPAUSE", # don't pause between pages - "-dSAFER", # safe mode - f"-sDEVICE={device}", - f"-sOutputFile={outfile}", # output file - # adjust for image origin - "-c", - f"{-bbox[0]} {-bbox[1]} translate", - "-f", - infile, # input file - # showpage (see https://bugs.ghostscript.com/show_bug.cgi?id=698272) - "-c", - "showpage", - ] - - # push data through Ghostscript - try: - startupinfo = None - if sys.platform.startswith("win"): - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - subprocess.check_call(command, startupinfo=startupinfo) - out_im = Image.open(outfile) - out_im.load() - finally: - try: - os.unlink(outfile) - if infile_temp: - os.unlink(infile_temp) - except OSError: - pass - - im = out_im.im.copy() - out_im.close() - return im - - -class PSFile: - """ - Wrapper for bytesio object that treats either CR or LF as end of line. - This class is no longer used internally, but kept for backwards compatibility. - """ - - def __init__(self, fp): - deprecate( - "PSFile", - 11, - action="If you need the functionality of this class " - "you will need to implement it yourself.", - ) - self.fp = fp - self.char = None - - def seek(self, offset, whence=io.SEEK_SET): - self.char = None - self.fp.seek(offset, whence) - - def readline(self) -> str: - s = [self.char or b""] - self.char = None - - c = self.fp.read(1) - while (c not in b"\r\n") and len(c): - s.append(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 b"".join(s).decode("latin-1") - - -def _accept(prefix: bytes) -> bool: - 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) -> None: - (length, offset) = self._find_offset(self.fp) - - # go to offset - start of "%!PS" - self.fp.seek(offset) - - self._mode = "RGB" - self._size = None - - byte_arr = bytearray(255) - bytes_mv = memoryview(byte_arr) - bytes_read = 0 - reading_header_comments = True - reading_trailer_comments = False - trailer_reached = False - - def check_required_header_comments() -> None: - """ - The EPS specification requires that some headers exist. - This should be checked when the header comments formally end, - when image data starts, or when the file ends, whichever comes first. - """ - if "PS-Adobe" not in self.info: - msg = 'EPS header missing "%!PS-Adobe" comment' - raise SyntaxError(msg) - if "BoundingBox" not in self.info: - msg = 'EPS header missing "%%BoundingBox" comment' - raise SyntaxError(msg) - - def _read_comment(s: str) -> bool: - nonlocal reading_trailer_comments - try: - m = split.match(s) - except re.error as e: - msg = "not an EPS file" - raise SyntaxError(msg) from e - - if not m: - return False - - k, v = m.group(1, 2) - self.info[k] = v - if k == "BoundingBox": - if v == "(atend)": - reading_trailer_comments = True - elif not self._size or (trailer_reached and reading_trailer_comments): - 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 Exception: - pass - return True - - while True: - byte = self.fp.read(1) - if byte == b"": - # if we didn't read a byte we must be at the end of the file - if bytes_read == 0: - if reading_header_comments: - check_required_header_comments() - break - elif byte in b"\r\n": - # if we read a line ending character, ignore it and parse what - # we have already read. if we haven't read any other characters, - # continue reading - if bytes_read == 0: - continue - else: - # ASCII/hexadecimal lines in an EPS file must not exceed - # 255 characters, not including line ending characters - if bytes_read >= 255: - # only enforce this for lines starting with a "%", - # otherwise assume it's binary data - if byte_arr[0] == ord("%"): - msg = "not an EPS file" - raise SyntaxError(msg) - else: - if reading_header_comments: - check_required_header_comments() - reading_header_comments = False - # reset bytes_read so we can keep reading - # data until the end of the line - bytes_read = 0 - byte_arr[bytes_read] = byte[0] - bytes_read += 1 - continue - - if reading_header_comments: - # Load EPS header - - # if this line doesn't start with a "%", - # or does start with "%%EndComments", - # then we've reached the end of the header/comments - if byte_arr[0] != ord("%") or bytes_mv[:13] == b"%%EndComments": - check_required_header_comments() - reading_header_comments = False - continue - - s = str(bytes_mv[:bytes_read], "latin-1") - if not _read_comment(s): - m = field.match(s) - if m: - k = m.group(1) - if k[:8] == "PS-Adobe": - self.info["PS-Adobe"] = 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: - msg = "bad EPS header" - raise OSError(msg) - elif bytes_mv[:11] == b"%ImageData:": - # Check for an "ImageData" descriptor - # https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577413_pgfId-1035096 - - # Values: - # columns - # rows - # bit depth (1 or 8) - # mode (1: L, 2: LAB, 3: RGB, 4: CMYK) - # number of padding channels - # block size (number of bytes per row per channel) - # binary/ascii (1: binary, 2: ascii) - # data start identifier (the image data follows after a single line - # consisting only of this quoted value) - image_data_values = byte_arr[11:bytes_read].split(None, 7) - columns, rows, bit_depth, mode_id = ( - int(value) for value in image_data_values[:4] - ) - - if bit_depth == 1: - self._mode = "1" - elif bit_depth == 8: - try: - self._mode = self.mode_map[mode_id] - except ValueError: - break - else: - break - - self._size = columns, rows - return - elif bytes_mv[:5] == b"%%EOF": - break - elif trailer_reached and reading_trailer_comments: - # Load EPS trailer - s = str(bytes_mv[:bytes_read], "latin-1") - _read_comment(s) - elif bytes_mv[:9] == b"%%Trailer": - trailer_reached = True - bytes_read = 0 - - if not self._size: - msg = "cannot determine EPS bounding box" - raise OSError(msg) - - def _find_offset(self, fp): - s = fp.read(4) - - if s == b"%!PS": - # for HEAD without binary preview - fp.seek(0, io.SEEK_END) - length = fp.tell() - offset = 0 - elif i32(s) == 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 - s = fp.read(8) - offset = i32(s) - length = i32(s, 4) - else: - msg = "not an EPS file" - raise SyntaxError(msg) - - return length, offset - - def load(self, scale=1, transparency=False): - # Load EPS via Ghostscript - if self.tile: - self.im = Ghostscript(self.tile, self.size, self.fp, scale, transparency) - self._mode = self.im.mode - self._size = self.im.size - self.tile = [] - return Image.Image.load(self) - - def load_seek(self, pos: int) -> None: - # we can't incrementally load, so force ImageFile.parser to - # use our custom load method by defining this method. - pass - - -# -------------------------------------------------------------------- - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes, eps: int = 1) -> None: - """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, b"image") - elif im.mode == "RGB": - operator = (8, 3, b"false 3 colorimage") - elif im.mode == "CMYK": - operator = (8, 4, b"false 4 colorimage") - else: - msg = "image mode is not supported" - raise ValueError(msg) - - if eps: - # write EPS header - fp.write(b"%!PS-Adobe-3.0 EPSF-3.0\n") - fp.write(b"%%Creator: PIL 0.1 EpsEncode\n") - # fp.write("%%CreationDate: %s"...) - fp.write(b"%%%%BoundingBox: 0 0 %d %d\n" % im.size) - fp.write(b"%%Pages: 1\n") - fp.write(b"%%EndComments\n") - fp.write(b"%%Page: 1 1\n") - fp.write(b"%%ImageData: %d %d " % im.size) - fp.write(b'%d %d 0 1 1 "%s"\n' % operator) - - # image header - fp.write(b"gsave\n") - fp.write(b"10 dict begin\n") - fp.write(b"/buf %d string def\n" % (im.size[0] * operator[1])) - fp.write(b"%d %d scale\n" % im.size) - fp.write(b"%d %d 8\n" % im.size) # <= bits - fp.write(b"[%d 0 0 -%d 0 %d]\n" % (im.size[0], im.size[1], im.size[1])) - fp.write(b"{ currentfile buf readhexstring pop } bind\n") - fp.write(operator[2] + b"\n") - if hasattr(fp, "flush"): - fp.flush() - - ImageFile._save(im, fp, [("eps", (0, 0) + im.size, 0, None)]) - - fp.write(b"\n%%%%EndBinary\n") - fp.write(b"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/.venv/Lib/site-packages/PIL/ExifTags.py b/.venv/Lib/site-packages/PIL/ExifTags.py deleted file mode 100644 index 39b4aa5..0000000 --- a/.venv/Lib/site-packages/PIL/ExifTags.py +++ /dev/null @@ -1,381 +0,0 @@ -# -# 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. -""" -from __future__ import annotations - -from enum import IntEnum - - -class Base(IntEnum): - # possibly incomplete - InteropIndex = 0x0001 - ProcessingSoftware = 0x000B - NewSubfileType = 0x00FE - SubfileType = 0x00FF - ImageWidth = 0x0100 - ImageLength = 0x0101 - BitsPerSample = 0x0102 - Compression = 0x0103 - PhotometricInterpretation = 0x0106 - Thresholding = 0x0107 - CellWidth = 0x0108 - CellLength = 0x0109 - FillOrder = 0x010A - DocumentName = 0x010D - ImageDescription = 0x010E - Make = 0x010F - Model = 0x0110 - StripOffsets = 0x0111 - Orientation = 0x0112 - SamplesPerPixel = 0x0115 - RowsPerStrip = 0x0116 - StripByteCounts = 0x0117 - MinSampleValue = 0x0118 - MaxSampleValue = 0x0119 - XResolution = 0x011A - YResolution = 0x011B - PlanarConfiguration = 0x011C - PageName = 0x011D - FreeOffsets = 0x0120 - FreeByteCounts = 0x0121 - GrayResponseUnit = 0x0122 - GrayResponseCurve = 0x0123 - T4Options = 0x0124 - T6Options = 0x0125 - ResolutionUnit = 0x0128 - PageNumber = 0x0129 - TransferFunction = 0x012D - Software = 0x0131 - DateTime = 0x0132 - Artist = 0x013B - HostComputer = 0x013C - Predictor = 0x013D - WhitePoint = 0x013E - PrimaryChromaticities = 0x013F - ColorMap = 0x0140 - HalftoneHints = 0x0141 - TileWidth = 0x0142 - TileLength = 0x0143 - TileOffsets = 0x0144 - TileByteCounts = 0x0145 - SubIFDs = 0x014A - InkSet = 0x014C - InkNames = 0x014D - NumberOfInks = 0x014E - DotRange = 0x0150 - TargetPrinter = 0x0151 - ExtraSamples = 0x0152 - SampleFormat = 0x0153 - SMinSampleValue = 0x0154 - SMaxSampleValue = 0x0155 - TransferRange = 0x0156 - ClipPath = 0x0157 - XClipPathUnits = 0x0158 - YClipPathUnits = 0x0159 - Indexed = 0x015A - JPEGTables = 0x015B - OPIProxy = 0x015F - JPEGProc = 0x0200 - JpegIFOffset = 0x0201 - JpegIFByteCount = 0x0202 - JpegRestartInterval = 0x0203 - JpegLosslessPredictors = 0x0205 - JpegPointTransforms = 0x0206 - JpegQTables = 0x0207 - JpegDCTables = 0x0208 - JpegACTables = 0x0209 - YCbCrCoefficients = 0x0211 - YCbCrSubSampling = 0x0212 - YCbCrPositioning = 0x0213 - ReferenceBlackWhite = 0x0214 - XMLPacket = 0x02BC - RelatedImageFileFormat = 0x1000 - RelatedImageWidth = 0x1001 - RelatedImageLength = 0x1002 - Rating = 0x4746 - RatingPercent = 0x4749 - ImageID = 0x800D - CFARepeatPatternDim = 0x828D - BatteryLevel = 0x828F - Copyright = 0x8298 - ExposureTime = 0x829A - FNumber = 0x829D - IPTCNAA = 0x83BB - ImageResources = 0x8649 - ExifOffset = 0x8769 - InterColorProfile = 0x8773 - ExposureProgram = 0x8822 - SpectralSensitivity = 0x8824 - GPSInfo = 0x8825 - ISOSpeedRatings = 0x8827 - OECF = 0x8828 - Interlace = 0x8829 - TimeZoneOffset = 0x882A - SelfTimerMode = 0x882B - SensitivityType = 0x8830 - StandardOutputSensitivity = 0x8831 - RecommendedExposureIndex = 0x8832 - ISOSpeed = 0x8833 - ISOSpeedLatitudeyyy = 0x8834 - ISOSpeedLatitudezzz = 0x8835 - ExifVersion = 0x9000 - DateTimeOriginal = 0x9003 - DateTimeDigitized = 0x9004 - OffsetTime = 0x9010 - OffsetTimeOriginal = 0x9011 - OffsetTimeDigitized = 0x9012 - ComponentsConfiguration = 0x9101 - CompressedBitsPerPixel = 0x9102 - ShutterSpeedValue = 0x9201 - ApertureValue = 0x9202 - BrightnessValue = 0x9203 - ExposureBiasValue = 0x9204 - MaxApertureValue = 0x9205 - SubjectDistance = 0x9206 - MeteringMode = 0x9207 - LightSource = 0x9208 - Flash = 0x9209 - FocalLength = 0x920A - Noise = 0x920D - ImageNumber = 0x9211 - SecurityClassification = 0x9212 - ImageHistory = 0x9213 - TIFFEPStandardID = 0x9216 - MakerNote = 0x927C - UserComment = 0x9286 - SubsecTime = 0x9290 - SubsecTimeOriginal = 0x9291 - SubsecTimeDigitized = 0x9292 - AmbientTemperature = 0x9400 - Humidity = 0x9401 - Pressure = 0x9402 - WaterDepth = 0x9403 - Acceleration = 0x9404 - CameraElevationAngle = 0x9405 - XPTitle = 0x9C9B - XPComment = 0x9C9C - XPAuthor = 0x9C9D - XPKeywords = 0x9C9E - XPSubject = 0x9C9F - FlashPixVersion = 0xA000 - ColorSpace = 0xA001 - ExifImageWidth = 0xA002 - ExifImageHeight = 0xA003 - RelatedSoundFile = 0xA004 - ExifInteroperabilityOffset = 0xA005 - FlashEnergy = 0xA20B - SpatialFrequencyResponse = 0xA20C - FocalPlaneXResolution = 0xA20E - FocalPlaneYResolution = 0xA20F - FocalPlaneResolutionUnit = 0xA210 - SubjectLocation = 0xA214 - ExposureIndex = 0xA215 - SensingMethod = 0xA217 - FileSource = 0xA300 - SceneType = 0xA301 - CFAPattern = 0xA302 - CustomRendered = 0xA401 - ExposureMode = 0xA402 - WhiteBalance = 0xA403 - DigitalZoomRatio = 0xA404 - FocalLengthIn35mmFilm = 0xA405 - SceneCaptureType = 0xA406 - GainControl = 0xA407 - Contrast = 0xA408 - Saturation = 0xA409 - Sharpness = 0xA40A - DeviceSettingDescription = 0xA40B - SubjectDistanceRange = 0xA40C - ImageUniqueID = 0xA420 - CameraOwnerName = 0xA430 - BodySerialNumber = 0xA431 - LensSpecification = 0xA432 - LensMake = 0xA433 - LensModel = 0xA434 - LensSerialNumber = 0xA435 - CompositeImage = 0xA460 - CompositeImageCount = 0xA461 - CompositeImageExposureTimes = 0xA462 - Gamma = 0xA500 - PrintImageMatching = 0xC4A5 - DNGVersion = 0xC612 - DNGBackwardVersion = 0xC613 - UniqueCameraModel = 0xC614 - LocalizedCameraModel = 0xC615 - CFAPlaneColor = 0xC616 - CFALayout = 0xC617 - LinearizationTable = 0xC618 - BlackLevelRepeatDim = 0xC619 - BlackLevel = 0xC61A - BlackLevelDeltaH = 0xC61B - BlackLevelDeltaV = 0xC61C - WhiteLevel = 0xC61D - DefaultScale = 0xC61E - DefaultCropOrigin = 0xC61F - DefaultCropSize = 0xC620 - ColorMatrix1 = 0xC621 - ColorMatrix2 = 0xC622 - CameraCalibration1 = 0xC623 - CameraCalibration2 = 0xC624 - ReductionMatrix1 = 0xC625 - ReductionMatrix2 = 0xC626 - AnalogBalance = 0xC627 - AsShotNeutral = 0xC628 - AsShotWhiteXY = 0xC629 - BaselineExposure = 0xC62A - BaselineNoise = 0xC62B - BaselineSharpness = 0xC62C - BayerGreenSplit = 0xC62D - LinearResponseLimit = 0xC62E - CameraSerialNumber = 0xC62F - LensInfo = 0xC630 - ChromaBlurRadius = 0xC631 - AntiAliasStrength = 0xC632 - ShadowScale = 0xC633 - DNGPrivateData = 0xC634 - MakerNoteSafety = 0xC635 - CalibrationIlluminant1 = 0xC65A - CalibrationIlluminant2 = 0xC65B - BestQualityScale = 0xC65C - RawDataUniqueID = 0xC65D - OriginalRawFileName = 0xC68B - OriginalRawFileData = 0xC68C - ActiveArea = 0xC68D - MaskedAreas = 0xC68E - AsShotICCProfile = 0xC68F - AsShotPreProfileMatrix = 0xC690 - CurrentICCProfile = 0xC691 - CurrentPreProfileMatrix = 0xC692 - ColorimetricReference = 0xC6BF - CameraCalibrationSignature = 0xC6F3 - ProfileCalibrationSignature = 0xC6F4 - AsShotProfileName = 0xC6F6 - NoiseReductionApplied = 0xC6F7 - ProfileName = 0xC6F8 - ProfileHueSatMapDims = 0xC6F9 - ProfileHueSatMapData1 = 0xC6FA - ProfileHueSatMapData2 = 0xC6FB - ProfileToneCurve = 0xC6FC - ProfileEmbedPolicy = 0xC6FD - ProfileCopyright = 0xC6FE - ForwardMatrix1 = 0xC714 - ForwardMatrix2 = 0xC715 - PreviewApplicationName = 0xC716 - PreviewApplicationVersion = 0xC717 - PreviewSettingsName = 0xC718 - PreviewSettingsDigest = 0xC719 - PreviewColorSpace = 0xC71A - PreviewDateTime = 0xC71B - RawImageDigest = 0xC71C - OriginalRawFileDigest = 0xC71D - SubTileBlockSize = 0xC71E - RowInterleaveFactor = 0xC71F - ProfileLookTableDims = 0xC725 - ProfileLookTableData = 0xC726 - OpcodeList1 = 0xC740 - OpcodeList2 = 0xC741 - OpcodeList3 = 0xC74E - NoiseProfile = 0xC761 - - -"""Maps EXIF tags to tag names.""" -TAGS = { - **{i.value: i.name for i in Base}, - 0x920C: "SpatialFrequencyResponse", - 0x9214: "SubjectLocation", - 0x9215: "ExposureIndex", - 0x828E: "CFAPattern", - 0x920B: "FlashEnergy", - 0x9216: "TIFF/EPStandardID", -} - - -class GPS(IntEnum): - GPSVersionID = 0 - GPSLatitudeRef = 1 - GPSLatitude = 2 - GPSLongitudeRef = 3 - GPSLongitude = 4 - GPSAltitudeRef = 5 - GPSAltitude = 6 - GPSTimeStamp = 7 - GPSSatellites = 8 - GPSStatus = 9 - GPSMeasureMode = 10 - GPSDOP = 11 - GPSSpeedRef = 12 - GPSSpeed = 13 - GPSTrackRef = 14 - GPSTrack = 15 - GPSImgDirectionRef = 16 - GPSImgDirection = 17 - GPSMapDatum = 18 - GPSDestLatitudeRef = 19 - GPSDestLatitude = 20 - GPSDestLongitudeRef = 21 - GPSDestLongitude = 22 - GPSDestBearingRef = 23 - GPSDestBearing = 24 - GPSDestDistanceRef = 25 - GPSDestDistance = 26 - GPSProcessingMethod = 27 - GPSAreaInformation = 28 - GPSDateStamp = 29 - GPSDifferential = 30 - GPSHPositioningError = 31 - - -"""Maps EXIF GPS tags to tag names.""" -GPSTAGS = {i.value: i.name for i in GPS} - - -class Interop(IntEnum): - InteropIndex = 1 - InteropVersion = 2 - RelatedImageFileFormat = 4096 - RelatedImageWidth = 4097 - RelatedImageHeight = 4098 - - -class IFD(IntEnum): - Exif = 34665 - GPSInfo = 34853 - Makernote = 37500 - Interop = 40965 - IFD1 = -1 - - -class LightSource(IntEnum): - Unknown = 0 - Daylight = 1 - Fluorescent = 2 - Tungsten = 3 - Flash = 4 - Fine = 9 - Cloudy = 10 - Shade = 11 - DaylightFluorescent = 12 - DayWhiteFluorescent = 13 - CoolWhiteFluorescent = 14 - WhiteFluorescent = 15 - StandardLightA = 17 - StandardLightB = 18 - StandardLightC = 19 - D55 = 20 - D65 = 21 - D75 = 22 - D50 = 23 - ISO = 24 - Other = 255 diff --git a/.venv/Lib/site-packages/PIL/FitsImagePlugin.py b/.venv/Lib/site-packages/PIL/FitsImagePlugin.py deleted file mode 100644 index 4846054..0000000 --- a/.venv/Lib/site-packages/PIL/FitsImagePlugin.py +++ /dev/null @@ -1,152 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# FITS file handling -# -# Copyright (c) 1998-2003 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import gzip -import math - -from . import Image, ImageFile - - -def _accept(prefix: bytes) -> bool: - return prefix[:6] == b"SIMPLE" - - -class FitsImageFile(ImageFile.ImageFile): - format = "FITS" - format_description = "FITS" - - def _open(self) -> None: - assert self.fp is not None - - headers: dict[bytes, bytes] = {} - header_in_progress = False - decoder_name = "" - while True: - header = self.fp.read(80) - if not header: - msg = "Truncated FITS file" - raise OSError(msg) - keyword = header[:8].strip() - if keyword in (b"SIMPLE", b"XTENSION"): - header_in_progress = True - elif headers and not header_in_progress: - # This is now a data unit - break - elif keyword == b"END": - # Seek to the end of the header unit - self.fp.seek(math.ceil(self.fp.tell() / 2880) * 2880) - if not decoder_name: - decoder_name, offset, args = self._parse_headers(headers) - - header_in_progress = False - continue - - if decoder_name: - # Keep going to read past the headers - continue - - value = header[8:].split(b"/")[0].strip() - if value.startswith(b"="): - value = value[1:].strip() - if not headers and (not _accept(keyword) or value != b"T"): - msg = "Not a FITS file" - raise SyntaxError(msg) - headers[keyword] = value - - if not decoder_name: - msg = "No image data" - raise ValueError(msg) - - offset += self.fp.tell() - 80 - self.tile = [(decoder_name, (0, 0) + self.size, offset, args)] - - def _get_size( - self, headers: dict[bytes, bytes], prefix: bytes - ) -> tuple[int, int] | None: - naxis = int(headers[prefix + b"NAXIS"]) - if naxis == 0: - return None - - if naxis == 1: - return 1, int(headers[prefix + b"NAXIS1"]) - else: - return int(headers[prefix + b"NAXIS1"]), int(headers[prefix + b"NAXIS2"]) - - def _parse_headers( - self, headers: dict[bytes, bytes] - ) -> tuple[str, int, tuple[str | int, ...]]: - prefix = b"" - decoder_name = "raw" - offset = 0 - if ( - headers.get(b"XTENSION") == b"'BINTABLE'" - and headers.get(b"ZIMAGE") == b"T" - and headers[b"ZCMPTYPE"] == b"'GZIP_1 '" - ): - no_prefix_size = self._get_size(headers, prefix) or (0, 0) - number_of_bits = int(headers[b"BITPIX"]) - offset = no_prefix_size[0] * no_prefix_size[1] * (number_of_bits // 8) - - prefix = b"Z" - decoder_name = "fits_gzip" - - size = self._get_size(headers, prefix) - if not size: - return "", 0, () - - self._size = size - - number_of_bits = int(headers[prefix + b"BITPIX"]) - if number_of_bits == 8: - self._mode = "L" - elif number_of_bits == 16: - self._mode = "I;16" - elif number_of_bits == 32: - self._mode = "I" - elif number_of_bits in (-32, -64): - self._mode = "F" - - args: tuple[str | int, ...] - if decoder_name == "raw": - args = (self.mode, 0, -1) - else: - args = (number_of_bits,) - return decoder_name, offset, args - - -class FitsGzipDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer: bytes) -> tuple[int, int]: - assert self.fd is not None - value = gzip.decompress(self.fd.read()) - - rows = [] - offset = 0 - number_of_bits = min(self.args[0] // 8, 4) - for y in range(self.state.ysize): - row = bytearray() - for x in range(self.state.xsize): - row += value[offset + (4 - number_of_bits) : offset + 4] - offset += 4 - rows.append(row) - self.set_as_raw(bytes([pixel for row in rows[::-1] for pixel in row])) - return -1, 0 - - -# -------------------------------------------------------------------- -# Registry - -Image.register_open(FitsImageFile.format, FitsImageFile, _accept) -Image.register_decoder("fits_gzip", FitsGzipDecoder) - -Image.register_extensions(FitsImageFile.format, [".fit", ".fits"]) diff --git a/.venv/Lib/site-packages/PIL/FliImagePlugin.py b/.venv/Lib/site-packages/PIL/FliImagePlugin.py deleted file mode 100644 index dceb839..0000000 --- a/.venv/Lib/site-packages/PIL/FliImagePlugin.py +++ /dev/null @@ -1,174 +0,0 @@ -# -# 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 __future__ import annotations - -import os - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import i32le as i32 -from ._binary import o8 - -# -# decoder - - -def _accept(prefix: bytes) -> bool: - return ( - len(prefix) >= 6 - and i16(prefix, 4) in [0xAF11, 0xAF12] - and i16(prefix, 14) in [0, 3] # flags - ) - - -## -# 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) - if not (_accept(s) and s[20:22] == b"\x00\x00"): - msg = "not an FLI/FLC file" - raise SyntaxError(msg) - - # frames - self.n_frames = i16(s, 6) - self.is_animated = self.n_frames > 1 - - # image characteristics - self._mode = "P" - self._size = i16(s, 8), i16(s, 10) - - # animation speed - duration = i32(s, 16) - magic = i16(s, 4) - 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) == 0xF100: - # prefix chunk; ignore it - self.__offset = self.__offset + i32(s) - self.fp.seek(self.__offset) - s = self.fp.read(16) - - if i16(s, 4) == 0xF1FA: - # look for palette chunk - number_of_subchunks = i16(s, 6) - chunk_size = None - for _ in range(number_of_subchunks): - if chunk_size is not None: - self.fp.seek(chunk_size - 6, os.SEEK_CUR) - s = self.fp.read(6) - chunk_type = i16(s, 4) - if chunk_type in (4, 11): - self._palette(palette, 2 if chunk_type == 11 else 0) - break - chunk_size = i32(s) - if not chunk_size: - break - - 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 + s[0] - n = s[1] - if n == 0: - n = 256 - s = self.fp.read(n * 3) - for n in range(0, len(s), 3): - r = s[n] << shift - g = s[n + 1] << shift - b = s[n + 2] << shift - palette[i] = (r, g, b) - i += 1 - - def seek(self, frame: int) -> None: - 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: int) -> None: - if frame == 0: - self.__frame = -1 - self._fp.seek(self.__rewind) - self.__offset = 128 - else: - # ensure that the previous frame was loaded - self.load() - - if frame != self.__frame + 1: - msg = f"cannot seek to frame {frame}" - raise ValueError(msg) - self.__frame = frame - - # move to next frame - self.fp = self._fp - self.fp.seek(self.__offset) - - s = self.fp.read(4) - if not s: - msg = "missing frame size" - raise EOFError(msg) - - framesize = i32(s) - - self.decodermaxblock = framesize - self.tile = [("fli", (0, 0) + self.size, self.__offset, None)] - - self.__offset += framesize - - def tell(self) -> int: - return self.__frame - - -# -# registry - -Image.register_open(FliImageFile.format, FliImageFile, _accept) - -Image.register_extensions(FliImageFile.format, [".fli", ".flc"]) diff --git a/.venv/Lib/site-packages/PIL/FontFile.py b/.venv/Lib/site-packages/PIL/FontFile.py deleted file mode 100644 index 1e0c1c1..0000000 --- a/.venv/Lib/site-packages/PIL/FontFile.py +++ /dev/null @@ -1,134 +0,0 @@ -# -# 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 annotations - -import os -from typing import BinaryIO - -from . import Image, _binary - -WIDTH = 800 - - -def puti16( - fp: BinaryIO, values: tuple[int, int, int, int, int, int, int, int, int, int] -) -> None: - """Write network order (big-endian) 16-bit sequence""" - for v in values: - if v < 0: - v += 65536 - fp.write(_binary.o16be(v)) - - -class FontFile: - """Base class for raster font file handlers.""" - - bitmap: Image.Image | None = None - - def __init__(self) -> None: - self.info: dict[bytes, bytes | int] = {} - self.glyph: list[ - tuple[ - tuple[int, int], - tuple[int, int, int, int], - tuple[int, int, int, int], - Image.Image, - ] - | None - ] = [None] * 256 - - def __getitem__(self, ix: int) -> ( - tuple[ - tuple[int, int], - tuple[int, int, int, int], - tuple[int, int, int, int], - Image.Image, - ] - | None - ): - return self.glyph[ix] - - def compile(self) -> None: - """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.glyph: - 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: list[ - tuple[tuple[int, int], tuple[int, int, int, int], tuple[int, int, int, int]] - | None - ] = [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] - 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) - self.metrics[i] = d, dst, s - - def save(self, filename: str) -> None: - """Save font""" - - self.compile() - - # font data - if not self.bitmap: - msg = "No bitmap created" - raise ValueError(msg) - 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(f";;;;;;{self.ysize};\n".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/.venv/Lib/site-packages/PIL/FpxImagePlugin.py b/.venv/Lib/site-packages/PIL/FpxImagePlugin.py deleted file mode 100644 index c1927bd..0000000 --- a/.venv/Lib/site-packages/PIL/FpxImagePlugin.py +++ /dev/null @@ -1,255 +0,0 @@ -# -# 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 annotations - -import olefile - -from . import Image, ImageFile -from ._binary import i32le as i32 - -# 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: bytes) -> bool: - 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 OSError as e: - msg = "not an FPX file; invalid OLE file" - raise SyntaxError(msg) from e - - if self.ole.root.clsid != "56616700-C154-11CE-8553-00AA00A1F95B": - msg = "not an FPX file; bad root CLSID" - raise SyntaxError(msg) - - self._open_index(1) - - def _open_index(self, index: int = 1) -> None: - # - # get the Image Contents Property Set - - prop = self.ole.getproperties( - [f"Data Object Store {index:06d}", "\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] - - bands = i32(s, 4) - if bands > 4: - msg = "Invalid number of bands" - raise OSError(msg) - - # note: for now, we ignore the "uncalibrated" flag - colors = tuple(i32(s, 8 + i * 4) & 0x7FFFFFFF for i in range(bands)) - - self._mode, self.rawmode = MODES[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] - - self._open_subimage(1, self.maxid) - - def _open_subimage(self, index: int = 1, subimage: int = 0) -> None: - # - # setup tile descriptors for a given subimage - - stream = [ - f"Data Object Store {index:06d}", - f"Resolution {subimage:04d}", - "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) - - if size != self.size: - msg = "subimage mismatch" - raise OSError(msg) - - # 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): - x1 = min(xsize, x + xtile) - y1 = min(ysize, y + ytile) - - compression = i32(s, i + 8) - - if compression == 0: - self.tile.append( - ( - "raw", - (x, y, x1, y1), - i32(s, i) + 28, - (self.rawmode,), - ) - ) - - elif compression == 1: - # FIXME: the fill decoder is not implemented - self.tile.append( - ( - "fill", - (x, y, x1, y1), - i32(s, i) + 28, - (self.rawmode, s[12:16]), - ) - ) - - elif compression == 2: - internal_color_conversion = s[14] - jpeg_tables = 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, x1, y1), - 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: - msg = "unknown/invalid compression" - raise OSError(msg) - - x = x + xtile - if x >= xsize: - x, y = 0, y + ytile - if y >= ysize: - break # isn't really required - - self.stream = stream - self._fp = self.fp - 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) - - def close(self) -> None: - self.ole.close() - super().close() - - def __exit__(self, *args: object) -> None: - self.ole.close() - super().__exit__() - - -# -# -------------------------------------------------------------------- - - -Image.register_open(FpxImageFile.format, FpxImageFile, _accept) - -Image.register_extension(FpxImageFile.format, ".fpx") diff --git a/.venv/Lib/site-packages/PIL/FtexImagePlugin.py b/.venv/Lib/site-packages/PIL/FtexImagePlugin.py deleted file mode 100644 index 5acbb49..0000000 --- a/.venv/Lib/site-packages/PIL/FtexImagePlugin.py +++ /dev/null @@ -1,115 +0,0 @@ -""" -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. -""" - -from __future__ import annotations - -import struct -from enum import IntEnum -from io import BytesIO - -from . import Image, ImageFile - -MAGIC = b"FTEX" - - -class Format(IntEnum): - DXT1 = 0 - UNCOMPRESSED = 1 - - -class FtexImageFile(ImageFile.ImageFile): - format = "FTEX" - format_description = "Texture File Format (IW2:EOC)" - - def _open(self) -> None: - if not _accept(self.fp.read(4)): - msg = "not an FTEX file" - raise SyntaxError(msg) - struct.unpack(" None: - pass - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == MAGIC - - -Image.register_open(FtexImageFile.format, FtexImageFile, _accept) -Image.register_extensions(FtexImageFile.format, [".ftc", ".ftu"]) diff --git a/.venv/Lib/site-packages/PIL/GbrImagePlugin.py b/.venv/Lib/site-packages/PIL/GbrImagePlugin.py deleted file mode 100644 index 93e89b1..0000000 --- a/.venv/Lib/site-packages/PIL/GbrImagePlugin.py +++ /dev/null @@ -1,103 +0,0 @@ -# -# The Python Imaging Library -# -# load a GIMP brush file -# -# History: -# 96-03-14 fl Created -# 16-01-08 es Version 2 -# -# Copyright (c) Secret Labs AB 1997. -# Copyright (c) Fredrik Lundh 1996. -# Copyright (c) Eric Soroos 2016. -# -# See the README file for information on usage and redistribution. -# -# -# See https://github.com/GNOME/gimp/blob/mainline/devel-docs/gbr.txt for -# format documentation. -# -# This code Interprets version 1 and 2 .gbr files. -# Version 1 files are obsolete, and should not be used for new -# brushes. -# Version 2 files are saved by GIMP v2.8 (at least) -# Version 3 files have a format specifier of 18 for 16bit floats in -# the color depth field. This is currently unsupported by Pillow. -from __future__ import annotations - -from . import Image, ImageFile -from ._binary import i32be as i32 - - -def _accept(prefix: bytes) -> bool: - return len(prefix) >= 8 and i32(prefix, 0) >= 20 and i32(prefix, 4) in (1, 2) - - -## -# Image plugin for the GIMP brush format. - - -class GbrImageFile(ImageFile.ImageFile): - format = "GBR" - format_description = "GIMP brush file" - - def _open(self) -> None: - header_size = i32(self.fp.read(4)) - if header_size < 20: - msg = "not a GIMP brush" - raise SyntaxError(msg) - version = i32(self.fp.read(4)) - if version not in (1, 2): - msg = f"Unsupported GIMP brush version: {version}" - raise SyntaxError(msg) - - 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: - msg = "not a GIMP brush" - raise SyntaxError(msg) - if color_depth not in (1, 4): - msg = f"Unsupported GIMP brush color depth: {color_depth}" - raise SyntaxError(msg) - - 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": - msg = "not a GIMP brush, bad magic number" - raise SyntaxError(msg) - 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): - if not self.im: - self.im = Image.core.new(self.mode, self.size) - self.frombytes(self.fp.read(self._data_size)) - return Image.Image.load(self) - - -# -# registry - - -Image.register_open(GbrImageFile.format, GbrImageFile, _accept) -Image.register_extension(GbrImageFile.format, ".gbr") diff --git a/.venv/Lib/site-packages/PIL/GdImageFile.py b/.venv/Lib/site-packages/PIL/GdImageFile.py deleted file mode 100644 index 88b87a2..0000000 --- a/.venv/Lib/site-packages/PIL/GdImageFile.py +++ /dev/null @@ -1,102 +0,0 @@ -# -# 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 :py:func:`PIL.Image.open()`. To open a - gd file, use the :py:func:`PIL.GdImageFile.open()` function instead. - -.. warning:: - THE GD FORMAT IS NOT DESIGNED FOR DATA INTERCHANGE. This - implementation is provided for convenience and demonstrational - purposes only. -""" -from __future__ import annotations - -from typing import IO - -from . import ImageFile, ImagePalette, UnidentifiedImageError -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._typing import StrOrBytesPath - - -class GdImageFile(ImageFile.ImageFile): - """ - Image plugin for the GD uncompressed format. Note that this format - is not supported by the standard :py:func:`PIL.Image.open()` function. To use - this plugin, you have to import the :py:mod:`PIL.GdImageFile` module and - use the :py:func:`PIL.GdImageFile.open()` function. - """ - - format = "GD" - format_description = "GD uncompressed images" - - def _open(self) -> None: - # Header - assert self.fp is not None - - s = self.fp.read(1037) - - if i16(s) not in [65534, 65535]: - msg = "Not a valid GD 2.x .gd file" - raise SyntaxError(msg) - - self._mode = "L" # FIXME: "P" - self._size = i16(s, 2), i16(s, 4) - - true_color = s[6] - true_color_offset = 2 if true_color else 0 - - # transparency index - tindex = i32(s, 7 + true_color_offset) - if tindex < 256: - self.info["transparency"] = tindex - - self.palette = ImagePalette.raw( - "XBGR", s[7 + true_color_offset + 4 : 7 + true_color_offset + 4 + 256 * 4] - ) - - self.tile = [ - ( - "raw", - (0, 0) + self.size, - 7 + true_color_offset + 4 + 256 * 4, - ("L", 0, 1), - ) - ] - - -def open(fp: StrOrBytesPath | IO[bytes], mode: str = "r") -> GdImageFile: - """ - Load texture from a GD image file. - - :param fp: 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 OSError: If the image could not be read. - """ - if mode != "r": - msg = "bad mode" - raise ValueError(msg) - - try: - return GdImageFile(fp) - except SyntaxError as e: - msg = "cannot identify this image file" - raise UnidentifiedImageError(msg) from e diff --git a/.venv/Lib/site-packages/PIL/GifImagePlugin.py b/.venv/Lib/site-packages/PIL/GifImagePlugin.py deleted file mode 100644 index 284128c..0000000 --- a/.venv/Lib/site-packages/PIL/GifImagePlugin.py +++ /dev/null @@ -1,1159 +0,0 @@ -# -# 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 __future__ import annotations - -import itertools -import math -import os -import subprocess -import sys -from enum import IntEnum -from functools import cached_property -from typing import IO, TYPE_CHECKING, Any, List, Literal, NamedTuple, Union - -from . import ( - Image, - ImageChops, - ImageFile, - ImageMath, - ImageOps, - ImagePalette, - ImageSequence, -) -from ._binary import i16le as i16 -from ._binary import o8 -from ._binary import o16le as o16 - -if TYPE_CHECKING: - from . import _imaging - - -class LoadingStrategy(IntEnum): - """.. versionadded:: 9.1.0""" - - RGB_AFTER_FIRST = 0 - RGB_AFTER_DIFFERENT_PALETTE_ONLY = 1 - RGB_ALWAYS = 2 - - -#: .. versionadded:: 9.1.0 -LOADING_STRATEGY = LoadingStrategy.RGB_AFTER_FIRST - -# -------------------------------------------------------------------- -# Identify/read GIF files - - -def _accept(prefix: bytes) -> bool: - 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) -> bytes | None: - s = self.fp.read(1) - if s and s[0]: - return self.fp.read(s[0]) - return None - - def _is_palette_needed(self, p: bytes) -> bool: - for i in range(0, len(p), 3): - if not (i // 3 == p[i] == p[i + 1] == p[i + 2]): - return True - return False - - def _open(self) -> None: - # Screen - s = self.fp.read(13) - if not _accept(s): - msg = "not a GIF file" - raise SyntaxError(msg) - - self.info["version"] = s[:6] - self._size = i16(s, 6), i16(s, 8) - self.tile = [] - flags = s[10] - bits = (flags & 7) + 1 - - if flags & 128: - # get global palette - self.info["background"] = s[11] - # check if palette contains colour indices - p = self.fp.read(3 << bits) - if self._is_palette_needed(p): - p = ImagePalette.raw("RGB", p) - self.global_palette = self.palette = p - - self._fp = self.fp # FIXME: hack - self.__rewind = self.fp.tell() - self._n_frames: int | None = None - self._seek(0) # get ready to read first frame - - @property - def n_frames(self) -> int: - if self._n_frames is None: - current = self.tell() - try: - while True: - self._seek(self.tell() + 1, False) - except EOFError: - self._n_frames = self.tell() + 1 - self.seek(current) - return self._n_frames - - @cached_property - def is_animated(self) -> bool: - if self._n_frames is not None: - return self._n_frames != 1 - - current = self.tell() - if current: - return True - - try: - self._seek(1, False) - is_animated = True - except EOFError: - is_animated = False - - self.seek(current) - return is_animated - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - if frame < self.__frame: - self.im = None - self._seek(0) - - last_frame = self.__frame - for f in range(self.__frame + 1, frame + 1): - try: - self._seek(f) - except EOFError as e: - self.seek(last_frame) - msg = "no more images in GIF file" - raise EOFError(msg) from e - - def _seek(self, frame: int, update_image: bool = True) -> None: - if frame == 0: - # rewind - self.__offset = 0 - self.dispose: _imaging.ImagingCore | None = None - self.__frame = -1 - self._fp.seek(self.__rewind) - self.disposal_method = 0 - if "comment" in self.info: - del self.info["comment"] - else: - # ensure that the previous frame was loaded - if self.tile and update_image: - self.load() - - if frame != self.__frame + 1: - msg = f"cannot seek to frame {frame}" - raise ValueError(msg) - - self.fp = self._fp - if self.__offset: - # backup to last frame - self.fp.seek(self.__offset) - while self.data(): - pass - self.__offset = 0 - - s = self.fp.read(1) - if not s or s == b";": - msg = "no more images in GIF file" - raise EOFError(msg) - - palette: ImagePalette.ImagePalette | Literal[False] | None = None - - info: dict[str, Any] = {} - frame_transparency = None - interlace = None - frame_dispose_extent = None - while True: - if not s: - 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 s[0] == 249 and block is not None: - # - # graphic control extension - # - flags = block[0] - if flags & 1: - frame_transparency = block[3] - info["duration"] = i16(block, 1) * 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 s[0] == 254: - # - # comment extension - # - comment = b"" - - # Read this comment block - while block: - comment += block - block = self.data() - - if "comment" in info: - # If multiple comment blocks in frame, separate with \n - info["comment"] += b"\n" + comment - else: - info["comment"] = comment - s = None - continue - elif s[0] == 255 and frame == 0 and block is not None: - # - # application extension - # - info["extension"] = block, self.fp.tell() - if block[:11] == b"NETSCAPE2.0": - block = self.data() - if block and len(block) >= 3 and block[0] == 1: - self.info["loop"] = i16(block, 1) - 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) - if (x1 > self.size[0] or y1 > self.size[1]) and update_image: - self._size = max(x1, self.size[0]), max(y1, self.size[1]) - Image._decompression_bomb_check(self._size) - frame_dispose_extent = x0, y0, x1, y1 - flags = s[8] - - interlace = (flags & 64) != 0 - - if flags & 128: - bits = (flags & 7) + 1 - p = self.fp.read(3 << bits) - if self._is_palette_needed(p): - palette = ImagePalette.raw("RGB", p) - else: - palette = False - - # image data - bits = self.fp.read(1)[0] - self.__offset = self.fp.tell() - break - s = None - - if interlace is None: - msg = "image not found in GIF frame" - raise EOFError(msg) - - self.__frame = frame - if not update_image: - return - - self.tile = [] - - if self.dispose: - self.im.paste(self.dispose, self.dispose_extent) - - self._frame_palette = palette if palette is not None else self.global_palette - self._frame_transparency = frame_transparency - if frame == 0: - if self._frame_palette: - if LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS: - self._mode = "RGBA" if frame_transparency is not None else "RGB" - else: - self._mode = "P" - else: - self._mode = "L" - - if not palette and self.global_palette: - from copy import copy - - palette = copy(self.global_palette) - self.palette = palette - else: - if self.mode == "P": - if ( - LOADING_STRATEGY != LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY - or palette - ): - self.pyaccess = None - if "transparency" in self.info: - self.im.putpalettealpha(self.info["transparency"], 0) - self.im = self.im.convert("RGBA", Image.Dither.FLOYDSTEINBERG) - self._mode = "RGBA" - del self.info["transparency"] - else: - self._mode = "RGB" - self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG) - - def _rgb(color: int) -> tuple[int, int, int]: - if self._frame_palette: - if color * 3 + 3 > len(self._frame_palette.palette): - color = 0 - return tuple(self._frame_palette.palette[color * 3 : color * 3 + 3]) - else: - return (color, color, color) - - self.dispose = None - self.dispose_extent = frame_dispose_extent - if self.dispose_extent and self.disposal_method >= 2: - try: - if self.disposal_method == 2: - # replace with background colour - - # only dispose the extent in this frame - x0, y0, x1, y1 = self.dispose_extent - dispose_size = (x1 - x0, y1 - y0) - - Image._decompression_bomb_check(dispose_size) - - # by convention, attempt to use transparency first - dispose_mode = "P" - color = self.info.get("transparency", frame_transparency) - if color is not None: - if self.mode in ("RGB", "RGBA"): - dispose_mode = "RGBA" - color = _rgb(color) + (0,) - else: - color = self.info.get("background", 0) - if self.mode in ("RGB", "RGBA"): - dispose_mode = "RGB" - color = _rgb(color) - self.dispose = Image.core.fill(dispose_mode, dispose_size, color) - else: - # replace with previous contents - if self.im is not None: - # only dispose the extent in this frame - self.dispose = self._crop(self.im, self.dispose_extent) - elif frame_transparency is not None: - x0, y0, x1, y1 = self.dispose_extent - dispose_size = (x1 - x0, y1 - y0) - - Image._decompression_bomb_check(dispose_size) - dispose_mode = "P" - color = frame_transparency - if self.mode in ("RGB", "RGBA"): - dispose_mode = "RGBA" - color = _rgb(frame_transparency) + (0,) - self.dispose = Image.core.fill( - dispose_mode, dispose_size, color - ) - except AttributeError: - pass - - if interlace is not None: - transparency = -1 - if frame_transparency is not None: - if frame == 0: - if LOADING_STRATEGY != LoadingStrategy.RGB_ALWAYS: - self.info["transparency"] = frame_transparency - elif self.mode not in ("RGB", "RGBA"): - transparency = frame_transparency - self.tile = [ - ( - "gif", - (x0, y0, x1, y1), - self.__offset, - (bits, interlace, transparency), - ) - ] - - if info.get("comment"): - self.info["comment"] = info["comment"] - for k in ["duration", "extension"]: - if k in info: - self.info[k] = info[k] - elif k in self.info: - del self.info[k] - - def load_prepare(self) -> None: - temp_mode = "P" if self._frame_palette else "L" - self._prev_im = None - if self.__frame == 0: - if self._frame_transparency is not None: - self.im = Image.core.fill( - temp_mode, self.size, self._frame_transparency - ) - elif self.mode in ("RGB", "RGBA"): - self._prev_im = self.im - if self._frame_palette: - self.im = Image.core.fill("P", self.size, self._frame_transparency or 0) - self.im.putpalette("RGB", *self._frame_palette.getdata()) - else: - self.im = None - self._mode = temp_mode - self._frame_palette = None - - super().load_prepare() - - def load_end(self) -> None: - if self.__frame == 0: - if self.mode == "P" and LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS: - if self._frame_transparency is not None: - self.im.putpalettealpha(self._frame_transparency, 0) - self._mode = "RGBA" - else: - self._mode = "RGB" - self.im = self.im.convert(self.mode, Image.Dither.FLOYDSTEINBERG) - return - if not self._prev_im: - return - if self._frame_transparency is not None: - self.im.putpalettealpha(self._frame_transparency, 0) - frame_im = self.im.convert("RGBA") - else: - frame_im = self.im.convert("RGB") - - assert self.dispose_extent is not None - frame_im = self._crop(frame_im, self.dispose_extent) - - self.im = self._prev_im - self._mode = self.im.mode - if frame_im.mode == "RGBA": - self.im.paste(frame_im, self.dispose_extent, frame_im) - else: - self.im.paste(frame_im, self.dispose_extent) - - def tell(self) -> int: - return self.__frame - - -# -------------------------------------------------------------------- -# Write GIF files - - -RAWMODE = {"1": "L", "L": "L", "P": "P"} - - -def _normalize_mode(im: Image.Image) -> Image.Image: - """ - 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. - - :param im: Image object - :returns: Image object - """ - if im.mode in RAWMODE: - im.load() - return im - if Image.getmodebase(im.mode) == "RGB": - im = im.convert("P", palette=Image.Palette.ADAPTIVE) - if im.palette.mode == "RGBA": - for rgba in im.palette.colors: - if rgba[3] == 0: - im.info["transparency"] = im.palette.colors[rgba] - break - return im - return im.convert("L") - - -_Palette = Union[bytes, bytearray, List[int], ImagePalette.ImagePalette] - - -def _normalize_palette( - im: Image.Image, palette: _Palette | None, info: dict[str, Any] -) -> Image.Image: - """ - 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(palette.palette) - - 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: list[int] | None - if palette: - used_palette_colors = [] - assert source_palette is not None - for i in range(0, len(source_palette), 3): - source_color = tuple(source_palette[i : i + 3]) - index = im.palette.colors.get(source_color) - if index in used_palette_colors: - index = None - used_palette_colors.append(index) - for i, index in enumerate(used_palette_colors): - if index is None: - for j in range(len(used_palette_colors)): - if j not in used_palette_colors: - used_palette_colors[i] = j - break - im = im.remap_palette(used_palette_colors) - else: - used_palette_colors = _get_optimize(im, info) - if used_palette_colors is not None: - im = im.remap_palette(used_palette_colors, source_palette) - if "transparency" in info: - try: - info["transparency"] = used_palette_colors.index( - info["transparency"] - ) - except ValueError: - del info["transparency"] - return im - - im.palette.palette = source_palette - return im - - -def _write_single_frame( - im: Image.Image, - fp: IO[bytes], - palette: _Palette | None, -) -> None: - im_out = _normalize_mode(im) - for k, v in im_out.info.items(): - im.encoderinfo.setdefault(k, v) - 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 _getbbox( - base_im: Image.Image, im_frame: Image.Image -) -> tuple[Image.Image, tuple[int, int, int, int] | None]: - if _get_palette_bytes(im_frame) != _get_palette_bytes(base_im): - im_frame = im_frame.convert("RGBA") - base_im = base_im.convert("RGBA") - delta = ImageChops.subtract_modulo(im_frame, base_im) - return delta, delta.getbbox(alpha_only=False) - - -class _Frame(NamedTuple): - im: Image.Image - bbox: tuple[int, int, int, int] | None - encoderinfo: dict[str, Any] - - -def _write_multiple_frames( - im: Image.Image, fp: IO[bytes], palette: _Palette | None -) -> bool: - duration = im.encoderinfo.get("duration") - disposal = im.encoderinfo.get("disposal", im.info.get("disposal")) - - im_frames: list[_Frame] = [] - previous_im: Image.Image | None = None - frame_count = 0 - background_im = None - for imSequence in itertools.chain([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()) - if frame_count == 0: - for k, v in im_frame.info.items(): - if k == "transparency": - continue - im.encoderinfo.setdefault(k, v) - - encoderinfo = im.encoderinfo.copy() - if "transparency" in im_frame.info: - encoderinfo.setdefault("transparency", im_frame.info["transparency"]) - im_frame = _normalize_palette(im_frame, palette, encoderinfo) - if isinstance(duration, (list, tuple)): - encoderinfo["duration"] = duration[frame_count] - elif duration is None and "duration" in im_frame.info: - encoderinfo["duration"] = im_frame.info["duration"] - if isinstance(disposal, (list, tuple)): - encoderinfo["disposal"] = disposal[frame_count] - frame_count += 1 - - diff_frame = None - if im_frames and previous_im: - # delta frame - delta, bbox = _getbbox(previous_im, im_frame) - if not bbox: - # This frame is identical to the previous frame - if encoderinfo.get("duration"): - im_frames[-1].encoderinfo["duration"] += encoderinfo["duration"] - continue - if im_frames[-1].encoderinfo.get("disposal") == 2: - if background_im is None: - color = im.encoderinfo.get( - "transparency", im.info.get("transparency", (0, 0, 0)) - ) - background = _get_background(im_frame, color) - background_im = Image.new("P", im_frame.size, background) - background_im.putpalette(im_frames[0].im.palette) - bbox = _getbbox(background_im, im_frame)[1] - elif encoderinfo.get("optimize") and im_frame.mode != "1": - if "transparency" not in encoderinfo: - try: - encoderinfo["transparency"] = ( - im_frame.palette._new_color_index(im_frame) - ) - except ValueError: - pass - if "transparency" in encoderinfo: - # When the delta is zero, fill the image with transparency - diff_frame = im_frame.copy() - fill = Image.new("P", delta.size, encoderinfo["transparency"]) - if delta.mode == "RGBA": - r, g, b, a = delta.split() - mask = ImageMath.lambda_eval( - lambda args: args["convert"]( - args["max"]( - args["max"]( - args["max"](args["r"], args["g"]), args["b"] - ), - args["a"], - ) - * 255, - "1", - ), - r=r, - g=g, - b=b, - a=a, - ) - else: - if delta.mode == "P": - # Convert to L without considering palette - delta_l = Image.new("L", delta.size) - delta_l.putdata(delta.getdata()) - delta = delta_l - mask = ImageMath.lambda_eval( - lambda args: args["convert"](args["im"] * 255, "1"), - im=delta, - ) - diff_frame.paste(fill, mask=ImageOps.invert(mask)) - else: - bbox = None - previous_im = im_frame - im_frames.append(_Frame(diff_frame or im_frame, bbox, encoderinfo)) - - if len(im_frames) == 1: - if "duration" in im.encoderinfo: - # Since multiple frames will not be written, use the combined duration - im.encoderinfo["duration"] = im_frames[0].encoderinfo["duration"] - return False - - 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 - if not palette: - 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: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - _save(im, fp, filename, save_all=True) - - -def _save( - im: Image.Image, fp: IO[bytes], filename: str | bytes, save_all: bool = False -) -> None: - # header - if "palette" in im.encoderinfo or "palette" in im.info: - palette = im.encoderinfo.get("palette", im.info.get("palette")) - else: - palette = None - im.encoderinfo.setdefault("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: Image.Image) -> int: - interlace = im.encoderinfo.get("interlace", 1) - - # workaround for @PIL153 - if min(im.size) < 16: - interlace = 0 - - return interlace - - -def _write_local_header( - fp: IO[bytes], im: Image.Image, offset: tuple[int, int], flags: int -) -> None: - try: - transparency = im.encoderinfo["transparency"] - except KeyError: - transparency = None - - if "duration" in im.encoderinfo: - duration = int(im.encoderinfo["duration"] / 10) - else: - duration = 0 - - disposal = int(im.encoderinfo.get("disposal", 0)) - - if transparency is not None or duration != 0 or disposal: - packed_flag = 1 if transparency is not None else 0 - packed_flag |= disposal << 2 - - fp.write( - b"!" - + o8(249) # extension intro - + o8(4) # length - + o8(packed_flag) # packed fields - + o16(duration) # duration - + o8(transparency or 0) # transparency index - + o8(0) - ) - - include_color_table = im.encoderinfo.get("include_color_table") - if include_color_table: - 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: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - # 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. - tempfile = im._dump() - - try: - with open(filename, "wb") as f: - if im.mode != "RGB": - subprocess.check_call( - ["ppmtogif", tempfile], stdout=f, stderr=subprocess.DEVNULL - ) - else: - # Pipe ppmquant output into ppmtogif - # "ppmquant 256 %s | ppmtogif > %s" % (tempfile, filename) - quant_cmd = ["ppmquant", "256", tempfile] - togif_cmd = ["ppmtogif"] - quant_proc = subprocess.Popen( - quant_cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL - ) - togif_proc = subprocess.Popen( - togif_cmd, - stdin=quant_proc.stdout, - stdout=f, - stderr=subprocess.DEVNULL, - ) - - # Allow ppmquant to receive SIGPIPE if ppmtogif exits - assert quant_proc.stdout is not None - quant_proc.stdout.close() - - retcode = quant_proc.wait() - if retcode: - raise subprocess.CalledProcessError(retcode, quant_cmd) - - retcode = togif_proc.wait() - if retcode: - raise subprocess.CalledProcessError(retcode, togif_cmd) - finally: - try: - os.unlink(tempfile) - 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: Image.Image, info: dict[str, Any]) -> list[int] | None: - """ - 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"): - # 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 max(used_palette_colors) >= len(used_palette_colors): - return used_palette_colors - - num_palette_colors = len(im.palette.palette) // Image.getmodebands( - im.palette.mode - ) - current_palette_size = 1 << (num_palette_colors - 1).bit_length() - if ( - # check that the palette would become smaller when saved - len(used_palette_colors) <= current_palette_size // 2 - # check that the palette is not already the smallest possible size - and current_palette_size > 2 - ): - return used_palette_colors - return None - - -def _get_color_table_size(palette_bytes: bytes) -> int: - # calculate the palette size for the header - if not palette_bytes: - return 0 - elif len(palette_bytes) < 9: - return 1 - else: - return math.ceil(math.log(len(palette_bytes) // 3, 2)) - 1 - - -def _get_header_palette(palette_bytes: bytes) -> 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: Image.Image) -> bytes: - """ - 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 if im.palette else b"" - - -def _get_background( - im: Image.Image, - info_background: int | tuple[int, int, int] | tuple[int, int, int, int] | None, -) -> int: - background = 0 - if info_background: - if isinstance(info_background, tuple): - # WebPImagePlugin stores an RGBA value in info["background"] - # So it must be converted to the same format as GifImagePlugin's - # info["background"] - a global color table index - try: - background = im.palette.getcolor(info_background, im) - except ValueError as e: - if str(e) not in ( - # If all 256 colors are in use, - # then there is no need for the background color - "cannot allocate more than 256 colors", - # Ignore non-opaque WebP background - "cannot add non-opaque RGBA color to RGB palette", - ): - raise - else: - background = info_background - return background - - -def _get_global_header(im: Image.Image, info: dict[str, Any]) -> list[bytes]: - """Return a list of strings representing a GIF header""" - - # Header Block - # https://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp - - version = b"87a" - if im.info.get("version") == b"89a" or ( - info - and ( - "transparency" in info - or info.get("loop") is not None - or info.get("duration") - or info.get("comment") - ) - ): - version = b"89a" - - background = _get_background(im, info.get("background")) - - palette_bytes = _get_palette_bytes(im) - color_table_size = _get_color_table_size(palette_bytes) - - header = [ - b"GIF" # signature - + version # 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), - ] - if info.get("loop") is not None: - header.append( - b"!" - + o8(255) # extension intro - + o8(11) - + b"NETSCAPE2.0" - + o8(3) - + o8(1) - + o16(info["loop"]) # number of loops - + o8(0) - ) - if info.get("comment"): - comment_block = b"!" + o8(254) # extension intro - - comment = info["comment"] - if isinstance(comment, str): - comment = comment.encode() - for i in range(0, len(comment), 255): - subblock = comment[i : i + 255] - comment_block += o8(len(subblock)) + subblock - - comment_block += o8(0) - header.append(comment_block) - return header - - -def _write_frame_data( - fp: IO[bytes], - im_frame: Image.Image, - offset: tuple[int, int], - params: dict[str, Any], -) -> None: - 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: Image.Image, palette: _Palette | None = None, info: dict[str, Any] | None = None -) -> tuple[list[bytes], list[int] | 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) - - """ - if info is None: - info = {} - - used_palette_colors = _get_optimize(im, 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 - - -def getdata( - im: Image.Image, offset: tuple[int, int] = (0, 0), **params: Any -) -> list[bytes]: - """ - Legacy Method - - Return a list of strings representing this image. - The first string is a local image header, the rest contains - encoded image data. - - To specify duration, add the time in milliseconds, - e.g. ``getdata(im_frame, duration=1000)`` - - :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 - - """ - from io import BytesIO - - class Collector(BytesIO): - data = [] - - if sys.version_info >= (3, 12): - from collections.abc import Buffer - - def write(self, data: Buffer) -> int: - self.data.append(data) - return len(data) - - else: - - def write(self, data: Any) -> int: - self.data.append(data) - return len(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/.venv/Lib/site-packages/PIL/GimpGradientFile.py b/.venv/Lib/site-packages/PIL/GimpGradientFile.py deleted file mode 100644 index 220eac5..0000000 --- a/.venv/Lib/site-packages/PIL/GimpGradientFile.py +++ /dev/null @@ -1,149 +0,0 @@ -# -# 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. -# - -""" -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.) -""" -from __future__ import annotations - -from math import log, pi, sin, sqrt -from typing import IO, Callable - -from ._binary import o8 - -EPSILON = 1e-10 -"""""" # Enable auto-doc for data member - - -def linear(middle: float, pos: float) -> float: - 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: float, pos: float) -> float: - return pos ** (log(0.5) / log(max(middle, EPSILON))) - - -def sine(middle: float, pos: float) -> float: - return (sin((-pi / 2.0) + pi * linear(middle, pos)) + 1.0) / 2.0 - - -def sphere_increasing(middle: float, pos: float) -> float: - return sqrt(1.0 - (linear(middle, pos) - 1.0) ** 2) - - -def sphere_decreasing(middle: float, pos: float) -> float: - return 1.0 - sqrt(1.0 - linear(middle, pos) ** 2) - - -SEGMENTS = [linear, curved, sine, sphere_increasing, sphere_decreasing] -"""""" # Enable auto-doc for data member - - -class GradientFile: - gradient: ( - list[ - tuple[ - float, - float, - float, - list[float], - list[float], - Callable[[float, float], float], - ] - ] - | None - ) = None - - def getpalette(self, entries: int = 256) -> tuple[bytes, str]: - assert self.gradient is not None - palette = [] - - ix = 0 - x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] - - for i in range(entries): - x = i / (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" - - -class GimpGradientFile(GradientFile): - """File handler for GIMP's gradient format.""" - - def __init__(self, fp: IO[bytes]) -> None: - if fp.readline()[:13] != b"GIMP Gradient": - msg = "not a GIMP gradient file" - raise SyntaxError(msg) - - 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) - - self.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: - msg = "cannot handle HSV colour space" - raise OSError(msg) - - self.gradient.append((x0, x1, xm, rgb0, rgb1, segment)) diff --git a/.venv/Lib/site-packages/PIL/GimpPaletteFile.py b/.venv/Lib/site-packages/PIL/GimpPaletteFile.py deleted file mode 100644 index 4cad0eb..0000000 --- a/.venv/Lib/site-packages/PIL/GimpPaletteFile.py +++ /dev/null @@ -1,58 +0,0 @@ -# -# 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. -# -from __future__ import annotations - -import re -from typing import IO - -from ._binary import o8 - - -class GimpPaletteFile: - """File handler for GIMP's palette format.""" - - rawmode = "RGB" - - def __init__(self, fp: IO[bytes]) -> None: - palette = [o8(i) * 3 for i in range(256)] - - if fp.readline()[:12] != b"GIMP Palette": - msg = "not a GIMP palette file" - raise SyntaxError(msg) - - for i in range(256): - s = fp.readline() - if not s: - break - - # skip fields and comment lines - if re.match(rb"\w+:|#", s): - continue - if len(s) > 100: - msg = "bad palette file" - raise SyntaxError(msg) - - v = tuple(map(int, s.split()[:3])) - if len(v) != 3: - msg = "bad palette entry" - raise ValueError(msg) - - palette[i] = o8(v[0]) + o8(v[1]) + o8(v[2]) - - self.palette = b"".join(palette) - - def getpalette(self) -> tuple[bytes, str]: - return self.palette, self.rawmode diff --git a/.venv/Lib/site-packages/PIL/GribStubImagePlugin.py b/.venv/Lib/site-packages/PIL/GribStubImagePlugin.py deleted file mode 100644 index e9aa084..0000000 --- a/.venv/Lib/site-packages/PIL/GribStubImagePlugin.py +++ /dev/null @@ -1,76 +0,0 @@ -# -# 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 __future__ import annotations - -from typing import IO - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler: ImageFile.StubHandler | None) -> None: - """ - Install application-specific GRIB image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == b"GRIB" and prefix[7] == 1 - - -class GribStubImageFile(ImageFile.StubImageFile): - format = "GRIB" - format_description = "GRIB" - - def _open(self) -> None: - offset = self.fp.tell() - - if not _accept(self.fp.read(8)): - msg = "Not a GRIB file" - raise SyntaxError(msg) - - 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) -> ImageFile.StubHandler | None: - return _handler - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if _handler is None or not hasattr(_handler, "save"): - msg = "GRIB save handler not installed" - raise OSError(msg) - _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/.venv/Lib/site-packages/PIL/Hdf5StubImagePlugin.py b/.venv/Lib/site-packages/PIL/Hdf5StubImagePlugin.py deleted file mode 100644 index cc9e73d..0000000 --- a/.venv/Lib/site-packages/PIL/Hdf5StubImagePlugin.py +++ /dev/null @@ -1,76 +0,0 @@ -# -# 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 __future__ import annotations - -from typing import IO - -from . import Image, ImageFile - -_handler = None - - -def register_handler(handler: ImageFile.StubHandler | None) -> None: - """ - Install application-specific HDF5 image handler. - - :param handler: Handler object. - """ - global _handler - _handler = handler - - -# -------------------------------------------------------------------- -# Image adapter - - -def _accept(prefix: bytes) -> bool: - return prefix[:8] == b"\x89HDF\r\n\x1a\n" - - -class HDF5StubImageFile(ImageFile.StubImageFile): - format = "HDF5" - format_description = "HDF5" - - def _open(self) -> None: - offset = self.fp.tell() - - if not _accept(self.fp.read(8)): - msg = "Not an HDF file" - raise SyntaxError(msg) - - 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) -> ImageFile.StubHandler | None: - return _handler - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if _handler is None or not hasattr(_handler, "save"): - msg = "HDF5 save handler not installed" - raise OSError(msg) - _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/.venv/Lib/site-packages/PIL/IcnsImagePlugin.py b/.venv/Lib/site-packages/PIL/IcnsImagePlugin.py deleted file mode 100644 index 2a89d49..0000000 --- a/.venv/Lib/site-packages/PIL/IcnsImagePlugin.py +++ /dev/null @@ -1,399 +0,0 @@ -# -# 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. -# 2020-04-04 Allow saving on all operating systems. -# -# Copyright (c) 2004 by Bob Ippolito. -# Copyright (c) 2004 by Secret Labs. -# Copyright (c) 2004 by Fredrik Lundh. -# Copyright (c) 2014 by Alastair Houghton. -# Copyright (c) 2020 by Pan Jing. -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import os -import struct -import sys -from typing import IO - -from . import Image, ImageFile, PngImagePlugin, features - -enable_jpeg2k = features.check_codec("jpg_2000") -if enable_jpeg2k: - from . import Jpeg2KImagePlugin - -MAGIC = b"icns" -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": - msg = "Unknown signature, expecting 0x00000000" - raise SyntaxError(msg) - 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 = byte[0] - 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: - msg = f"Error reading channel [{repr(bytesleft)} left]" - raise SyntaxError(msg) - 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) - Image._decompression_bomb_check(im.size) - 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: - msg = ( - "Unsupported icon subimage format (rebuild PIL " - "with JPEG 2000 support to fix this)" - ) - raise ValueError(msg) - # j2k, jpc or j2c - fobj.seek(start) - jp2kstream = fobj.read(length) - f = io.BytesIO(jp2kstream) - im = Jpeg2KImagePlugin.Jpeg2KImageFile(f) - Image._decompression_bomb_check(im.size) - if im.mode != "RGBA": - im = im.convert("RGBA") - return {"RGBA": im} - else: - msg = "Unsupported icon subimage format" - raise ValueError(msg) - - -class IcnsFile: - 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 not _accept(sig): - msg = "not an icns file" - raise SyntaxError(msg) - i = HEADERSIZE - while i < filesize: - sig, blocksize = nextheader(fobj) - if blocksize <= 0: - msg = "invalid block header" - raise SyntaxError(msg) - i += HEADERSIZE - blocksize -= HEADERSIZE - dct[sig] = (i, blocksize) - fobj.seek(blocksize, io.SEEK_CUR) - 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: - msg = "No 32bit icon resources found" - raise SyntaxError(msg) - 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) -> None: - self.icns = IcnsFile(self.fp) - self._mode = "RGBA" - self.info["sizes"] = self.icns.itersizes() - self.best_size = self.icns.bestsize() - self.size = ( - self.best_size[0] * self.best_size[2], - self.best_size[1] * self.best_size[2], - ) - - @property - def size(self): - return self._size - - @size.setter - def size(self, value): - info_size = value - if info_size not in self.info["sizes"] and len(info_size) == 2: - info_size = (info_size[0], info_size[1], 1) - if ( - info_size not in self.info["sizes"] - and len(info_size) == 3 - and info_size[2] == 1 - ): - simple_sizes = [ - (size[0] * size[2], size[1] * size[2]) for size in self.info["sizes"] - ] - if value in simple_sizes: - info_size = self.info["sizes"][simple_sizes.index(value)] - if info_size not in self.info["sizes"]: - msg = "This is not one of the allowed sizes of this image" - raise ValueError(msg) - self._size = value - - 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], - ) - - px = Image.Image.load(self) - if self.im is not None and self.im.size == self.size: - # Already loaded - return px - 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 - px = im.load() - - self.im = im.im - self._mode = im.mode - self.size = im.size - - return px - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - """ - Saves the image as a series of PNG files, - that are then combined into a .icns file. - """ - if hasattr(fp, "flush"): - fp.flush() - - sizes = { - b"ic07": 128, - b"ic08": 256, - b"ic09": 512, - b"ic10": 1024, - b"ic11": 32, - b"ic12": 64, - b"ic13": 256, - b"ic14": 512, - } - provided_images = {im.width: im for im in im.encoderinfo.get("append_images", [])} - size_streams = {} - for size in set(sizes.values()): - image = ( - provided_images[size] - if size in provided_images - else im.resize((size, size)) - ) - - temp = io.BytesIO() - image.save(temp, "png") - size_streams[size] = temp.getvalue() - - entries = [] - for type, size in sizes.items(): - stream = size_streams[size] - entries.append((type, HEADERSIZE + len(stream), stream)) - - # Header - fp.write(MAGIC) - file_length = HEADERSIZE # Header - file_length += HEADERSIZE + 8 * len(entries) # TOC - file_length += sum(entry[1] for entry in entries) - fp.write(struct.pack(">i", file_length)) - - # TOC - fp.write(b"TOC ") - fp.write(struct.pack(">i", HEADERSIZE + len(entries) * HEADERSIZE)) - for entry in entries: - fp.write(entry[0]) - fp.write(struct.pack(">i", entry[1])) - - # Data - for entry in entries: - fp.write(entry[0]) - fp.write(struct.pack(">i", entry[1])) - fp.write(entry[2]) - - if hasattr(fp, "flush"): - fp.flush() - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == MAGIC - - -Image.register_open(IcnsImageFile.format, IcnsImageFile, _accept) -Image.register_extension(IcnsImageFile.format, ".icns") - -Image.register_save(IcnsImageFile.format, _save) -Image.register_mime(IcnsImageFile.format, "image/icns") - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("Syntax: python3 IcnsImagePlugin.py [file]") - sys.exit() - - with open(sys.argv[1], "rb") as fp: - imf = IcnsImageFile(fp) - for size in imf.info["sizes"]: - width, height, scale = imf.size = size - imf.save(f"out-{width}-{height}-{scale}.png") - with Image.open(sys.argv[1]) as im: - im.save("out.png") - if sys.platform == "windows": - os.startfile("out.png") diff --git a/.venv/Lib/site-packages/PIL/IcoImagePlugin.py b/.venv/Lib/site-packages/PIL/IcoImagePlugin.py deleted file mode 100644 index 227fcf3..0000000 --- a/.venv/Lib/site-packages/PIL/IcoImagePlugin.py +++ /dev/null @@ -1,360 +0,0 @@ -# -# 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 -from __future__ import annotations - -import warnings -from io import BytesIO -from math import ceil, log -from typing import IO - -from . import BmpImagePlugin, Image, ImageFile, PngImagePlugin -from ._binary import i16le as i16 -from ._binary import i32le as i32 -from ._binary import o8 -from ._binary import o16le as o16 -from ._binary import o32le as o32 - -# -# -------------------------------------------------------------------- - -_MAGIC = b"\0\0\1\0" - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - fp.write(_MAGIC) # (2+2) - bmp = im.encoderinfo.get("bitmap_format") == "bmp" - sizes = im.encoderinfo.get( - "sizes", - [(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)], - ) - frames = [] - provided_ims = [im] + im.encoderinfo.get("append_images", []) - width, height = im.size - for size in sorted(set(sizes)): - if size[0] > width or size[1] > height or size[0] > 256 or size[1] > 256: - continue - - for provided_im in provided_ims: - if provided_im.size != size: - continue - frames.append(provided_im) - if bmp: - bits = BmpImagePlugin.SAVE[provided_im.mode][1] - bits_used = [bits] - for other_im in provided_ims: - if other_im.size != size: - continue - bits = BmpImagePlugin.SAVE[other_im.mode][1] - if bits not in bits_used: - # Another image has been supplied for this size - # with a different bit depth - frames.append(other_im) - bits_used.append(bits) - break - else: - # TODO: invent a more convenient method for proportional scalings - frame = provided_im.copy() - frame.thumbnail(size, Image.Resampling.LANCZOS, reducing_gap=None) - frames.append(frame) - fp.write(o16(len(frames))) # idCount(2) - offset = fp.tell() + len(frames) * 16 - for frame in frames: - width, height = frame.size - # 0 means 256 - fp.write(o8(width if width < 256 else 0)) # bWidth(1) - fp.write(o8(height if height < 256 else 0)) # bHeight(1) - - bits, colors = BmpImagePlugin.SAVE[frame.mode][1:] if bmp else (32, 0) - fp.write(o8(colors)) # bColorCount(1) - fp.write(b"\0") # bReserved(1) - fp.write(b"\0\0") # wPlanes(2) - fp.write(o16(bits)) # wBitCount(2) - - image_io = BytesIO() - if bmp: - frame.save(image_io, "dib") - - if bits != 32: - and_mask = Image.new("1", size) - ImageFile._save( - and_mask, image_io, [("raw", (0, 0) + size, 0, ("1", 0, -1))] - ) - else: - frame.save(image_io, "png") - image_io.seek(0) - image_bytes = image_io.read() - if bmp: - image_bytes = image_bytes[:8] + o32(height * 2) + image_bytes[12:] - bytes_len = len(image_bytes) - fp.write(o32(bytes_len)) # dwBytesInRes(4) - fp.write(o32(offset)) # dwImageOffset(4) - current = fp.tell() - fp.seek(offset) - fp.write(image_bytes) - offset = offset + bytes_len - fp.seek(current) - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == _MAGIC - - -class IcoFile: - def __init__(self, buf): - """ - Parse image from file-like object containing ico file data - """ - - # check magic - s = buf.read(6) - if not _accept(s): - msg = "not an ICO file" - raise SyntaxError(msg) - - self.buf = buf - self.entry = [] - - # Number of items in file - self.nb_items = i16(s, 4) - - # Get headers for each item - for i in range(self.nb_items): - s = buf.read(16) - - icon_header = { - "width": s[0], - "height": s[1], - "nb_color": s[2], # No. of colors in image (0 if >=8bpp) - "reserved": 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["square"], reverse=True) - - 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 getentryindex(self, size, bpp=False): - for i, h in enumerate(self.entry): - if size == h["dim"] and (bpp is False or bpp == h["color_depth"]): - return i - return 0 - - def getimage(self, size, bpp=False): - """ - Get an image from the icon - """ - return self.frame(self.getentryindex(size, bpp)) - - def frame(self, idx: int) -> Image.Image: - """ - 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"]) - - im: Image.Image - if data[:8] == PngImagePlugin._MAGIC: - # png frame - im = PngImagePlugin.PngImageFile(self.buf) - Image._decompression_bomb_check(im.size) - else: - # XOR + AND mask bmp frame - im = BmpImagePlugin.DibImageFile(self.buf) - Image._decompression_bomb_check(im.size) - - # 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 - bpp = header["bpp"] - 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 - - total_bytes = int((w * im.size[1]) / 8) - and_mask_offset = header["offset"] + header["size"] - total_bytes - - 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. - - When saving, PNG compression is used. Support for this was only added in - Windows Vista. If you are unable to view the icon in Windows, convert the - image to "RGBA" mode before saving. - - 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) -> None: - self.ico = IcoFile(self.fp) - self.info["sizes"] = self.ico.sizes() - self.size = self.ico.entry[0]["dim"] - self.load() - - @property - def size(self): - return self._size - - @size.setter - def size(self, value): - if value not in self.info["sizes"]: - msg = "This is not one of the allowed sizes of this image" - raise ValueError(msg) - self._size = value - - def load(self): - if self.im is not None and self.im.size == self.size: - # Already loaded - return Image.Image.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.pyaccess = None - self._mode = im.mode - if im.palette: - self.palette = im.palette - if im.size != self.size: - warnings.warn("Image was not the expected size") - - index = self.ico.getentryindex(self.size) - sizes = list(self.info["sizes"]) - sizes[index] = im.size - self.info["sizes"] = set(sizes) - - self.size = im.size - - def load_seek(self, pos: int) -> None: - # 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") - -Image.register_mime(IcoImageFile.format, "image/x-icon") diff --git a/.venv/Lib/site-packages/PIL/ImImagePlugin.py b/.venv/Lib/site-packages/PIL/ImImagePlugin.py deleted file mode 100644 index 2fb7ecd..0000000 --- a/.venv/Lib/site-packages/PIL/ImImagePlugin.py +++ /dev/null @@ -1,374 +0,0 @@ -# -# 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. -# -from __future__ import annotations - -import os -import re -from typing import IO, Any - -from . import Image, ImageFile, ImagePalette - -# -------------------------------------------------------------------- -# 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"), - "PA image": ("LA", "PA;L"), - "RGBA image": ("RGBA", "RGBA;L"), - "RGBX image": ("RGB", "RGBX;L"), - "CMYK image": ("CMYK", "CMYK;L"), - "YCC image": ("YCbCr", "YCbCr;L"), -} - -# ifunc95 extensions -for i in ["8", "8S", "16", "16S", "32", "32F"]: - OPEN[f"L {i} image"] = ("F", f"F;{i}") - OPEN[f"L*{i} image"] = ("F", f"F;{i}") -for i in ["16", "16L", "16B"]: - OPEN[f"L {i} image"] = (f"I;{i}", f"I;{i}") - OPEN[f"L*{i} image"] = (f"I;{i}", f"I;{i}") -for i in ["32S"]: - OPEN[f"L {i} image"] = ("I", f"I;{i}") - OPEN[f"L*{i} image"] = ("I", f"I;{i}") -for j in range(2, 33): - OPEN[f"L*{j} image"] = ("F", f"F;{j}") - - -# -------------------------------------------------------------------- -# Read IM directory - -split = re.compile(rb"^([A-Za-z][^:]*):[ \t]*(.*)[ \t]*$") - - -def number(s: Any) -> float: - 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) -> None: - # 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): - msg = "not an IM file" - raise SyntaxError(msg) - 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: - msg = "not an IM file" - raise SyntaxError(msg) - - 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 e: - msg = "not an IM file" - raise SyntaxError(msg) from e - - 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: - msg = f"Syntax error in IM header: {s.decode('ascii', 'replace')}" - raise SyntaxError(msg) - - if not n: - msg = "Not an IM file" - raise SyntaxError(msg) - - # Basic attributes - self._size = self.info[SIZE] - self._mode = self.info[MODE] - - # Skip forward to start of image data - while s and s[:1] != b"\x1A": - s = self.fp.read(1) - if not s: - msg = "File truncated" - raise SyntaxError(msg) - - 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 palette[i] != i: - linear = 0 - else: - greyscale = 0 - if self.mode in ["L", "LA", "P", "PA"]: - if greyscale: - if not linear: - self.lut = list(palette[:256]) - else: - if self.mode in ["L", "P"]: - self._mode = self.rawmode = "P" - elif self.mode in ["LA", "PA"]: - self._mode = "PA" - self.rawmode = "PA;L" - self.palette = ImagePalette.raw("RGB;L", palette) - elif self.mode == "RGB": - if not greyscale or not linear: - self.lut = list(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) -> int: - return self.info[FRAMES] - - @property - def is_animated(self) -> bool: - return self.info[FRAMES] > 1 - - def seek(self, frame: int) -> None: - 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) -> int: - 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: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - try: - image_type, rawmode = SAVE[im.mode] - except KeyError as e: - msg = f"Cannot save {im.mode} images as IM" - raise ValueError(msg) from e - - frames = im.encoderinfo.get("frames", 1) - - fp.write(f"Image type: {image_type} image\r\n".encode("ascii")) - if filename: - # Each line must be 100 characters or less, - # or: SyntaxError("not an IM file") - # 8 characters are used for "Name: " and "\r\n" - # Keep just the filename, ditch the potentially overlong path - if isinstance(filename, bytes): - filename = filename.decode("ascii") - name, ext = os.path.splitext(os.path.basename(filename)) - name = "".join([name[: 92 - len(ext)], ext]) - - fp.write(f"Name: {name}\r\n".encode("ascii")) - fp.write(("Image size (x*y): %d*%d\r\n" % im.size).encode("ascii")) - fp.write(f"File size (no of images): {frames}\r\n".encode("ascii")) - if im.mode in ["P", "PA"]: - fp.write(b"Lut: 1\r\n") - fp.write(b"\000" * (511 - fp.tell()) + b"\032") - if im.mode in ["P", "PA"]: - im_palette = im.im.getpalette("RGB", "RGB;L") - colors = len(im_palette) // 3 - palette = b"" - for i in range(3): - palette += im_palette[colors * i : colors * (i + 1)] - palette += b"\x00" * (256 - colors) - fp.write(palette) # 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/.venv/Lib/site-packages/PIL/Image.py b/.venv/Lib/site-packages/PIL/Image.py deleted file mode 100644 index d41c065..0000000 --- a/.venv/Lib/site-packages/PIL/Image.py +++ /dev/null @@ -1,4147 +0,0 @@ -# -# 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 __future__ import annotations - -import abc -import atexit -import builtins -import io -import logging -import math -import os -import re -import struct -import sys -import tempfile -import warnings -from collections.abc import Callable, MutableMapping -from enum import IntEnum -from types import ModuleType -from typing import ( - IO, - TYPE_CHECKING, - Any, - Literal, - Protocol, - Sequence, - Tuple, - cast, -) - -# VERSION was removed in Pillow 6.0.0. -# PILLOW_VERSION was removed in Pillow 9.0.0. -# Use __version__ instead. -from . import ( - ExifTags, - ImageMode, - TiffTags, - UnidentifiedImageError, - __version__, - _plugins, -) -from ._binary import i32le, o32be, o32le -from ._deprecate import deprecate -from ._typing import StrOrBytesPath, TypeGuard -from ._util import DeferredError, is_path - -ElementTree: ModuleType | None -try: - from defusedxml import ElementTree -except ImportError: - ElementTree = None - -logger = logging.getLogger(__name__) - - -class DecompressionBombWarning(RuntimeWarning): - pass - - -class DecompressionBombError(Exception): - pass - - -WARN_POSSIBLE_FORMATS: bool = False - -# Limit to around a quarter gigabyte for a 24-bit (3 bpp) image -MAX_IMAGE_PIXELS: int | None = 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 __version__ != getattr(core, "PILLOW_VERSION", None): - msg = ( - "The _imaging extension was built for another version of Pillow or PIL:\n" - f"Core version: {getattr(core, 'PILLOW_VERSION', None)}\n" - f"Pillow version: {__version__}" - ) - raise ImportError(msg) - -except ImportError as v: - core = DeferredError.new(ImportError("The _imaging C module is 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) - # Fail here anyway. Don't let people run with a mostly broken Pillow. - # see docs/porting.rst - raise - - -USE_CFFI_ACCESS = False -cffi: ModuleType | None -try: - import cffi -except ImportError: - cffi = None - - -def isImageType(t: Any) -> TypeGuard[Image]: - """ - 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 - - -# transpose -class Transpose(IntEnum): - FLIP_LEFT_RIGHT = 0 - FLIP_TOP_BOTTOM = 1 - ROTATE_90 = 2 - ROTATE_180 = 3 - ROTATE_270 = 4 - TRANSPOSE = 5 - TRANSVERSE = 6 - - -# transforms (also defined in Imaging.h) -class Transform(IntEnum): - AFFINE = 0 - EXTENT = 1 - PERSPECTIVE = 2 - QUAD = 3 - MESH = 4 - - -# resampling filters (also defined in Imaging.h) -class Resampling(IntEnum): - NEAREST = 0 - BOX = 4 - BILINEAR = 2 - HAMMING = 5 - BICUBIC = 3 - LANCZOS = 1 - - -_filters_support = { - Resampling.BOX: 0.5, - Resampling.BILINEAR: 1.0, - Resampling.HAMMING: 1.0, - Resampling.BICUBIC: 2.0, - Resampling.LANCZOS: 3.0, -} - - -# dithers -class Dither(IntEnum): - NONE = 0 - ORDERED = 1 # Not yet implemented - RASTERIZE = 2 # Not yet implemented - FLOYDSTEINBERG = 3 # default - - -# palettes/quantizers -class Palette(IntEnum): - WEB = 0 - ADAPTIVE = 1 - - -class Quantize(IntEnum): - MEDIANCUT = 0 - MAXCOVERAGE = 1 - FASTOCTREE = 2 - LIBIMAGEQUANT = 3 - - -module = sys.modules[__name__] -for enum in (Transpose, Transform, Resampling, Dither, Palette, Quantize): - for item in enum: - setattr(module, item.name, item.value) - - -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 - -if TYPE_CHECKING: - from . import ImageFile, PyAccess -ID: list[str] = [] -OPEN: dict[ - str, - tuple[ - Callable[[IO[bytes], str | bytes], ImageFile.ImageFile], - Callable[[bytes], bool | str] | None, - ], -] = {} -MIME: dict[str, str] = {} -SAVE: dict[str, Callable[[Image, IO[bytes], str | bytes], None]] = {} -SAVE_ALL: dict[str, Callable[[Image, IO[bytes], str | bytes], None]] = {} -EXTENSION: dict[str, str] = {} -DECODERS: dict[str, type[ImageFile.PyDecoder]] = {} -ENCODERS: dict[str, type[ImageFile.PyEncoder]] = {} - -# -------------------------------------------------------------------- -# Modes - -_ENDIAN = "<" if sys.byteorder == "little" else ">" - - -def _conv_type_shape(im): - m = ImageMode.getmode(im.mode) - shape = (im.height, im.width) - extra = len(m.bands) - if extra != 1: - shape += (extra,) - return shape, m.typestr - - -MODES = [ - "1", - "CMYK", - "F", - "HSV", - "I", - "I;16", - "I;16B", - "I;16L", - "I;16N", - "L", - "LA", - "La", - "LAB", - "P", - "PA", - "RGB", - "RGBA", - "RGBa", - "RGBX", - "YCbCr", -] - -# raw modes that may be memory mapped. NOTE: if you change this, you -# may have to modify the stride calculation in map.c too! -_MAPMODES = ("L", "P", "RGBX", "RGBA", "CMYK", "I;16", "I;16L", "I;16B") - - -def getmodebase(mode: str) -> str: - """ - Gets the "base" mode for given mode. This function returns "L" for - images that contain grayscale data, and "RGB" for images that - contain color data. - - :param mode: Input mode. - :returns: "L" or "RGB". - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).basemode - - -def getmodetype(mode: str) -> str: - """ - Gets the storage type mode. Given a mode, this function returns a - single-layer mode suitable for storing individual bands. - - :param mode: Input mode. - :returns: "L", "I", or "F". - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).basetype - - -def getmodebandnames(mode: str) -> tuple[str, ...]: - """ - Gets a list of individual band names. Given a mode, this function returns - a tuple containing the names of individual bands (use - :py:method:`~PIL.Image.getmodetype` to get the mode used to store each - individual band. - - :param mode: Input mode. - :returns: A tuple containing band names. The length of the tuple - gives the number of bands in an image of the given mode. - :exception KeyError: If the input mode was not a standard mode. - """ - return ImageMode.getmode(mode).bands - - -def getmodebands(mode: str) -> int: - """ - Gets the number of individual bands for this mode. - - :param mode: Input mode. - :returns: The number of bands in this mode. - :exception KeyError: If the input mode was not a standard mode. - """ - return len(ImageMode.getmode(mode).bands) - - -# -------------------------------------------------------------------- -# Helpers - -_initialized = 0 - - -def preinit() -> None: - """ - Explicitly loads BMP, GIF, JPEG, PPM and PPM file format drivers. - - It is called when opening or saving images. - """ - - global _initialized - if _initialized >= 1: - return - - try: - from . import BmpImagePlugin - - assert BmpImagePlugin - except ImportError: - pass - try: - from . import GifImagePlugin - - assert GifImagePlugin - except ImportError: - pass - try: - from . import JpegImagePlugin - - assert JpegImagePlugin - except ImportError: - pass - try: - from . import PpmImagePlugin - - assert PpmImagePlugin - except ImportError: - pass - try: - from . import PngImagePlugin - - assert PngImagePlugin - except ImportError: - pass - - _initialized = 1 - - -def init() -> bool: - """ - Explicitly initializes the Python Imaging Library. This function - loads all available file format drivers. - - It is called when opening or saving images if :py:meth:`~preinit()` is - insufficient, and by :py:meth:`~PIL.features.pilinfo`. - """ - - global _initialized - if _initialized >= 2: - return False - - parent_name = __name__.rpartition(".")[0] - for plugin in _plugins: - try: - logger.debug("Importing %s", plugin) - __import__(f"{parent_name}.{plugin}", globals(), locals(), []) - except ImportError as e: - logger.debug("Image: failed to import %s: %s", plugin, e) - - if OPEN or SAVE: - _initialized = 2 - return True - return False - - -# -------------------------------------------------------------------- -# Codec factories (used by tobytes/frombytes and ImageFile.load) - - -def _getdecoder( - mode: str, decoder_name: str, args: Any, extra: tuple[Any, ...] = () -) -> core.ImagingDecoder | ImageFile.PyDecoder: - # tweak arguments - if args is None: - args = () - elif not isinstance(args, tuple): - args = (args,) - - try: - decoder = DECODERS[decoder_name] - except KeyError: - pass - else: - return decoder(mode, *args + extra) - - try: - # get decoder - decoder = getattr(core, f"{decoder_name}_decoder") - except AttributeError as e: - msg = f"decoder {decoder_name} not available" - raise OSError(msg) from e - return decoder(mode, *args + extra) - - -def _getencoder( - mode: str, encoder_name: str, args: Any, extra: tuple[Any, ...] = () -) -> core.ImagingEncoder | ImageFile.PyEncoder: - # tweak arguments - if args is None: - args = () - elif not isinstance(args, tuple): - args = (args,) - - try: - encoder = ENCODERS[encoder_name] - except KeyError: - pass - else: - return encoder(mode, *args + extra) - - try: - # get encoder - encoder = getattr(core, f"{encoder_name}_encoder") - except AttributeError as e: - msg = f"encoder {encoder_name} not available" - raise OSError(msg) from e - return encoder(mode, *args + extra) - - -# -------------------------------------------------------------------- -# Simple expression analyzer - - -class _E: - def __init__(self, scale, offset) -> None: - self.scale = scale - self.offset = offset - - def __neg__(self): - return _E(-self.scale, -self.offset) - - def __add__(self, other): - if isinstance(other, _E): - return _E(self.scale + other.scale, self.offset + other.offset) - return _E(self.scale, self.offset + other) - - __radd__ = __add__ - - def __sub__(self, other): - return self + -other - - def __rsub__(self, other): - return other + -self - - def __mul__(self, other): - if isinstance(other, _E): - return NotImplemented - return _E(self.scale * other, self.offset * other) - - __rmul__ = __mul__ - - def __truediv__(self, other): - if isinstance(other, _E): - return NotImplemented - return _E(self.scale / other, self.offset / other) - - -def _getscaleoffset(expr): - a = expr(_E(1, 0)) - return (a.scale, a.offset) if isinstance(a, _E) else (0, a) - - -# -------------------------------------------------------------------- -# Implementation wrapper - - -class SupportsGetData(Protocol): - def getdata( - self, - ) -> tuple[Transform, Sequence[int]]: ... - - -class Image: - """ - 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: str | None = None - format_description: str | None = 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.readonly = 0 - self.pyaccess = None - self._exif = None - - @property - def width(self) -> int: - return self.size[0] - - @property - def height(self) -> int: - return self.size[1] - - @property - def size(self) -> tuple[int, int]: - return self._size - - @property - def mode(self) -> str: - return self._mode - - def _new(self, im: core.ImagingCore) -> Image: - 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 _close_fp(self): - if getattr(self, "_fp", False): - if self._fp != self.fp: - self._fp.close() - self._fp = DeferredError(ValueError("Operation on closed image")) - if self.fp: - self.fp.close() - - def __exit__(self, *args): - if hasattr(self, "fp"): - if getattr(self, "_exclusive_fp", False): - self._close_fp() - self.fp = None - - def close(self) -> None: - """ - 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 required to close images that have multiple frames or - have not had their file read and closed by the - :py:meth:`~PIL.Image.Image.load` method. See :ref:`file-handling` for - more information. - """ - if hasattr(self, "fp"): - try: - self._close_fp() - 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 = DeferredError(ValueError("Operation on closed image")) - - def _copy(self) -> None: - self.load() - self.im = self.im.copy() - self.pyaccess = None - self.readonly = 0 - - def _ensure_mutable(self) -> None: - if self.readonly: - self._copy() - else: - self.load() - - def _dump( - self, file: str | None = None, format: str | None = None, **options: Any - ) -> str: - suffix = "" - if format: - suffix = f".{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: object) -> bool: - if self.__class__ is not other.__class__: - return False - assert isinstance(other, Image) - return ( - self.mode == other.mode - and self.size == other.size - and self.info == other.info - and self.getpalette() == other.getpalette() - and self.tobytes() == other.tobytes() - ) - - def __repr__(self) -> str: - 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_pretty_(self, p, cycle) -> None: - """IPython plain text display support""" - - # Same as __repr__ but without unpredictable id(self), - # to keep Jupyter notebook `text/plain` output stable. - p.text( - "<%s.%s image mode=%s size=%dx%d>" - % ( - self.__class__.__module__, - self.__class__.__name__, - self.mode, - self.size[0], - self.size[1], - ) - ) - - def _repr_image(self, image_format: str, **kwargs: Any) -> bytes | None: - """Helper function for iPython display hook. - - :param image_format: Image format. - :returns: image as bytes, saved into the given format. - """ - b = io.BytesIO() - try: - self.save(b, image_format, **kwargs) - except Exception: - return None - return b.getvalue() - - def _repr_png_(self) -> bytes | None: - """iPython display hook support for PNG format. - - :returns: PNG version of the image as bytes - """ - return self._repr_image("PNG", compress_level=1) - - def _repr_jpeg_(self) -> bytes | None: - """iPython display hook support for JPEG format. - - :returns: JPEG version of the image as bytes - """ - return self._repr_image("JPEG") - - @property - def __array_interface__(self): - # numpy array interface support - new = {"version": 3} - try: - 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() - except Exception as e: - if not isinstance(e, (MemoryError, RecursionError)): - try: - import numpy - from packaging.version import parse as parse_version - except ImportError: - pass - else: - if parse_version(numpy.__version__) < parse_version("1.23"): - warnings.warn(str(e)) - raise - new["shape"], new["typestr"] = _conv_type_shape(self) - return new - - def __getstate__(self): - im_data = self.tobytes() # load image first - return [self.info, self.mode, self.size, self.getpalette(), im_data] - - def __setstate__(self, state) -> None: - Image.__init__(self) - 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", "LA", "P", "PA") and palette: - self.putpalette(palette) - self.frombytes(data) - - def tobytes(self, encoder_name: str = "raw", *args: Any) -> bytes: - """ - 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. - - A list of C encoders can be seen under - codecs section of the function array in - :file:`_imaging.c`. Python encoders are - registered within the relevant plugins. - :param args: Extra arguments to the encoder. - :returns: A :py:class:`bytes` object. - """ - - encoder_args: Any = args - if len(encoder_args) == 1 and isinstance(encoder_args[0], tuple): - # may pass tuple instead of argument list - encoder_args = encoder_args[0] - - if encoder_name == "raw" and encoder_args == (): - encoder_args = self.mode - - self.load() - - if self.width == 0 or self.height == 0: - return b"" - - # unpack data - e = _getencoder(self.mode, encoder_name, encoder_args) - e.setimage(self.im) - - bufsize = max(65536, self.size[0] * 4) # see RawEncode.c - - output = [] - while True: - bytes_consumed, errcode, data = e.encode(bufsize) - output.append(data) - if errcode: - break - if errcode < 0: - msg = f"encoder error {errcode} in tobytes" - raise RuntimeError(msg) - - return b"".join(output) - - def tobitmap(self, name: str = "image") -> bytes: - """ - 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": - msg = "not a bitmap" - raise ValueError(msg) - data = self.tobytes("xbm") - return b"".join( - [ - f"#define {name}_width {self.size[0]}\n".encode("ascii"), - f"#define {name}_height {self.size[1]}\n".encode("ascii"), - f"static char {name}_bits[] = {{\n".encode("ascii"), - data, - b"};", - ] - ) - - def frombytes( - self, data: bytes | bytearray, decoder_name: str = "raw", *args: Any - ) -> None: - """ - 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. - """ - - if self.width == 0 or self.height == 0: - return - - decoder_args: Any = args - if len(decoder_args) == 1 and isinstance(decoder_args[0], tuple): - # may pass tuple instead of argument list - decoder_args = decoder_args[0] - - # default format - if decoder_name == "raw" and decoder_args == (): - decoder_args = self.mode - - # unpack data - d = _getdecoder(self.mode, decoder_name, decoder_args) - d.setimage(self.im) - s = d.decode(data) - - if s[0] >= 0: - msg = "not enough image data" - raise ValueError(msg) - if s[1] != 0: - msg = "cannot decode image data" - raise ValueError(msg) - - def load(self) -> core.PixelAccess | PyAccess.PyAccess | None: - """ - 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. - - If the file associated with the image was opened by Pillow, then this - method will close it. The exception to this is if the image has - multiple frames, in which case the file will be left open for seek - operations. See :ref:`file-handling` for more information. - - :returns: An image access object. - :rtype: :py:class:`.PixelAccess` or :py:class:`.PyAccess` - """ - if self.im is not None and self.palette and self.palette.dirty: - # realize palette - mode, arr = self.palette.getdata() - self.im.putpalette(self.palette.mode, mode, arr) - self.palette.dirty = 0 - self.palette.rawmode = None - if "transparency" in self.info and mode in ("LA", "PA"): - if isinstance(self.info["transparency"], int): - self.im.putpalettealpha(self.info["transparency"], 0) - else: - self.im.putpalettealphas(self.info["transparency"]) - self.palette.mode = "RGBA" - else: - self.palette.palette = self.im.getpalette( - self.palette.mode, self.palette.mode - ) - - if self.im is not None: - if 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) - return None - - def verify(self) -> None: - """ - 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: str | None = None, - matrix: tuple[float, ...] | None = None, - dither: Dither | None = None, - palette: Palette = Palette.WEB, - colors: int = 256, - ) -> Image: - """ - 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. - - This supports all possible conversions between "L", "RGB" and "CMYK". The - ``matrix`` argument only supports "L" and "RGB". - - When translating a color image to grayscale (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 grayscale ("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 values larger than 127 are set to 255 (white), - all other values to 0 (black). To use other thresholds, use the - :py:meth:`~PIL.Image.Image.point` method. - - When converting from "RGBA" to "P" without a ``matrix`` argument, - this passes the operation to :py:meth:`~PIL.Image.Image.quantize`, - and ``dither`` and ``palette`` are ignored. - - When converting from "PA", if an "RGBA" palette is present, the alpha - channel from the image will be used instead of the values from the palette. - - :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 :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` - (default). Note that this is not used when ``matrix`` is supplied. - :param palette: Palette to use when converting from mode "RGB" - to "P". Available palettes are :data:`Palette.WEB` or - :data:`Palette.ADAPTIVE`. - :param colors: Number of colors to use for the :data:`Palette.ADAPTIVE` - palette. Defaults to 256. - :rtype: :py:class:`~PIL.Image.Image` - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if mode in ("BGR;15", "BGR;16", "BGR;24"): - deprecate(mode, 12) - - self.load() - - has_transparency = "transparency" in self.info - if not mode and self.mode == "P": - # determine default mode - if self.palette: - mode = self.palette.mode - else: - mode = "RGB" - if mode == "RGB" and has_transparency: - mode = "RGBA" - if not mode or (mode == self.mode and not matrix): - return self.copy() - - if matrix: - # matrix conversion - if mode not in ("L", "RGB"): - msg = "illegal conversion" - raise ValueError(msg) - im = self.im.convert_matrix(mode, matrix) - new_im = self._new(im) - if has_transparency and self.im.bands == 3: - transparency = new_im.info["transparency"] - - def convert_transparency( - m: tuple[float, ...], v: tuple[int, int, int] - ) -> int: - value = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3] * 0.5 - return max(0, min(255, int(value))) - - if mode == "L": - transparency = convert_transparency(matrix, transparency) - elif len(mode) == 3: - transparency = tuple( - convert_transparency(matrix[i * 4 : i * 4 + 4], transparency) - for i in range(0, len(transparency)) - ) - new_im.info["transparency"] = transparency - return new_im - - if mode == "P" and self.mode == "RGBA": - return self.quantize(colors) - - trns = None - delete_trns = False - # transparency handling - if has_transparency: - if (self.mode in ("1", "L", "I", "I;16") and mode in ("LA", "RGBA")) or ( - self.mode == "RGB" and mode in ("La", "LA", "RGBa", "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 = new(self.mode, (1, 1)) - if self.mode == "P": - trns_im.putpalette(self.palette) - if isinstance(t, tuple): - err = "Couldn't allocate a palette color for transparency" - try: - t = trns_im.palette.getcolor(t, self) - except ValueError as e: - if str(e) == "cannot allocate more than 256 colors": - # If all 256 colors are in use, - # then there is no need for transparency - t = None - else: - raise ValueError(err) from e - if t is None: - trns = None - else: - 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 in ("LA", "PA", "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: - msg = "Transparency for P mode should be bytes or int" - raise ValueError(msg) - - if mode == "P" and palette == Palette.ADAPTIVE: - im = self.im.quantize(colors) - new_im = self._new(im) - from . import ImagePalette - - new_im.palette = ImagePalette.ImagePalette( - "RGB", new_im.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_im.info["transparency"] - if trns is not None: - try: - new_im.info["transparency"] = new_im.palette.getcolor( - cast(Tuple[int, ...], trns), # trns was converted to RGB - new_im, - ) - except Exception: - # if we can't make a transparent color, don't leave the old - # transparency hanging around to mess us up. - del new_im.info["transparency"] - warnings.warn("Couldn't allocate palette entry for transparency") - return new_im - - if "LAB" in (self.mode, mode): - other_mode = mode if self.mode == "LAB" else self.mode - if other_mode in ("RGB", "RGBA", "RGBX"): - from . import ImageCms - - srgb = ImageCms.createProfile("sRGB") - lab = ImageCms.createProfile("LAB") - profiles = [lab, srgb] if self.mode == "LAB" else [srgb, lab] - transform = ImageCms.buildTransform( - profiles[0], profiles[1], self.mode, mode - ) - return transform.apply(self) - - # colorspace conversion - if dither is None: - dither = Dither.FLOYDSTEINBERG - - try: - im = self.im.convert(mode, dither) - except ValueError: - try: - # normalize source image and try again - modebase = getmodebase(self.mode) - if modebase == self.mode: - raise - im = self.im.convert(modebase) - im = im.convert(mode, dither) - except KeyError as e: - msg = "illegal conversion" - raise ValueError(msg) from e - - new_im = self._new(im) - if mode == "P" and palette != Palette.ADAPTIVE: - from . import ImagePalette - - new_im.palette = ImagePalette.ImagePalette("RGB", im.getpalette("RGB")) - 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" and new_im.palette: - try: - new_im.info["transparency"] = new_im.palette.getcolor(trns, new_im) - except ValueError as e: - del new_im.info["transparency"] - if str(e) != "cannot allocate more than 256 colors": - # If all 256 colors are in use, - # then there is no need for transparency - warnings.warn( - "Couldn't allocate palette entry for transparency" - ) - else: - new_im.info["transparency"] = trns - return new_im - - def quantize( - self, - colors: int = 256, - method: int | None = None, - kmeans: int = 0, - palette=None, - dither: Dither = Dither.FLOYDSTEINBERG, - ) -> Image: - """ - Convert the image to 'P' mode with the specified number - of colors. - - :param colors: The desired number of colors, <= 256 - :param method: :data:`Quantize.MEDIANCUT` (median cut), - :data:`Quantize.MAXCOVERAGE` (maximum coverage), - :data:`Quantize.FASTOCTREE` (fast octree), - :data:`Quantize.LIBIMAGEQUANT` (libimagequant; check support - using :py:func:`PIL.features.check_feature` with - ``feature="libimagequant"``). - - By default, :data:`Quantize.MEDIANCUT` will be used. - - The exception to this is RGBA images. :data:`Quantize.MEDIANCUT` - and :data:`Quantize.MAXCOVERAGE` do not support RGBA images, so - :data:`Quantize.FASTOCTREE` is used by default instead. - :param kmeans: Integer greater than or equal to zero. - :param palette: Quantize to the palette of given - :py:class:`PIL.Image.Image`. - :param dither: Dithering method, used when converting from - mode "RGB" to "P" or from "RGB" or "L" to "1". - Available methods are :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` - (default). - :returns: A new image - """ - - self.load() - - if method is None: - # defaults: - method = Quantize.MEDIANCUT - if self.mode == "RGBA": - method = Quantize.FASTOCTREE - - if self.mode == "RGBA" and method not in ( - Quantize.FASTOCTREE, - Quantize.LIBIMAGEQUANT, - ): - # Caller specified an invalid mode. - msg = ( - "Fast Octree (method == 2) and libimagequant (method == 3) " - "are the only valid methods for quantizing RGBA images" - ) - raise ValueError(msg) - - if palette: - # use palette from reference image - palette.load() - if palette.mode != "P": - msg = "bad mode for palette image" - raise ValueError(msg) - if self.mode not in {"RGB", "L"}: - msg = "only RGB or L mode images can be quantized to a palette" - raise ValueError(msg) - im = self.im.convert("P", dither, palette.im) - new_im = self._new(im) - new_im.palette = palette.palette.copy() - return new_im - - if kmeans < 0: - msg = "kmeans must not be negative" - raise ValueError(msg) - - im = self._new(self.im.quantize(colors, method, kmeans)) - - from . import ImagePalette - - mode = im.im.getpalettemode() - palette = im.im.getpalette(mode, mode)[: colors * len(mode)] - im.palette = ImagePalette.ImagePalette(mode, palette) - - return im - - def copy(self) -> Image: - """ - 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: tuple[float, float, float, float] | None = None) -> Image: - """ - Returns a rectangular region from this image. The box is a - 4-tuple defining the left, upper, right, and lower pixel - coordinate. See :ref:`coordinate-system`. - - 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() - - if box[2] < box[0]: - msg = "Coordinate 'right' is less than 'left'" - raise ValueError(msg) - elif box[3] < box[1]: - msg = "Coordinate 'lower' is less than 'upper'" - raise ValueError(msg) - - self.load() - return self._new(self._crop(self.im, box)) - - def _crop( - self, im: core.ImagingCore, box: tuple[float, float, float, float] - ) -> core.ImagingCore: - """ - 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)) - - absolute_values = (abs(x1 - x0), abs(y1 - y0)) - - _decompression_bomb_check(absolute_values) - - return im.crop((x0, y0, x1, y1)) - - def draft( - self, mode: str | None, size: tuple[int, int] | None - ) -> tuple[str, tuple[int, int, float, float]] | None: - """ - 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 grayscale while loading it. - - If any changes are made, returns a tuple with the chosen ``mode`` and - ``box`` with coordinates of the original image within the altered one. - - 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 MPO images. - - :param mode: The requested mode. - :param size: The requested size in pixels, as a 2-tuple: - (width, height). - """ - pass - - def _expand(self, xmargin: int, ymargin: int | None = None) -> Image: - if ymargin is None: - ymargin = xmargin - self.load() - return self._new(self.im.expand(xmargin, ymargin)) - - if TYPE_CHECKING: - from . import ImageFilter - - def filter(self, filter: ImageFilter.Filter | type[ImageFilter.Filter]) -> Image: - """ - 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 callable(filter): - filter = filter() - if not hasattr(filter, "filter"): - msg = "filter argument should be ImageFilter.Filter instance or class" - raise TypeError(msg) - - multiband = isinstance(filter, ImageFilter.MultibandFilter) - if self.im.bands == 1 or multiband: - return self._new(filter.filter(self.im)) - - ims = [ - self._new(filter.filter(self.im.getband(c))) for c in range(self.im.bands) - ] - return merge(self.mode, ims) - - def getbands(self) -> tuple[str, ...]: - """ - 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, *, alpha_only: bool = True) -> tuple[int, int, int, int] | None: - """ - Calculates the bounding box of the non-zero regions in the - image. - - :param alpha_only: Optional flag, defaulting to ``True``. - If ``True`` and the image has an alpha channel, trim transparent pixels. - Otherwise, trim pixels when all channels are zero. - Keyword-only argument. - :returns: The bounding box is returned as a 4-tuple defining the - left, upper, right, and lower pixel coordinate. See - :ref:`coordinate-system`. If the image is completely empty, this - method returns None. - - """ - - self.load() - return self.im.getbbox(alpha_only) - - def getcolors(self, maxcolors: int = 256): - """ - Returns a list of colors used in this image. - - The colors will be in the image's mode. For example, an RGB image will - return a tuple of (red, green, blue) color values, and a P image will - return the index of the color in the palette. - - :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 = [(h[i], i) for i in range(256) if h[i]] - if len(out) > maxcolors: - return None - return out - return self.im.getcolors(maxcolors) - - def getdata(self, band: int | None = 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) -> tuple[float, float] | tuple[tuple[int, int], ...]: - """ - Gets 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: - return tuple(self.im.getband(i).getextrema() for i in range(self.im.bands)) - return self.im.getextrema() - - def getxmp(self): - """ - Returns a dictionary containing the XMP tags. - Requires defusedxml to be installed. - - :returns: XMP tags in a dictionary. - """ - - def get_name(tag: str) -> str: - return re.sub("^{[^}]+}", "", tag) - - def get_value(element): - value = {get_name(k): v for k, v in element.attrib.items()} - children = list(element) - if children: - for child in children: - name = get_name(child.tag) - child_value = get_value(child) - if name in value: - if not isinstance(value[name], list): - value[name] = [value[name]] - value[name].append(child_value) - else: - value[name] = child_value - elif value: - if element.text: - value["text"] = element.text - else: - return element.text - return value - - if ElementTree is None: - warnings.warn("XMP data cannot be read without defusedxml dependency") - return {} - if "xmp" not in self.info: - return {} - root = ElementTree.fromstring(self.info["xmp"].rstrip(b"\x00")) - return {get_name(root.tag): get_value(root)} - - def getexif(self) -> Exif: - """ - Gets EXIF data from the image. - - :returns: an :py:class:`~PIL.Image.Exif` object. - """ - if self._exif is None: - self._exif = Exif() - elif self._exif._loaded: - return self._exif - self._exif._loaded = True - - exif_info = self.info.get("exif") - if exif_info is None: - if "Raw profile type exif" in self.info: - exif_info = bytes.fromhex( - "".join(self.info["Raw profile type exif"].split("\n")[3:]) - ) - elif hasattr(self, "tag_v2"): - self._exif.bigtiff = self.tag_v2._bigtiff - self._exif.endian = self.tag_v2._endian - self._exif.load_from_fp(self.fp, self.tag_v2._offset) - if exif_info is not None: - self._exif.load(exif_info) - - # XMP tags - if ExifTags.Base.Orientation not in self._exif: - xmp_tags = self.info.get("XML:com.adobe.xmp") - if xmp_tags: - match = re.search(r'tiff:Orientation(="|>)([0-9])', xmp_tags) - if match: - self._exif[ExifTags.Base.Orientation] = int(match[2]) - - return self._exif - - def _reload_exif(self) -> None: - if self._exif is None or not self._exif._loaded: - return - self._exif._loaded = False - self.getexif() - - def get_child_images(self) -> list[ImageFile.ImageFile]: - child_images = [] - exif = self.getexif() - ifds = [] - if ExifTags.Base.SubIFDs in exif: - subifd_offsets = exif[ExifTags.Base.SubIFDs] - if subifd_offsets: - if not isinstance(subifd_offsets, tuple): - subifd_offsets = (subifd_offsets,) - for subifd_offset in subifd_offsets: - ifds.append((exif._get_ifd_dict(subifd_offset), subifd_offset)) - ifd1 = exif.get_ifd(ExifTags.IFD.IFD1) - if ifd1 and ifd1.get(513): - ifds.append((ifd1, exif._info.next)) - - offset = None - for ifd, ifd_offset in ifds: - current_offset = self.fp.tell() - if offset is None: - offset = current_offset - - fp = self.fp - thumbnail_offset = ifd.get(513) - if thumbnail_offset is not None: - thumbnail_offset += getattr(self, "_exif_offset", 0) - self.fp.seek(thumbnail_offset) - data = self.fp.read(ifd.get(514)) - fp = io.BytesIO(data) - - with open(fp) as im: - from . import TiffImagePlugin - - if thumbnail_offset is None and isinstance( - im, TiffImagePlugin.TiffImageFile - ): - im._frame_pos = [ifd_offset] - im._seek(0) - im.load() - child_images.append(im) - - if offset is not None: - self.fp.seek(offset) - return child_images - - 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, rawmode: str | None = "RGB") -> list[int] | None: - """ - Returns the image palette as a list. - - :param rawmode: The mode in which to return the palette. ``None`` will - return the palette in its current mode. - - .. versionadded:: 9.1.0 - - :returns: A list of color values [r, g, b, ...], or None if the - image has no palette. - """ - - self.load() - try: - mode = self.im.getpalettemode() - except ValueError: - return None # no palette - if rawmode is None: - rawmode = mode - return list(self.im.getpalette(mode, rawmode)) - - @property - def has_transparency_data(self) -> bool: - """ - Determine if an image has transparency data, whether in the form of an - alpha channel, a palette with an alpha channel, or a "transparency" key - in the info dictionary. - - Note the image might still appear solid, if all of the values shown - within are opaque. - - :returns: A boolean. - """ - return ( - self.mode in ("LA", "La", "PA", "RGBA", "RGBa") - or (self.mode == "P" and self.palette.mode.endswith("A")) - or "transparency" in self.info - ) - - def apply_transparency(self) -> None: - """ - If a P mode image has a "transparency" key in the info dictionary, - remove the key and instead apply the transparency to the palette. - Otherwise, the image is unchanged. - """ - if self.mode != "P" or "transparency" not in self.info: - return - - from . import ImagePalette - - palette = self.getpalette("RGBA") - assert palette is not None - transparency = self.info["transparency"] - if isinstance(transparency, bytes): - for i, alpha in enumerate(transparency): - palette[i * 4 + 3] = alpha - else: - palette[transparency * 4 + 3] = 0 - self.palette = ImagePalette.ImagePalette("RGBA", bytes(palette)) - self.palette.dirty = 1 - - del self.info["transparency"] - - def getpixel( - self, xy: tuple[int, int] | list[int] - ) -> float | tuple[int, ...] | None: - """ - Returns the pixel value at a given position. - - :param xy: The coordinate, given as (x, y). See - :ref:`coordinate-system`. - :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(tuple(xy)) - - def getprojection(self) -> tuple[list[int], list[int]]: - """ - 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 list(x), list(y) - - def histogram(self, mask: Image | None = None, extrema=None) -> list[int]: - """ - 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. Counts are grouped into 256 bins for each band, even if - the image has more than 8 bits per band. 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 grayscale ("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 grayscale image ("L"). - - :param mask: An optional mask. - :param extrema: An optional tuple of manually-specified extrema. - :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 entropy(self, mask=None, extrema=None): - """ - Calculates and returns the entropy for the image. - - A bilevel image (mode "1") is treated as a grayscale ("L") - image by this method. - - If a mask is provided, the method employs the 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 grayscale image ("L"). - - :param mask: An optional mask. - :param extrema: An optional tuple of manually-specified extrema. - :returns: A float value representing the image entropy - """ - self.load() - if mask: - mask.load() - return self.im.entropy((0, 0), mask.im) - if self.mode in ("I", "F"): - if extrema is None: - extrema = self.getextrema() - return self.im.entropy(extrema) - return self.im.entropy() - - def paste( - self, - im: Image | str | float | tuple[float, ...], - box: Image | tuple[int, int, int, int] | tuple[int, int] | None = None, - mask: Image | None = None, - ) -> 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)). See :ref:`coordinate-system`. 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", "LA", "RGBA" - or "RGBa" images (if present, 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, float 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): - if mask is not None: - msg = "If using second argument as mask, third argument must be None" - raise ValueError(msg) - # abbreviated paste(im, mask) syntax - mask = box - box = None - assert not isinstance(box, Image) - - 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? - msg = "cannot determine region size; use 4-item box" - raise ValueError(msg) - box += (box[0] + size[0], box[1] + size[1]) - - if isinstance(im, str): - 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 ("LA", "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: Image, dest: Sequence[int] = (0, 0), source: Sequence[int] = (0, 0) - ) -> None: - """'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)): - msg = "Source must be a list or tuple" - raise ValueError(msg) - if not isinstance(dest, (list, tuple)): - msg = "Destination must be a list or tuple" - raise ValueError(msg) - - if len(source) == 4: - overlay_crop_box = tuple(source) - elif len(source) == 2: - overlay_crop_box = tuple(source) + im.size - else: - msg = "Source must be a sequence of length 2 or 4" - raise ValueError(msg) - - if not len(dest) == 2: - msg = "Destination must be a sequence of length 2" - raise ValueError(msg) - if min(source) < 0: - msg = "Source must be non-negative" - raise ValueError(msg) - - # over image, crop if it's not the whole image. - if overlay_crop_box == (0, 0) + im.size: - overlay = im - else: - overlay = im.crop(overlay_crop_box) - - # target for the paste - box = tuple(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: Sequence[float] | Callable[[int], float] | ImagePointHandler, - mode: str | None = None, - ) -> Image: - """ - Maps this image through a lookup table or function. - - :param lut: A lookup table, containing 256 (or 65536 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. - - It may also be an :py:class:`~PIL.Image.ImagePointHandler` - object:: - - class Example(Image.ImagePointHandler): - def point(self, data): - # Return result - :param mode: Output mode (default is same as input). 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 - flatLut = [lut(i) for i in range(256)] * self.im.bands - else: - flatLut = lut - - if self.mode == "F": - # FIXME: _imaging returns a confusing error message for this case - msg = "point operation not supported for this mode" - raise ValueError(msg) - - if mode != "F": - flatLut = [round(i) for i in flatLut] - return self._new(self.im.point(flatLut, mode)) - - def putalpha(self, alpha: Image | int) -> None: - """ - 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. - """ - - self._ensure_mutable() - - if self.mode not in ("LA", "PA", "RGBA"): - # attempt to promote self to a matching alpha mode - try: - mode = getmodebase(self.mode) + "A" - try: - self.im.setmode(mode) - except (AttributeError, ValueError) as e: - # do things the hard way - im = self.im.convert(mode) - if im.mode not in ("LA", "PA", "RGBA"): - msg = "alpha channel could not be added" - raise ValueError(msg) from e # sanity check - self.im = im - self.pyaccess = None - self._mode = self.im.mode - except KeyError as e: - msg = "illegal image mode" - raise ValueError(msg) from e - - if self.mode in ("LA", "PA"): - band = 1 - else: - band = 3 - - if isImageType(alpha): - # alpha layer - if alpha.mode not in ("1", "L"): - msg = "illegal image mode" - raise ValueError(msg) - alpha.load() - if alpha.mode == "1": - alpha = alpha.convert("L") - else: - # constant alpha - alpha = cast(int, alpha) # see python/typing#1013 - 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: Sequence[float] | Sequence[Sequence[int]], - scale: float = 1.0, - offset: float = 0.0, - ) -> None: - """ - Copies pixel data from a flattened sequence object into the image. The - values should start at the upper left corner (0, 0), continue to the - end of the line, followed directly by the first value of the second - line, and so on. Data will be read 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 flattened 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") -> None: - """ - Attaches a palette to this image. The image must be a "P", "PA", "L" - or "LA" image. - - The palette sequence must contain at most 256 colors, made up of one - integer value for each channel in the raw mode. - For example, if the raw mode is "RGB", then it can contain at most 768 - values, made up of red, green and blue values for the corresponding pixel - index in the 256 colors. - If the raw mode is "RGBA", then it can contain at most 1024 values, - containing red, green, blue and alpha values. - - Alternatively, an 8-bit string may be used instead of an integer sequence. - - :param data: A palette sequence (either a list or a string). - :param rawmode: The raw mode of the palette. Either "RGB", "RGBA", or a mode - that can be transformed to "RGB" or "RGBA" (e.g. "R", "BGR;15", "RGBA;L"). - """ - from . import ImagePalette - - if self.mode not in ("L", "LA", "P", "PA"): - msg = "illegal image mode" - raise ValueError(msg) - if isinstance(data, ImagePalette.ImagePalette): - palette = ImagePalette.raw(data.rawmode, data.palette) - else: - if not isinstance(data, bytes): - data = bytes(data) - palette = ImagePalette.raw(rawmode, data) - self._mode = "PA" if "A" in self.mode else "P" - self.palette = palette - self.palette.mode = "RGBA" if "A" in rawmode else "RGB" - self.load() # install new palette - - def putpixel( - self, xy: tuple[int, int], value: float | tuple[int, ...] | list[int] - ) -> None: - """ - 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. In addition to this, RGB and RGBA tuples are - accepted for P and PA 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). See - :ref:`coordinate-system`. - :param value: The pixel value. - """ - - if self.readonly: - self._copy() - self.load() - - if self.pyaccess: - return self.pyaccess.putpixel(xy, value) - - if ( - self.mode in ("P", "PA") - and isinstance(value, (list, tuple)) - and len(value) in [3, 4] - ): - # RGB or RGBA value for a P or PA image - if self.mode == "PA": - alpha = value[3] if len(value) == 4 else 255 - value = value[:3] - palette_index = self.palette.getcolor(value, self) - value = (palette_index, alpha) if self.mode == "PA" else palette_index - 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(256))`` - 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"): - msg = "illegal image mode" - raise ValueError(msg) - - bands = 3 - palette_mode = "RGB" - if source_palette is None: - if self.mode == "P": - self.load() - palette_mode = self.im.getpalettemode() - if palette_mode == "RGBA": - bands = 4 - source_palette = self.im.getpalette(palette_mode, palette_mode) - else: # L-mode - source_palette = bytearray(i // 3 for i in range(768)) - - palette_bytes = b"" - new_positions = [0] * 256 - - # pick only the used colors from the palette - for i, oldPosition in enumerate(dest_map): - palette_bytes += source_palette[ - oldPosition * bands : oldPosition * bands + bands - ] - 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( - palette_mode, palette=mapping_palette * bands - ) - # 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(palette_mode, palette_mode + ";L", m_im.palette.tobytes()) - - m_im = m_im.convert("L") - - m_im.putpalette(palette_bytes, palette_mode) - m_im.palette = ImagePalette.ImagePalette(palette_mode, palette=palette_bytes) - - if "transparency" in self.info: - try: - m_im.info["transparency"] = dest_map.index(self.info["transparency"]) - except ValueError: - if "transparency" in m_im.info: - del m_im.info["transparency"] - - return m_im - - def _get_safe_box(self, size, resample, box): - """Expands the box so it includes adjacent pixels - that may be used by resampling with the given resampling filter. - """ - filter_support = _filters_support[resample] - 0.5 - scale_x = (box[2] - box[0]) / size[0] - scale_y = (box[3] - box[1]) / size[1] - support_x = filter_support * scale_x - support_y = filter_support * scale_y - - return ( - max(0, int(box[0] - support_x)), - max(0, int(box[1] - support_y)), - min(self.size[0], math.ceil(box[2] + support_x)), - min(self.size[1], math.ceil(box[3] + support_y)), - ) - - def resize( - self, - size: tuple[int, int], - resample: int | None = None, - box: tuple[float, float, float, float] | None = None, - reducing_gap: float | None = None, - ) -> Image: - """ - 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:data:`Resampling.NEAREST`, :py:data:`Resampling.BOX`, - :py:data:`Resampling.BILINEAR`, :py:data:`Resampling.HAMMING`, - :py:data:`Resampling.BICUBIC` or :py:data:`Resampling.LANCZOS`. - If the image has mode "1" or "P", it is always set to - :py:data:`Resampling.NEAREST`. If the image mode specifies a number - of bits, such as "I;16", then the default filter is - :py:data:`Resampling.NEAREST`. Otherwise, the default filter is - :py:data:`Resampling.BICUBIC`. See: :ref:`concept-filters`. - :param box: An optional 4-tuple of floats providing - the source image region to be scaled. - The values must be within (0, 0, width, height) rectangle. - If omitted or None, the entire source is used. - :param reducing_gap: Apply optimization by resizing the image - in two steps. First, reducing the image by integer times - using :py:meth:`~PIL.Image.Image.reduce`. - Second, resizing using regular resampling. The last step - changes size no less than by ``reducing_gap`` times. - ``reducing_gap`` may be None (no first step is performed) - or should be greater than 1.0. The bigger ``reducing_gap``, - the closer the result to the fair resampling. - The smaller ``reducing_gap``, the faster resizing. - With ``reducing_gap`` greater or equal to 3.0, the result is - indistinguishable from fair resampling in most cases. - The default value is None (no optimization). - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if resample is None: - type_special = ";" in self.mode - resample = Resampling.NEAREST if type_special else Resampling.BICUBIC - elif resample not in ( - Resampling.NEAREST, - Resampling.BILINEAR, - Resampling.BICUBIC, - Resampling.LANCZOS, - Resampling.BOX, - Resampling.HAMMING, - ): - msg = f"Unknown resampling filter ({resample})." - - filters = [ - f"{filter[1]} ({filter[0]})" - for filter in ( - (Resampling.NEAREST, "Image.Resampling.NEAREST"), - (Resampling.LANCZOS, "Image.Resampling.LANCZOS"), - (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), - (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), - (Resampling.BOX, "Image.Resampling.BOX"), - (Resampling.HAMMING, "Image.Resampling.HAMMING"), - ) - ] - msg += f" Use {', '.join(filters[:-1])} or {filters[-1]}" - raise ValueError(msg) - - if reducing_gap is not None and reducing_gap < 1.0: - msg = "reducing_gap must be 1.0 or greater" - raise ValueError(msg) - - self.load() - if box is None: - box = (0, 0) + self.size - - if self.size == size and box == (0, 0) + self.size: - return self.copy() - - if self.mode in ("1", "P"): - resample = Resampling.NEAREST - - if self.mode in ["LA", "RGBA"] and resample != Resampling.NEAREST: - im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - im = im.resize(size, resample, box) - return im.convert(self.mode) - - self.load() - - if reducing_gap is not None and resample != Resampling.NEAREST: - factor_x = int((box[2] - box[0]) / size[0] / reducing_gap) or 1 - factor_y = int((box[3] - box[1]) / size[1] / reducing_gap) or 1 - if factor_x > 1 or factor_y > 1: - reduce_box = self._get_safe_box(size, resample, box) - factor = (factor_x, factor_y) - self = ( - self.reduce(factor, box=reduce_box) - if callable(self.reduce) - else Image.reduce(self, factor, box=reduce_box) - ) - box = ( - (box[0] - reduce_box[0]) / factor_x, - (box[1] - reduce_box[1]) / factor_y, - (box[2] - reduce_box[0]) / factor_x, - (box[3] - reduce_box[1]) / factor_y, - ) - - return self._new(self.im.resize(size, resample, box)) - - def reduce( - self, - factor: int | tuple[int, int], - box: tuple[int, int, int, int] | None = None, - ) -> Image: - """ - Returns a copy of the image reduced ``factor`` times. - If the size of the image is not dividable by ``factor``, - the resulting size will be rounded up. - - :param factor: A greater than 0 integer or tuple of two integers - for width and height separately. - :param box: An optional 4-tuple of ints providing - the source image region to be reduced. - The values must be within ``(0, 0, width, height)`` rectangle. - If omitted or ``None``, the entire source is used. - """ - if not isinstance(factor, (list, tuple)): - factor = (factor, factor) - - if box is None: - box = (0, 0) + self.size - - if factor == (1, 1) and box == (0, 0) + self.size: - return self.copy() - - if self.mode in ["LA", "RGBA"]: - im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - im = im.reduce(factor, box) - return im.convert(self.mode) - - self.load() - - return self._new(self.im.reduce(factor, box)) - - def rotate( - self, - angle: float, - resample: Resampling = Resampling.NEAREST, - expand: int | bool = False, - center: tuple[float, float] | None = None, - translate: tuple[int, int] | None = None, - fillcolor: float | tuple[float, ...] | str | None = None, - ) -> Image: - """ - 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:data:`Resampling.NEAREST` (use nearest neighbour), - :py:data:`Resampling.BILINEAR` (linear interpolation in a 2x2 - environment), or :py:data:`Resampling.BICUBIC` (cubic spline - interpolation in a 4x4 environment). If omitted, or if the image has - mode "1" or "P", it is set to :py:data:`Resampling.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). - :param fillcolor: An optional color for area outside the rotated image. - :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(Transpose.ROTATE_180) - if angle in (90, 270) and (expand or self.width == self.height): - return self.transpose( - Transpose.ROTATE_90 if angle == 90 else 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: - center = (w / 2, h / 2) - - 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( - -center[0] - post_trans[0], -center[1] - post_trans[1], matrix - ) - matrix[2] += center[0] - matrix[5] += 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 = math.ceil(max(xx)) - math.floor(min(xx)) - nh = 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), Transform.AFFINE, matrix, resample, fillcolor=fillcolor - ) - - def save( - self, fp: StrOrBytesPath | IO[bytes], format: str | None = None, **params: Any - ) -> None: - """ - 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), os.PathLike 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 params: Extra parameters to the image writer. - :returns: None - :exception ValueError: If the output format could not be determined - from the file name. Use the format option to solve this. - :exception OSError: If the file could not be written. The file - may have been created, and may contain partial data. - """ - - filename: str | bytes = "" - open_fp = False - if is_path(fp): - filename = os.path.realpath(os.fspath(fp)) - open_fp = True - elif fp == sys.stdout: - try: - fp = sys.stdout.buffer - except AttributeError: - pass - if not filename and hasattr(fp, "name") and is_path(fp.name): - # only set the name for metadata purposes - filename = os.path.realpath(os.fspath(fp.name)) - - # may mutate self! - self._ensure_mutable() - - save_all = params.pop("save_all", False) - self.encoderinfo = params - self.encoderconfig: tuple[Any, ...] = () - - preinit() - - filename_ext = os.path.splitext(filename)[1].lower() - ext = filename_ext.decode() if isinstance(filename_ext, bytes) else filename_ext - - if not format: - if ext not in EXTENSION: - init() - try: - format = EXTENSION[ext] - except KeyError as e: - msg = f"unknown file extension: {ext}" - raise ValueError(msg) from e - - if format.upper() not in SAVE: - init() - if save_all: - save_handler = SAVE_ALL[format.upper()] - else: - save_handler = SAVE[format.upper()] - - created = False - if open_fp: - created = not os.path.exists(filename) - if params.get("append", False): - # Open also for reading ("+"), because TIFF save_all - # writer needs to go back and edit the written data. - fp = builtins.open(filename, "r+b") - else: - fp = builtins.open(filename, "w+b") - else: - fp = cast(IO[bytes], fp) - - try: - save_handler(self, fp, filename) - except Exception: - if open_fp: - fp.close() - if created: - try: - os.remove(filename) - except PermissionError: - pass - raise - if open_fp: - fp.close() - - def seek(self, frame: int) -> None: - """ - 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. - - See :py:meth:`~PIL.Image.Image.tell`. - - If defined, :attr:`~PIL.Image.Image.n_frames` refers to the - number of available frames. - - :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: - msg = "no more images in file" - raise EOFError(msg) - - def show(self, title: str | None = None) -> None: - """ - Displays this image. This method is mainly intended for debugging purposes. - - This method calls :py:func:`PIL.ImageShow.show` internally. You can use - :py:func:`PIL.ImageShow.register` to override its default behaviour. - - The image is first saved to a temporary file. By default, it will be in - PNG format. - - On Unix, the image is then opened using the **xdg-open**, **display**, - **gm**, **eog** or **xv** utility, depending on which one can be found. - - On macOS, the image is opened with the native Preview application. - - On Windows, the image is opened with the standard PNG display utility. - - :param title: Optional title to use for the image window, where possible. - """ - - _show(self, title=title) - - def split(self) -> tuple[Image, ...]: - """ - 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: - return (self.copy(),) - return tuple(map(self._new, self.im.split())) - - def getchannel(self, channel: int | str) -> Image: - """ - 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 isinstance(channel, str): - try: - channel = self.getbands().index(channel) - except ValueError as e: - msg = f'The image has no channel "{channel}"' - raise ValueError(msg) from e - - return self._new(self.im.getband(channel)) - - def tell(self) -> int: - """ - Returns the current frame number. See :py:meth:`~PIL.Image.Image.seek`. - - If defined, :attr:`~PIL.Image.Image.n_frames` refers to the - number of available frames. - - :returns: Frame number, starting with 0. - """ - return 0 - - def thumbnail( - self, - size: tuple[float, float], - resample: Resampling = Resampling.BICUBIC, - reducing_gap: float | None = 2.0, - ) -> None: - """ - 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: The requested size in pixels, as a 2-tuple: - (width, height). - :param resample: Optional resampling filter. This can be one - of :py:data:`Resampling.NEAREST`, :py:data:`Resampling.BOX`, - :py:data:`Resampling.BILINEAR`, :py:data:`Resampling.HAMMING`, - :py:data:`Resampling.BICUBIC` or :py:data:`Resampling.LANCZOS`. - If omitted, it defaults to :py:data:`Resampling.BICUBIC`. - (was :py:data:`Resampling.NEAREST` prior to version 2.5.0). - See: :ref:`concept-filters`. - :param reducing_gap: Apply optimization by resizing the image - in two steps. First, reducing the image by integer times - using :py:meth:`~PIL.Image.Image.reduce` or - :py:meth:`~PIL.Image.Image.draft` for JPEG images. - Second, resizing using regular resampling. The last step - changes size no less than by ``reducing_gap`` times. - ``reducing_gap`` may be None (no first step is performed) - or should be greater than 1.0. The bigger ``reducing_gap``, - the closer the result to the fair resampling. - The smaller ``reducing_gap``, the faster resizing. - With ``reducing_gap`` greater or equal to 3.0, the result is - indistinguishable from fair resampling in most cases. - The default value is 2.0 (very close to fair resampling - while still being faster in many cases). - :returns: None - """ - - provided_size = tuple(map(math.floor, size)) - - def preserve_aspect_ratio() -> tuple[int, int] | None: - def round_aspect(number, key): - return max(min(math.floor(number), math.ceil(number), key=key), 1) - - x, y = provided_size - if x >= self.width and y >= self.height: - return None - - aspect = self.width / self.height - if x / y >= aspect: - x = round_aspect(y * aspect, key=lambda n: abs(aspect - n / y)) - else: - y = round_aspect( - x / aspect, key=lambda n: 0 if n == 0 else abs(aspect - x / n) - ) - return x, y - - box = None - final_size: tuple[int, int] - if reducing_gap is not None: - preserved_size = preserve_aspect_ratio() - if preserved_size is None: - return - final_size = preserved_size - - res = self.draft( - None, (int(size[0] * reducing_gap), int(size[1] * reducing_gap)) - ) - if res is not None: - box = res[1] - if box is None: - self.load() - - # load() may have changed the size of the image - preserved_size = preserve_aspect_ratio() - if preserved_size is None: - return - final_size = preserved_size - - if self.size != final_size: - im = self.resize(final_size, resample, box=box, reducing_gap=reducing_gap) - - self.im = im.im - self._size = final_size - self._mode = self.im.mode - - 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: tuple[int, int], - method: Transform | ImageTransformHandler | SupportsGetData, - data: Sequence[Any] | None = None, - resample: int = Resampling.NEAREST, - fill: int = 1, - fillcolor: float | tuple[float, ...] | str | None = None, - ) -> Image: - """ - 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 in pixels, as a 2-tuple: - (width, height). - :param method: The transformation method. This is one of - :py:data:`Transform.EXTENT` (cut out a rectangular subregion), - :py:data:`Transform.AFFINE` (affine transform), - :py:data:`Transform.PERSPECTIVE` (perspective transform), - :py:data:`Transform.QUAD` (map a quadrilateral to a rectangle), or - :py:data:`Transform.MESH` (map a number of source quadrilaterals - in one operation). - - It may also be an :py:class:`~PIL.Image.ImageTransformHandler` - object:: - - class Example(Image.ImageTransformHandler): - def transform(self, size, data, resample, fill=1): - # Return result - - Implementations of :py:class:`~PIL.Image.ImageTransformHandler` - for some of the :py:class:`Transform` methods are provided - in :py:mod:`~PIL.ImageTransform`. - - It may also be an object with a ``method.getdata`` method - that returns a tuple supplying new ``method`` and ``data`` values:: - - class Example: - def getdata(self): - method = Image.Transform.EXTENT - data = (0, 0, 100, 100) - return method, data - :param data: Extra data to the transformation method. - :param resample: Optional resampling filter. It can be one of - :py:data:`Resampling.NEAREST` (use nearest neighbour), - :py:data:`Resampling.BILINEAR` (linear interpolation in a 2x2 - environment), or :py:data:`Resampling.BICUBIC` (cubic spline - interpolation in a 4x4 environment). If omitted, or if the image - has mode "1" or "P", it is set to :py:data:`Resampling.NEAREST`. - See: :ref:`concept-filters`. - :param fill: If ``method`` is an - :py:class:`~PIL.Image.ImageTransformHandler` object, this is one of - the arguments passed to it. Otherwise, it is unused. - :param fillcolor: Optional fill color for the area outside the - transform in the output image. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - - if self.mode in ("LA", "RGBA") and resample != Resampling.NEAREST: - return ( - self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) - .transform(size, method, data, resample, fill, fillcolor) - .convert(self.mode) - ) - - 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: - msg = "missing method data" - raise ValueError(msg) - - im = new(self.mode, size, fillcolor) - if self.mode == "P" and self.palette: - im.palette = self.palette.copy() - im.info = self.info.copy() - if method == Transform.MESH: - # list of quads - for box, quad in data: - im.__transformer( - box, self, Transform.QUAD, quad, resample, fillcolor is None - ) - else: - im.__transformer( - (0, 0) + size, self, method, data, resample, fillcolor is None - ) - - return im - - def __transformer( - self, box, image, method, data, resample=Resampling.NEAREST, fill=1 - ): - w = box[2] - box[0] - h = box[3] - box[1] - - if method == Transform.AFFINE: - data = data[:6] - - elif method == Transform.EXTENT: - # convert extent to an affine transform - x0, y0, x1, y1 = data - xs = (x1 - x0) / w - ys = (y1 - y0) / h - method = Transform.AFFINE - data = (xs, 0, x0, 0, ys, y0) - - elif method == Transform.PERSPECTIVE: - data = data[:8] - - elif method == Transform.QUAD: - # quadrilateral warp. data specifies the four corners - # given as NW, SW, SE, and NE. - nw = data[: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: - msg = "unknown transformation method" - raise ValueError(msg) - - if resample not in ( - Resampling.NEAREST, - Resampling.BILINEAR, - Resampling.BICUBIC, - ): - if resample in (Resampling.BOX, Resampling.HAMMING, Resampling.LANCZOS): - msg = { - Resampling.BOX: "Image.Resampling.BOX", - Resampling.HAMMING: "Image.Resampling.HAMMING", - Resampling.LANCZOS: "Image.Resampling.LANCZOS", - }[resample] + f" ({resample}) cannot be used." - else: - msg = f"Unknown resampling filter ({resample})." - - filters = [ - f"{filter[1]} ({filter[0]})" - for filter in ( - (Resampling.NEAREST, "Image.Resampling.NEAREST"), - (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), - (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), - ) - ] - msg += f" Use {', '.join(filters[:-1])} or {filters[-1]}" - raise ValueError(msg) - - image.load() - - self.load() - - if image.mode in ("1", "P"): - resample = Resampling.NEAREST - - self.im.transform(box, image.im, method, data, resample, fill) - - def transpose(self, method: Transpose) -> Image: - """ - Transpose image (flip or rotate in 90 degree steps) - - :param method: One of :py:data:`Transpose.FLIP_LEFT_RIGHT`, - :py:data:`Transpose.FLIP_TOP_BOTTOM`, :py:data:`Transpose.ROTATE_90`, - :py:data:`Transpose.ROTATE_180`, :py:data:`Transpose.ROTATE_270`, - :py:data:`Transpose.TRANSPOSE` or :py:data:`Transpose.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: int) -> Image: - """ - 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: - msg = "Qt bindings are not installed" - raise ImportError(msg) - return ImageQt.toqimage(self) - - def toqpixmap(self): - """Returns a QPixmap copy of this image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - msg = "Qt bindings are not installed" - raise ImportError(msg) - return ImageQt.toqpixmap(self) - - -# -------------------------------------------------------------------- -# Abstract handlers. - - -class ImagePointHandler: - """ - Used as a mixin by point transforms - (for use with :py:meth:`~PIL.Image.Image.point`) - """ - - @abc.abstractmethod - def point(self, im: Image) -> Image: - pass - - -class ImageTransformHandler: - """ - Used as a mixin by geometry transforms - (for use with :py:meth:`~PIL.Image.Image.transform`) - """ - - @abc.abstractmethod - def transform( - self, - size: tuple[int, int], - image: Image, - **options: Any, - ) -> Image: - pass - - -# -------------------------------------------------------------------- -# Factories - -# -# Debugging - - -def _wedge() -> Image: - """Create grayscale wedge (for debugging only)""" - - return Image()._new(core.wedge("L")) - - -def _check_size(size: Any) -> None: - """ - Common check to enforce type and sanity check on size tuples - - :param size: Should be a 2 tuple of (width, height) - :returns: None, or raises a ValueError - """ - - if not isinstance(size, (list, tuple)): - msg = "Size must be a list or tuple" - raise ValueError(msg) - if len(size) != 2: - msg = "Size must be a sequence of length 2" - raise ValueError(msg) - if size[0] < 0 or size[1] < 0: - msg = "Width and height must be >= 0" - raise ValueError(msg) - - -def new( - mode: str, - size: tuple[int, int] | list[int], - color: float | tuple[float, ...] | str | None = 0, -) -> Image: - """ - 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 or HSV 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. - """ - - if mode in ("BGR;15", "BGR;16", "BGR;24"): - deprecate(mode, 12) - - _check_size(size) - - if color is None: - # don't initialize - return Image()._new(core.new(mode, size)) - - if isinstance(color, str): - # css3-style specifier - - from . import ImageColor - - color = ImageColor.getcolor(color, mode) - - im = Image() - if ( - mode == "P" - and isinstance(color, (list, tuple)) - and all(isinstance(i, int) for i in color) - ): - color_ints: tuple[int, ...] = cast(Tuple[int, ...], tuple(color)) - if len(color_ints) == 3 or len(color_ints) == 4: - # RGB or RGBA value for a P image - from . import ImagePalette - - im.palette = ImagePalette.ImagePalette() - color = im.palette.getcolor(color_ints) - return im._new(core.fill(mode, size, color)) - - -def frombytes( - mode: str, - size: tuple[int, int], - data: bytes | bytearray, - decoder_name: str = "raw", - *args: Any, -) -> Image: - """ - 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 Codec `. - - 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) - - im = new(mode, size) - if im.width != 0 and im.height != 0: - decoder_args: Any = args - if len(decoder_args) == 1 and isinstance(decoder_args[0], tuple): - # may pass tuple instead of argument list - decoder_args = decoder_args[0] - - if decoder_name == "raw" and decoder_args == (): - decoder_args = mode - - im.frombytes(data, decoder_name, decoder_args) - return im - - -def frombuffer( - mode: str, size: tuple[int, int], data, decoder_name: str = "raw", *args: Any -) -> Image: - """ - 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 - :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load it. - - 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 == (): - args = mode, 0, 1 - if args[0] in _MAPMODES: - im = new(mode, (0, 0)) - im = im._new(core.map_buffer(data, size, decoder_name, 0, args)) - if mode == "P": - from . import ImagePalette - - im.palette = ImagePalette.ImagePalette("RGB", im.im.getpalette("RGB")) - im.readonly = 1 - return im - - return frombytes(mode, size, data, decoder_name, args) - - -class SupportsArrayInterface(Protocol): - """ - An object that has an ``__array_interface__`` dictionary. - """ - - @property - def __array_interface__(self) -> dict[str, Any]: - raise NotImplementedError() - - -def fromarray(obj: SupportsArrayInterface, mode: str | None = None) -> Image: - """ - Creates an image memory from an object exporting the array interface - (using the buffer protocol):: - - from PIL import Image - import numpy as np - a = np.zeros((5, 5)) - im = Image.fromarray(a) - - If ``obj`` is not contiguous, then the ``tobytes`` method is called - and :py:func:`~PIL.Image.frombuffer` is used. - - In the case of NumPy, be aware that Pillow modes do not always correspond - to NumPy dtypes. Pillow modes only offer 1-bit pixels, 8-bit pixels, - 32-bit signed integer pixels, and 32-bit floating point pixels. - - Pillow images can also be converted to arrays:: - - from PIL import Image - import numpy as np - im = Image.open("hopper.jpg") - a = np.asarray(im) - - When converting Pillow images to arrays however, only pixel values are - transferred. This means that P and PA mode images will lose their palette. - - :param obj: Object with array interface - :param mode: Optional mode to use when reading ``obj``. Will be determined from - type if ``None``. - - This will not be used to convert the data after reading, but will be used to - change how the data is read:: - - from PIL import Image - import numpy as np - a = np.full((1, 1), 300) - im = Image.fromarray(a, mode="L") - im.getpixel((0, 0)) # 44 - im = Image.fromarray(a, mode="RGB") - im.getpixel((0, 0)) # (44, 1, 0) - - See: :ref:`concept-modes` for general information about 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"] - except KeyError as e: - msg = "Cannot handle this data type" - raise TypeError(msg) from e - try: - mode, rawmode = _fromarray_typemap[typekey] - except KeyError as e: - typekey_shape, typestr = typekey - msg = f"Cannot handle this data type: {typekey_shape}, {typestr}" - raise TypeError(msg) from e - else: - rawmode = mode - if mode in ["1", "L", "I", "P", "F"]: - ndmax = 2 - elif mode == "RGB": - ndmax = 3 - else: - ndmax = 4 - if ndim > ndmax: - msg = f"Too many dimensions: {ndim} > {ndmax}." - raise ValueError(msg) - - size = 1 if ndim == 1 else shape[1], shape[0] - if strides is not None: - if hasattr(obj, "tobytes"): - obj = obj.tobytes() - elif hasattr(obj, "tostring"): - obj = obj.tostring() - else: - msg = "'strides' requires either tobytes() or tostring()" - raise ValueError(msg) - - 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: - msg = "Qt bindings are not installed" - raise ImportError(msg) - return ImageQt.fromqimage(im) - - -def fromqpixmap(im): - """Creates an image instance from a QPixmap image""" - from . import ImageQt - - if not ImageQt.qt_is_installed: - msg = "Qt bindings are not installed" - raise ImportError(msg) - 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: - ((1, 1), f"{_ENDIAN}i4"): ("I", "I"), - ((1, 1), f"{_ENDIAN}f4"): ("F", "F"), -} - - -def _decompression_bomb_check(size: tuple[int, int]) -> None: - if MAX_IMAGE_PIXELS is None: - return - - pixels = max(1, size[0]) * max(1, size[1]) - - if pixels > 2 * MAX_IMAGE_PIXELS: - msg = ( - f"Image size ({pixels} pixels) exceeds limit of {2 * MAX_IMAGE_PIXELS} " - "pixels, could be decompression bomb DOS attack." - ) - raise DecompressionBombError(msg) - - if pixels > MAX_IMAGE_PIXELS: - warnings.warn( - f"Image size ({pixels} pixels) exceeds limit of {MAX_IMAGE_PIXELS} pixels, " - "could be decompression bomb DOS attack.", - DecompressionBombWarning, - ) - - -def open( - fp: StrOrBytesPath | IO[bytes], - mode: Literal["r"] = "r", - formats: list[str] | tuple[str, ...] | None = None, -) -> ImageFile.ImageFile: - """ - 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`. See :ref:`file-handling`. - - :param fp: A filename (string), os.PathLike object or a file object. - The file object must implement ``file.read``, - ``file.seek``, and ``file.tell`` methods, - and be opened in binary mode. The file object will also seek to zero - before reading. - :param mode: The mode. If given, this argument must be "r". - :param formats: A list or tuple of formats to attempt to load the file in. - This can be used to restrict the set of formats checked. - Pass ``None`` to try all supported formats. You can print the set of - available formats by running ``python3 -m PIL`` or using - the :py:func:`PIL.features.pilinfo` function. - :returns: An :py:class:`~PIL.Image.Image` object. - :exception FileNotFoundError: If the file cannot be found. - :exception PIL.UnidentifiedImageError: If the image cannot be opened and - identified. - :exception ValueError: If the ``mode`` is not "r", or if a ``StringIO`` - instance is used for ``fp``. - :exception TypeError: If ``formats`` is not ``None``, a list or a tuple. - """ - - if mode != "r": - msg = f"bad mode {repr(mode)}" # type: ignore[unreachable] - raise ValueError(msg) - elif isinstance(fp, io.StringIO): - msg = ( # type: ignore[unreachable] - "StringIO cannot be used to open an image. " - "Binary data must be used instead." - ) - raise ValueError(msg) - - if formats is None: - formats = ID - elif not isinstance(formats, (list, tuple)): - msg = "formats must be a list or tuple" # type: ignore[unreachable] - raise TypeError(msg) - - exclusive_fp = False - filename: str | bytes = "" - if is_path(fp): - filename = os.path.realpath(os.fspath(fp)) - - if filename: - fp = builtins.open(filename, "rb") - exclusive_fp = True - else: - fp = cast(IO[bytes], fp) - - try: - fp.seek(0) - except (AttributeError, io.UnsupportedOperation): - fp = io.BytesIO(fp.read()) - exclusive_fp = True - - prefix = fp.read(16) - - preinit() - - warning_messages: list[str] = [] - - def _open_core( - fp: IO[bytes], - filename: str | bytes, - prefix: bytes, - formats: list[str] | tuple[str, ...], - ) -> ImageFile.ImageFile | None: - for i in formats: - i = i.upper() - if i not in OPEN: - init() - try: - factory, accept = OPEN[i] - result = not accept or accept(prefix) - if isinstance(result, str): - warning_messages.append(result) - elif result: - fp.seek(0) - im = factory(fp, filename) - _decompression_bomb_check(im.size) - return im - except (SyntaxError, IndexError, TypeError, struct.error) as e: - if WARN_POSSIBLE_FORMATS: - warning_messages.append(i + " opening failed. " + str(e)) - except BaseException: - if exclusive_fp: - fp.close() - raise - return None - - im = _open_core(fp, filename, prefix, formats) - - if im is None and formats is ID: - checked_formats = ID.copy() - if init(): - im = _open_core( - fp, - filename, - prefix, - tuple(format for format in formats if format not in checked_formats), - ) - - if im: - im._exclusive_fp = exclusive_fp - return im - - if exclusive_fp: - fp.close() - for message in warning_messages: - warnings.warn(message) - msg = "cannot identify image file %r" % (filename if filename else fp) - raise UnidentifiedImageError(msg) - - -# -# Image processing. - - -def alpha_composite(im1: Image, im2: Image) -> Image: - """ - 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: Image, im2: Image, alpha: float) -> Image: - """ - 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: Image, image2: Image, mask: Image) -> Image: - """ - 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: str, bands: Sequence[Image]) -> Image: - """ - 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: - msg = "wrong number of bands" - raise ValueError(msg) - for band in bands[1:]: - if band.mode != getmodetype(mode): - msg = "mode mismatch" - raise ValueError(msg) - if band.size != bands[0].size: - msg = "size mismatch" - raise ValueError(msg) - 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: str, - factory: Callable[[IO[bytes], str | bytes], ImageFile.ImageFile], - accept: Callable[[bytes], bool | str] | None = None, -) -> 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() - if id not in ID: - ID.append(id) - OPEN[id] = factory, accept - - -def register_mime(id: str, mimetype: str) -> None: - """ - Registers an image MIME type by populating ``Image.MIME``. This function - should not be used in application code. - - ``Image.MIME`` provides a mapping from image format identifiers to mime - formats, but :py:meth:`~PIL.ImageFile.ImageFile.get_format_mimetype` can - provide a different result for specific images. - - :param id: An image format identifier. - :param mimetype: The image MIME type for this format. - """ - MIME[id.upper()] = mimetype - - -def register_save( - id: str, driver: Callable[[Image, IO[bytes], str | bytes], None] -) -> None: - """ - 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: str, driver: Callable[[Image, IO[bytes], str | bytes], None] -) -> None: - """ - 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: str, extension: str) -> None: - """ - 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: str, extensions: list[str]) -> None: - """ - 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() -> dict[str, str]: - """ - Returns a dictionary containing all file extensions belonging - to registered plugins - """ - init() - return EXTENSION - - -def register_decoder(name: str, decoder: type[ImageFile.PyDecoder]) -> None: - """ - Registers an image decoder. This function should not be - used in application code. - - :param name: The name of the decoder - :param decoder: An ImageFile.PyDecoder object - - .. versionadded:: 4.1.0 - """ - DECODERS[name] = decoder - - -def register_encoder(name: str, encoder: type[ImageFile.PyEncoder]) -> None: - """ - Registers an image encoder. This function should not be - used in application code. - - :param name: The name of the encoder - :param encoder: An ImageFile.PyEncoder object - - .. versionadded:: 4.1.0 - """ - ENCODERS[name] = encoder - - -# -------------------------------------------------------------------- -# Simple display support. - - -def _show(image: Image, **options: Any) -> None: - from . import ImageShow - - ImageShow.show(image, **options) - - -# -------------------------------------------------------------------- -# Effects - - -def effect_mandelbrot( - size: tuple[int, int], extent: tuple[float, float, float, float], quality: int -) -> Image: - """ - 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, y1). - :param quality: Quality. - """ - return Image()._new(core.effect_mandelbrot(size, extent, quality)) - - -def effect_noise(size: tuple[int, int], sigma: float) -> Image: - """ - 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: str) -> Image: - """ - 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: str) -> Image: - """ - 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: dict[str, str] | None = None) -> None: - env_dict = env if env is not None else 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_dict: - continue - - var = env_dict[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 = int(var) * units - except ValueError: - warnings.warn(f"{var_name} is not int") - continue - - try: - setter(var_int) - except ValueError as e: - warnings.warn(f"{var_name}: {e}") - - -_apply_env_variables() -atexit.register(core.clear_cache) - - -if TYPE_CHECKING: - _ExifBase = MutableMapping[int, Any] -else: - _ExifBase = MutableMapping - - -class Exif(_ExifBase): - """ - This class provides read and write access to EXIF image data:: - - from PIL import Image - im = Image.open("exif.png") - exif = im.getexif() # Returns an instance of this class - - Information can be read and written, iterated over or deleted:: - - print(exif[274]) # 1 - exif[274] = 2 - for k, v in exif.items(): - print("Tag", k, "Value", v) # Tag 274 Value 2 - del exif[274] - - To access information beyond IFD0, :py:meth:`~PIL.Image.Exif.get_ifd` - returns a dictionary:: - - from PIL import ExifTags - im = Image.open("exif_gps.jpg") - exif = im.getexif() - gps_ifd = exif.get_ifd(ExifTags.IFD.GPSInfo) - print(gps_ifd) - - Other IFDs include ``ExifTags.IFD.Exif``, ``ExifTags.IFD.Makernote``, - ``ExifTags.IFD.Interop`` and ``ExifTags.IFD.IFD1``. - - :py:mod:`~PIL.ExifTags` also has enum classes to provide names for data:: - - print(exif[ExifTags.Base.Software]) # PIL - print(gps_ifd[ExifTags.GPS.GPSDateStamp]) # 1999:99:99 99:99:99 - """ - - endian = None - bigtiff = False - _loaded = False - - def __init__(self): - self._data = {} - self._hidden_data = {} - self._ifds = {} - self._info = None - self._loaded_exif = None - - def _fixup(self, value): - try: - if len(value) == 1 and isinstance(value, tuple): - return value[0] - except Exception: - pass - return value - - def _fixup_dict(self, src_dict): - # Helper function - # returns a dict with any single item tuples/lists as individual values - return {k: self._fixup(v) for k, v in src_dict.items()} - - def _get_ifd_dict(self, offset, group=None): - try: - # an offset pointer to the location of the nested embedded IFD. - # It should be a long, but may be corrupted. - self.fp.seek(offset) - except (KeyError, TypeError): - pass - else: - from . import TiffImagePlugin - - info = TiffImagePlugin.ImageFileDirectory_v2(self.head, group=group) - info.load(self.fp) - return self._fixup_dict(info) - - def _get_head(self): - version = b"\x2B" if self.bigtiff else b"\x2A" - if self.endian == "<": - head = b"II" + version + b"\x00" + o32le(8) - else: - head = b"MM\x00" + version + o32be(8) - if self.bigtiff: - head += o32le(8) if self.endian == "<" else o32be(8) - head += b"\x00\x00\x00\x00" - return head - - def load(self, data): - # Extract EXIF information. This 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 (!). - if data == self._loaded_exif: - return - self._loaded_exif = data - self._data.clear() - self._hidden_data.clear() - self._ifds.clear() - if data and data.startswith(b"Exif\x00\x00"): - data = data[6:] - if not data: - self._info = None - return - - self.fp = io.BytesIO(data) - self.head = self.fp.read(8) - # process dictionary - from . import TiffImagePlugin - - self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) - self.endian = self._info._endian - self.fp.seek(self._info.next) - self._info.load(self.fp) - - def load_from_fp(self, fp, offset=None): - self._loaded_exif = None - self._data.clear() - self._hidden_data.clear() - self._ifds.clear() - - # process dictionary - from . import TiffImagePlugin - - self.fp = fp - if offset is not None: - self.head = self._get_head() - else: - self.head = self.fp.read(8) - self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) - if self.endian is None: - self.endian = self._info._endian - if offset is None: - offset = self._info.next - self.fp.tell() - self.fp.seek(offset) - self._info.load(self.fp) - - def _get_merged_dict(self): - merged_dict = dict(self) - - # get EXIF extension - if ExifTags.IFD.Exif in self: - ifd = self._get_ifd_dict(self[ExifTags.IFD.Exif], ExifTags.IFD.Exif) - if ifd: - merged_dict.update(ifd) - - # GPS - if ExifTags.IFD.GPSInfo in self: - merged_dict[ExifTags.IFD.GPSInfo] = self._get_ifd_dict( - self[ExifTags.IFD.GPSInfo], ExifTags.IFD.GPSInfo - ) - - return merged_dict - - def tobytes(self, offset: int = 8) -> bytes: - from . import TiffImagePlugin - - head = self._get_head() - ifd = TiffImagePlugin.ImageFileDirectory_v2(ifh=head) - for tag, value in self.items(): - if tag in [ - ExifTags.IFD.Exif, - ExifTags.IFD.GPSInfo, - ] and not isinstance(value, dict): - value = self.get_ifd(tag) - if ( - tag == ExifTags.IFD.Exif - and ExifTags.IFD.Interop in value - and not isinstance(value[ExifTags.IFD.Interop], dict) - ): - value = value.copy() - value[ExifTags.IFD.Interop] = self.get_ifd(ExifTags.IFD.Interop) - ifd[tag] = value - return b"Exif\x00\x00" + head + ifd.tobytes(offset) - - def get_ifd(self, tag): - if tag not in self._ifds: - if tag == ExifTags.IFD.IFD1: - if self._info is not None and self._info.next != 0: - self._ifds[tag] = self._get_ifd_dict(self._info.next) - elif tag in [ExifTags.IFD.Exif, ExifTags.IFD.GPSInfo]: - offset = self._hidden_data.get(tag, self.get(tag)) - if offset is not None: - self._ifds[tag] = self._get_ifd_dict(offset, tag) - elif tag in [ExifTags.IFD.Interop, ExifTags.IFD.Makernote]: - if ExifTags.IFD.Exif not in self._ifds: - self.get_ifd(ExifTags.IFD.Exif) - tag_data = self._ifds[ExifTags.IFD.Exif][tag] - if tag == ExifTags.IFD.Makernote: - from .TiffImagePlugin import ImageFileDirectory_v2 - - if tag_data[:8] == b"FUJIFILM": - ifd_offset = i32le(tag_data, 8) - ifd_data = tag_data[ifd_offset:] - - makernote = {} - for i in range(0, struct.unpack(" 4: - (offset,) = struct.unpack("H", tag_data[:2])[0]): - ifd_tag, typ, count, data = struct.unpack( - ">HHL4s", tag_data[i * 12 + 2 : (i + 1) * 12 + 2] - ) - if ifd_tag == 0x1101: - # CameraInfo - (offset,) = struct.unpack(">L", data) - self.fp.seek(offset) - - camerainfo = {"ModelID": self.fp.read(4)} - - self.fp.read(4) - # Seconds since 2000 - camerainfo["TimeStamp"] = i32le(self.fp.read(12)) - - self.fp.read(4) - camerainfo["InternalSerialNumber"] = self.fp.read(4) - - self.fp.read(12) - parallax = self.fp.read(4) - handler = ImageFileDirectory_v2._load_dispatch[ - TiffTags.FLOAT - ][1] - camerainfo["Parallax"] = handler( - ImageFileDirectory_v2(), parallax, False - ) - - self.fp.read(4) - camerainfo["Category"] = self.fp.read(2) - - makernote = {0x1101: dict(self._fixup_dict(camerainfo))} - self._ifds[tag] = makernote - else: - # Interop - self._ifds[tag] = self._get_ifd_dict(tag_data, tag) - ifd = self._ifds.get(tag, {}) - if tag == ExifTags.IFD.Exif and self._hidden_data: - ifd = { - k: v - for (k, v) in ifd.items() - if k not in (ExifTags.IFD.Interop, ExifTags.IFD.Makernote) - } - return ifd - - def hide_offsets(self) -> None: - for tag in (ExifTags.IFD.Exif, ExifTags.IFD.GPSInfo): - if tag in self: - self._hidden_data[tag] = self[tag] - del self[tag] - - def __str__(self) -> str: - if self._info is not None: - # Load all keys into self._data - for tag in self._info: - self[tag] - - return str(self._data) - - def __len__(self) -> int: - keys = set(self._data) - if self._info is not None: - keys.update(self._info) - return len(keys) - - def __getitem__(self, tag): - if self._info is not None and tag not in self._data and tag in self._info: - self._data[tag] = self._fixup(self._info[tag]) - del self._info[tag] - return self._data[tag] - - def __contains__(self, tag) -> bool: - return tag in self._data or (self._info is not None and tag in self._info) - - def __setitem__(self, tag, value) -> None: - if self._info is not None and tag in self._info: - del self._info[tag] - self._data[tag] = value - - def __delitem__(self, tag: int) -> None: - if self._info is not None and tag in self._info: - del self._info[tag] - else: - del self._data[tag] - - def __iter__(self): - keys = set(self._data) - if self._info is not None: - keys.update(self._info) - return iter(keys) diff --git a/.venv/Lib/site-packages/PIL/ImageChops.py b/.venv/Lib/site-packages/PIL/ImageChops.py deleted file mode 100644 index 29a5c99..0000000 --- a/.venv/Lib/site-packages/PIL/ImageChops.py +++ /dev/null @@ -1,311 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# standard channel operations -# -# History: -# 1996-03-24 fl Created -# 1996-08-13 fl Added logical operations (for "1" images) -# 2000-10-12 fl Added offset method (from Image.py) -# -# Copyright (c) 1997-2000 by Secret Labs AB -# Copyright (c) 1996-2000 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# - -from __future__ import annotations - -from . import Image - - -def constant(image: Image.Image, value: int) -> Image.Image: - """Fill a channel with a given gray level. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.new("L", image.size, value) - - -def duplicate(image: Image.Image) -> Image.Image: - """Copy a channel. Alias for :py:meth:`PIL.Image.Image.copy`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return image.copy() - - -def invert(image: Image.Image) -> Image.Image: - """ - Invert an image (channel). :: - - out = MAX - image - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image.load() - return image._new(image.im.chop_invert()) - - -def lighter(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Compares the two images, pixel by pixel, and returns a new image containing - the lighter values. :: - - out = max(image1, image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_lighter(image2.im)) - - -def darker(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Compares the two images, pixel by pixel, and returns a new image containing - the darker values. :: - - out = min(image1, image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_darker(image2.im)) - - -def difference(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Returns the absolute value of the pixel-by-pixel difference between the two - images. :: - - out = abs(image1 - image2) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_difference(image2.im)) - - -def multiply(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two images on top of each other. - - If you multiply an image with a solid black image, the result is black. If - you multiply with a solid white image, the image is unaffected. :: - - out = image1 * image2 / MAX - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_multiply(image2.im)) - - -def screen(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two inverted images on top of each other. :: - - out = MAX - ((MAX - image1) * (MAX - image2) / MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_screen(image2.im)) - - -def soft_light(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two images on top of each other using the Soft Light algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_soft_light(image2.im)) - - -def hard_light(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two images on top of each other using the Hard Light algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_hard_light(image2.im)) - - -def overlay(image1: Image.Image, image2: Image.Image) -> Image.Image: - """ - Superimposes two images on top of each other using the Overlay algorithm - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_overlay(image2.im)) - - -def add( - image1: Image.Image, image2: Image.Image, scale: float = 1.0, offset: float = 0 -) -> Image.Image: - """ - Adds two images, dividing the result by scale and adding the - offset. If omitted, scale defaults to 1.0, and offset to 0.0. :: - - out = ((image1 + image2) / scale + offset) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_add(image2.im, scale, offset)) - - -def subtract( - image1: Image.Image, image2: Image.Image, scale: float = 1.0, offset: float = 0 -) -> Image.Image: - """ - Subtracts two images, dividing the result by scale and adding the offset. - If omitted, scale defaults to 1.0, and offset to 0.0. :: - - out = ((image1 - image2) / scale + offset) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_subtract(image2.im, scale, offset)) - - -def add_modulo(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Add two images, without clipping the result. :: - - out = ((image1 + image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_add_modulo(image2.im)) - - -def subtract_modulo(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Subtract two images, without clipping the result. :: - - out = ((image1 - image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_subtract_modulo(image2.im)) - - -def logical_and(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Logical AND between two images. - - Both of the images must have mode "1". If you would like to perform a - logical AND on an image with a mode other than "1", try - :py:meth:`~PIL.ImageChops.multiply` instead, using a black-and-white mask - as the second image. :: - - out = ((image1 and image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_and(image2.im)) - - -def logical_or(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Logical OR between two images. - - Both of the images must have mode "1". :: - - out = ((image1 or image2) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_or(image2.im)) - - -def logical_xor(image1: Image.Image, image2: Image.Image) -> Image.Image: - """Logical XOR between two images. - - Both of the images must have mode "1". :: - - out = ((bool(image1) != bool(image2)) % MAX) - - :rtype: :py:class:`~PIL.Image.Image` - """ - - image1.load() - image2.load() - return image1._new(image1.im.chop_xor(image2.im)) - - -def blend(image1: Image.Image, image2: Image.Image, alpha: float) -> Image.Image: - """Blend images using constant transparency weight. Alias for - :py:func:`PIL.Image.blend`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.blend(image1, image2, alpha) - - -def composite( - image1: Image.Image, image2: Image.Image, mask: Image.Image -) -> Image.Image: - """Create composite using transparency mask. Alias for - :py:func:`PIL.Image.composite`. - - :rtype: :py:class:`~PIL.Image.Image` - """ - - return Image.composite(image1, image2, mask) - - -def offset(image: Image.Image, xoffset: int, yoffset: int | None = None) -> Image.Image: - """Returns a copy of the image where data has been offset by the given - distances. Data wraps around the edges. If ``yoffset`` is omitted, it - is assumed to be equal to ``xoffset``. - - :param image: Input image. - :param xoffset: The horizontal distance. - :param yoffset: The vertical distance. If omitted, both - distances are set to the same value. - :rtype: :py:class:`~PIL.Image.Image` - """ - - if yoffset is None: - yoffset = xoffset - image.load() - return image._new(image.im.offset(xoffset, yoffset)) diff --git a/.venv/Lib/site-packages/PIL/ImageCms.py b/.venv/Lib/site-packages/PIL/ImageCms.py deleted file mode 100644 index ec10230..0000000 --- a/.venv/Lib/site-packages/PIL/ImageCms.py +++ /dev/null @@ -1,1127 +0,0 @@ -# The Python Imaging Library. -# $Id$ - -# Optional color management support, based on Kevin Cazabon's PyCMS -# library. - -# Originally released under LGPL. Graciously donated to PIL in -# March 2009, for distribution under the standard PIL license - -# History: - -# 2009-03-08 fl Added to PIL. - -# Copyright (C) 2002-2003 Kevin Cazabon -# Copyright (c) 2009 by Fredrik Lundh -# Copyright (c) 2013 by Eric Soroos - -# See the README file for information on usage and redistribution. See -# below for the original description. -from __future__ import annotations - -import operator -import sys -from enum import IntEnum, IntFlag -from functools import reduce -from typing import Any, Literal, SupportsFloat, SupportsInt, Union - -from . import Image, __version__ -from ._deprecate import deprecate -from ._typing import SupportsRead - -try: - from . import _imagingcms as core -except ImportError as ex: - # Allow error import for doc purposes, but error out when accessing - # anything in core. - from ._util import DeferredError - - core = DeferredError.new(ex) - -_DESCRIPTION = """ -pyCMS - - a Python / PIL interface to the littleCMS ICC Color Management System - Copyright (C) 2002-2003 Kevin Cazabon - kevin@cazabon.com - https://www.cazabon.com - - pyCMS home page: https://www.cazabon.com/pyCMS - littleCMS home page: https://www.littlecms.com - (littleCMS is Copyright (C) 1998-2001 Marti Maria) - - Originally released under LGPL. Graciously donated to PIL in - March 2009, for distribution under the standard PIL license - - The pyCMS.py module provides a "clean" interface between Python/PIL and - pyCMSdll, taking care of some of the more complex handling of the direct - pyCMSdll functions, as well as error-checking and making sure that all - relevant data is kept together. - - While it is possible to call pyCMSdll functions directly, it's not highly - recommended. - - Version History: - - 1.0.0 pil Oct 2013 Port to LCMS 2. - - 0.1.0 pil mod March 10, 2009 - - Renamed display profile to proof profile. The proof - profile is the profile of the device that is being - simulated, not the profile of the device which is - actually used to display/print the final simulation - (that'd be the output profile) - also see LCMSAPI.txt - input colorspace -> 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" - - -def __getattr__(name: str) -> Any: - if name == "DESCRIPTION": - deprecate("PIL.ImageCms.DESCRIPTION", 12) - return _DESCRIPTION - elif name == "VERSION": - deprecate("PIL.ImageCms.VERSION", 12) - return _VERSION - elif name == "FLAGS": - deprecate("PIL.ImageCms.FLAGS", 12, "PIL.ImageCms.Flags") - return _FLAGS - msg = f"module '{__name__}' has no attribute '{name}'" - raise AttributeError(msg) - - -# --------------------------------------------------------------------. - - -# -# intent/direction values - - -class Intent(IntEnum): - PERCEPTUAL = 0 - RELATIVE_COLORIMETRIC = 1 - SATURATION = 2 - ABSOLUTE_COLORIMETRIC = 3 - - -class Direction(IntEnum): - INPUT = 0 - OUTPUT = 1 - PROOF = 2 - - -# -# flags - - -class Flags(IntFlag): - """Flags and documentation are taken from ``lcms2.h``.""" - - NONE = 0 - NOCACHE = 0x0040 - """Inhibit 1-pixel cache""" - NOOPTIMIZE = 0x0100 - """Inhibit optimizations""" - NULLTRANSFORM = 0x0200 - """Don't transform anyway""" - GAMUTCHECK = 0x1000 - """Out of Gamut alarm""" - SOFTPROOFING = 0x4000 - """Do softproofing""" - BLACKPOINTCOMPENSATION = 0x2000 - NOWHITEONWHITEFIXUP = 0x0004 - """Don't fix scum dot""" - HIGHRESPRECALC = 0x0400 - """Use more memory to give better accuracy""" - LOWRESPRECALC = 0x0800 - """Use less memory to minimize resources""" - # this should be 8BITS_DEVICELINK, but that is not a valid name in Python: - USE_8BITS_DEVICELINK = 0x0008 - """Create 8 bits devicelinks""" - GUESSDEVICECLASS = 0x0020 - """Guess device class (for ``transform2devicelink``)""" - KEEP_SEQUENCE = 0x0080 - """Keep profile sequence for devicelink creation""" - FORCE_CLUT = 0x0002 - """Force CLUT optimization""" - CLUT_POST_LINEARIZATION = 0x0001 - """create postlinearization tables if possible""" - CLUT_PRE_LINEARIZATION = 0x0010 - """create prelinearization tables if possible""" - NONEGATIVES = 0x8000 - """Prevent negative numbers in floating point transforms""" - COPY_ALPHA = 0x04000000 - """Alpha channels are copied on ``cmsDoTransform()``""" - NODEFAULTRESOURCEDEF = 0x01000000 - - _GRIDPOINTS_1 = 1 << 16 - _GRIDPOINTS_2 = 2 << 16 - _GRIDPOINTS_4 = 4 << 16 - _GRIDPOINTS_8 = 8 << 16 - _GRIDPOINTS_16 = 16 << 16 - _GRIDPOINTS_32 = 32 << 16 - _GRIDPOINTS_64 = 64 << 16 - _GRIDPOINTS_128 = 128 << 16 - - @staticmethod - def GRIDPOINTS(n: int) -> Flags: - """ - Fine-tune control over number of gridpoints - - :param n: :py:class:`int` in range ``0 <= n <= 255`` - """ - return Flags.NONE | ((n & 0xFF) << 16) - - -_MAX_FLAG = reduce(operator.or_, 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 -} - - -# --------------------------------------------------------------------. -# Experimental PIL-level API -# --------------------------------------------------------------------. - -## -# Profile. - - -class ImageCmsProfile: - def __init__(self, profile: str | SupportsRead[bytes] | core.CmsProfile) -> None: - """ - :param profile: Either a string representing a filename, - a file like object containing a profile or a - low-level profile object - - """ - - if isinstance(profile, str): - if sys.platform == "win32": - profile_bytes_path = profile.encode() - try: - profile_bytes_path.decode("ascii") - except UnicodeDecodeError: - with open(profile, "rb") as f: - self._set(core.profile_frombytes(f.read())) - return - self._set(core.profile_open(profile), profile) - elif hasattr(profile, "read"): - self._set(core.profile_frombytes(profile.read())) - elif isinstance(profile, core.CmsProfile): - self._set(profile) - else: - msg = "Invalid type for Profile" # type: ignore[unreachable] - raise TypeError(msg) - - def _set(self, profile: core.CmsProfile, filename: str | None = None) -> None: - self.profile = profile - self.filename = filename - self.product_name = None # profile.product_name - self.product_info = None # profile.product_info - - def tobytes(self) -> bytes: - """ - 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 - :py:func:`~PIL.Image.Image.point` method. - - Will return the output profile in the ``output.info['icc_profile']``. - """ - - def __init__( - self, - input: ImageCmsProfile, - output: ImageCmsProfile, - input_mode: str, - output_mode: str, - intent: Intent = Intent.PERCEPTUAL, - proof: ImageCmsProfile | None = None, - proof_intent: Intent = Intent.ABSOLUTE_COLORIMETRIC, - flags: Flags = Flags.NONE, - ): - supported_modes = ( - "RGB", - "RGBA", - "RGBX", - "CMYK", - "I;16", - "I;16L", - "I;16B", - "YCbCr", - "LAB", - "L", - "1", - ) - for mode in (input_mode, output_mode): - if mode not in supported_modes: - deprecate( - mode, - 12, - { - "L;16": "I;16 or I;16L", - "L:16B": "I;16B", - "YCCA": "YCbCr", - "YCC": "YCbCr", - }.get(mode), - ) - 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: Image.Image) -> Image.Image: - return self.apply(im) - - def apply(self, im: Image.Image, imOut: Image.Image | None = None) -> Image.Image: - 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: Image.Image) -> Image.Image: - im.load() - if im.mode != self.output_mode: - msg = "mode mismatch" - raise ValueError(msg) # 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: SupportsInt | None = None) -> ImageCmsProfile | None: - """ - (experimental) Fetches the profile for the current display device. - - :returns: ``None`` if the profile is not known. - """ - - if sys.platform != "win32": - return None - - from . import ImageWin # type: ignore[unused-ignore, unreachable] - - if isinstance(handle, ImageWin.HDC): - profile = core.get_display_profile_win32(int(handle), 1) - else: - profile = core.get_display_profile_win32(int(handle or 0)) - if profile is None: - return None - return ImageCmsProfile(profile) - - -# --------------------------------------------------------------------. -# pyCMS compatible layer -# --------------------------------------------------------------------. - -_CmsProfileCompatible = Union[ - str, SupportsRead[bytes], core.CmsProfile, ImageCmsProfile -] - - -class PyCMSError(Exception): - """(pyCMS) Exception class. - This is used for all errors in the pyCMS API.""" - - pass - - -def profileToProfile( - im: Image.Image, - inputProfile: _CmsProfileCompatible, - outputProfile: _CmsProfileCompatible, - renderingIntent: Intent = Intent.PERCEPTUAL, - outputMode: str | None = None, - inPlace: bool = False, - flags: Flags = Flags.NONE, -) -> Image.Image | None: - """ - (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 - :exc:`PyCMSError` will be raised. If ``inPlace`` is ``True`` and - ``outputMode != im.mode``, a :exc:`PyCMSError` will be raised. - If an error occurs during application of the profiles, - a :exc:`PyCMSError` will be raised. - If ``outputMode`` is not a mode supported by the ``outputProfile`` (or by pyCMS), - a :exc:`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 :py:class:`~PIL.Image.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 - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - 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. If ``True``, the original image is modified in-place, - and ``None`` is returned. If ``False`` (default), a new - :py:class:`~PIL.Image.Image` object is returned with the transform applied. - :param flags: Integer (0-...) specifying additional flags - :returns: Either None or a new :py:class:`~PIL.Image.Image` object, depending on - the value of ``inPlace`` - :exception PyCMSError: - """ - - if outputMode is None: - outputMode = im.mode - - if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): - msg = "renderingIntent must be an integer between 0 and 3" - raise PyCMSError(msg) - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - msg = f"flags must be an integer between 0 and {_MAX_FLAG}" - raise PyCMSError(msg) - - 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 (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - return imOut - - -def getOpenProfile( - profileFilename: str | SupportsRead[bytes] | core.CmsProfile, -) -> ImageCmsProfile: - """ - (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 valid filename for an ICC profile, - a :exc:`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 (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def buildTransform( - inputProfile: _CmsProfileCompatible, - outputProfile: _CmsProfileCompatible, - inMode: str, - outMode: str, - renderingIntent: Intent = Intent.PERCEPTUAL, - flags: Flags = Flags.NONE, -) -> ImageCmsTransform: - """ - (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 - :exc:`PyCMSError` will be raised. If an error occurs during creation - of the transform, a :exc:`PyCMSError` will be raised. - - If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` - (or by pyCMS), a :exc:`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 - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - 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): - msg = "renderingIntent must be an integer between 0 and 3" - raise PyCMSError(msg) - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - msg = f"flags must be an integer between 0 and {_MAX_FLAG}" - raise PyCMSError(msg) - - 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 (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def buildProofTransform( - inputProfile: _CmsProfileCompatible, - outputProfile: _CmsProfileCompatible, - proofProfile: _CmsProfileCompatible, - inMode: str, - outMode: str, - renderingIntent: Intent = Intent.PERCEPTUAL, - proofRenderingIntent: Intent = Intent.ABSOLUTE_COLORIMETRIC, - flags: Flags = Flags.SOFTPROOFING, -) -> ImageCmsTransform: - """ - (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 :exc:`PyCMSError` will be raised. - - If an error occurs during creation of the transform, - a :exc:`PyCMSError` will be raised. - - If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` - (or by pyCMS), a :exc:`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 - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - 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 - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - 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): - msg = "renderingIntent must be an integer between 0 and 3" - raise PyCMSError(msg) - - if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): - msg = f"flags must be an integer between 0 and {_MAX_FLAG}" - raise PyCMSError(msg) - - 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 (OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -buildTransformFromOpenProfiles = buildTransform -buildProofTransformFromOpenProfiles = buildProofTransform - - -def applyTransform( - im: Image.Image, transform: ImageCmsTransform, inPlace: bool = False -) -> Image.Image | None: - """ - (pyCMS) Applies a transform to a given image. - - If ``im.mode != transform.input_mode``, a :exc:`PyCMSError` is raised. - - If ``inPlace`` is ``True`` and ``transform.input_mode != transform.output_mode``, a - :exc:`PyCMSError` is raised. - - If ``im.mode``, ``transform.input_mode`` or ``transform.output_mode`` is not - supported by pyCMSdll or the profiles you used for the transform, a - :exc:`PyCMSError` is raised. - - If an error occurs while the transform is being applied, - a :exc:`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.input_mode`` and ``transform.output_mode`` 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 :py:class:`~PIL.Image.Image` - object of the same dimensions in mode ``transform.output_mode``. - - :param im: An :py:class:`~PIL.Image.Image` object, and ``im.mode`` must be the same - as the ``input_mode`` supported by the transform. - :param transform: A valid CmsTransform class object - :param inPlace: Bool. If ``True``, ``im`` is modified in place and ``None`` is - returned, if ``False``, a new :py:class:`~PIL.Image.Image` object with the - transform applied is returned (and ``im`` is not changed). The default is - ``False``. - :returns: Either ``None``, or a new :py:class:`~PIL.Image.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) from v - - return imOut - - -def createProfile( - colorSpace: Literal["LAB", "XYZ", "sRGB"], colorTemp: SupportsFloat = 0 -) -> core.CmsProfile: - """ - (pyCMS) Creates a profile. - - If colorSpace not in ``["LAB", "XYZ", "sRGB"]``, - a :exc:`PyCMSError` is raised. - - If using LAB and ``colorTemp`` is not a positive integer, - a :exc:`PyCMSError` is raised. - - If an error occurs while creating the profile, - a :exc:`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 number 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"]: - msg = ( - f"Color space not supported for on-the-fly profile creation ({colorSpace})" - ) - raise PyCMSError(msg) - - if colorSpace == "LAB": - try: - colorTemp = float(colorTemp) - except (TypeError, ValueError) as e: - msg = f'Color temperature must be numeric, "{colorTemp}" not valid' - raise PyCMSError(msg) from e - - try: - return core.createProfile(colorSpace, colorTemp) - except (TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileName(profile: _CmsProfileCompatible) -> str: - """ - - (pyCMS) Gets the internal product name for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, - a :exc:`PyCMSError` is raised If an error occurs while trying - to obtain the name tag, a :exc:`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.model - manufacturer = profile.profile.manufacturer - - if not (model or manufacturer): - return (profile.profile.profile_description or "") + "\n" - if not manufacturer or (model and len(model) > 30): - return f"{model}\n" - return f"{model} - {manufacturer}\n" - - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileInfo(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the internal product information for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, - a :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the info tag, - a :exc:`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.profile_description - cpright = profile.profile.copyright - elements = [element for element in (description, cpright) if element] - return "\r\n\r\n".join(elements) + "\r\n\r\n" - - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileCopyright(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the copyright for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the copyright tag, - a :exc:`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.copyright or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileManufacturer(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the manufacturer for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the manufacturer tag, a - :exc:`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.manufacturer or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileModel(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the model for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the model tag, - a :exc:`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.model or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getProfileDescription(profile: _CmsProfileCompatible) -> str: - """ - (pyCMS) Gets the description for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the description tag, - a :exc:`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.profile_description or "") + "\n" - except (AttributeError, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def getDefaultIntent(profile: _CmsProfileCompatible) -> int: - """ - (pyCMS) Gets the default intent name for the given profile. - - If ``profile`` isn't a valid CmsProfile object or filename to a profile, a - :exc:`PyCMSError` is raised. - - If an error occurs while trying to obtain the default intent, a - :exc:`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. - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - 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, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def isIntentSupported( - profile: _CmsProfileCompatible, intent: Intent, direction: Direction -) -> Literal[-1, 1]: - """ - (pyCMS) Checks if a given intent is supported. - - Use this function to verify that you can use your desired - ``intent`` 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 :exc:`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 - - ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) - ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 - ImageCms.Intent.SATURATION = 2 - ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 - - 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, OSError, TypeError, ValueError) as v: - raise PyCMSError(v) from v - - -def versions() -> tuple[str, str | None, str, str]: - """ - (pyCMS) Fetches versions. - """ - - deprecate( - "PIL.ImageCms.versions()", - 12, - '(PIL.features.version("littlecms2"), sys.version, PIL.__version__)', - ) - return _VERSION, core.littlecms_version, sys.version.split()[0], __version__ diff --git a/.venv/Lib/site-packages/PIL/ImageColor.py b/.venv/Lib/site-packages/PIL/ImageColor.py deleted file mode 100644 index 9a15a8e..0000000 --- a/.venv/Lib/site-packages/PIL/ImageColor.py +++ /dev/null @@ -1,320 +0,0 @@ -# -# 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 __future__ import annotations - -import re -from functools import lru_cache - -from . import Image - - -@lru_cache -def getrgb(color: str) -> tuple[int, int, int] | tuple[int, int, int, int]: - """ - Convert a color string to an RGB or RGBA 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])`` - """ - if len(color) > 100: - msg = "color specifier is too long" - raise ValueError(msg) - color = color.lower() - - rgb = colormap.get(color, None) - if rgb: - if isinstance(rgb, tuple): - return rgb - rgb_tuple = getrgb(rgb) - assert len(rgb_tuple) == 3 - colormap[color] = rgb_tuple - return rgb_tuple - - # 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+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color - ) - if m: - from colorsys import hls_to_rgb - - rgb_floats = hls_to_rgb( - float(m.group(1)) / 360.0, - float(m.group(3)) / 100.0, - float(m.group(2)) / 100.0, - ) - return ( - int(rgb_floats[0] * 255 + 0.5), - int(rgb_floats[1] * 255 + 0.5), - int(rgb_floats[2] * 255 + 0.5), - ) - - m = re.match( - r"hs[bv]\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color - ) - if m: - from colorsys import hsv_to_rgb - - rgb_floats = hsv_to_rgb( - float(m.group(1)) / 360.0, - float(m.group(2)) / 100.0, - float(m.group(3)) / 100.0, - ) - return ( - int(rgb_floats[0] * 255 + 0.5), - int(rgb_floats[1] * 255 + 0.5), - int(rgb_floats[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)) - msg = f"unknown color specifier: {repr(color)}" - raise ValueError(msg) - - -@lru_cache -def getcolor(color: str, mode: str) -> int | tuple[int, ...]: - """ - Same as :py:func:`~PIL.ImageColor.getrgb` for most modes. However, if - ``mode`` is HSV, converts the RGB value to a HSV value, or if ``mode`` is - not color or a palette image, converts the RGB value to a grayscale value. - If the string cannot be parsed, this function raises a :py:exc:`ValueError` - exception. - - .. versionadded:: 1.1.4 - - :param color: A color string - :param mode: Convert result to this mode - :return: ``graylevel, (graylevel, alpha) or (red, green, blue[, alpha])`` - """ - # same as getrgb, but converts the result to the given mode - rgb, alpha = getrgb(color), 255 - if len(rgb) == 4: - alpha = rgb[3] - rgb = rgb[:3] - - if mode == "HSV": - from colorsys import rgb_to_hsv - - r, g, b = rgb - h, s, v = rgb_to_hsv(r / 255, g / 255, b / 255) - return int(h * 255), int(s * 255), int(v * 255) - elif Image.getmodebase(mode) == "L": - r, g, b = rgb - # ITU-R Recommendation 601-2 for nonlinear RGB - # scaled to 24 bits to match the convert's implementation. - graylevel = (r * 19595 + g * 38470 + b * 7471 + 0x8000) >> 16 - if mode[-1] == "A": - return graylevel, alpha - return graylevel - elif mode[-1] == "A": - return rgb + (alpha,) - return rgb - - -colormap: dict[str, str | tuple[int, int, int]] = { - # 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/.venv/Lib/site-packages/PIL/ImageDraw.py b/.venv/Lib/site-packages/PIL/ImageDraw.py deleted file mode 100644 index 244d3d5..0000000 --- a/.venv/Lib/site-packages/PIL/ImageDraw.py +++ /dev/null @@ -1,1206 +0,0 @@ -# -# 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. -# -from __future__ import annotations - -import math -import numbers -import struct -from types import ModuleType -from typing import TYPE_CHECKING, AnyStr, Callable, List, Sequence, Tuple, Union, cast - -from . import Image, ImageColor -from ._deprecate import deprecate -from ._typing import Coords - -# experimental access to the outline API -Outline: Callable[[], Image.core._Outline] | None -try: - Outline = Image.core.outline -except AttributeError: - Outline = None - -if TYPE_CHECKING: - from . import ImageDraw2, ImageFont - -_Ink = Union[float, Tuple[int, ...], str] - -""" -A simple 2D drawing interface for PIL images. -

-Application code should use the Draw factory, instead of -directly. -""" - - -class ImageDraw: - font: ( - ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont | None - ) = None - - def __init__(self, im: Image.Image, mode: str | None = None) -> 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: - msg = "mode mismatch" - raise ValueError(msg) - if mode == "P": - self.palette = im.palette - else: - self.palette = None - self._image = im - 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) - else: - self.ink = self.draw.draw_ink(-1) - 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 = False - - def getfont( - self, - ) -> ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont: - """ - Get the current default font. - - To set the default font for this ImageDraw instance:: - - from PIL import ImageDraw, ImageFont - draw.font = ImageFont.truetype("Tests/fonts/FreeMono.ttf") - - To set the default font for all future ImageDraw instances:: - - from PIL import ImageDraw, ImageFont - ImageDraw.ImageDraw.font = ImageFont.truetype("Tests/fonts/FreeMono.ttf") - - If the current default font is ``None``, - it is initialized with ``ImageFont.load_default()``. - - :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 _getfont( - self, font_size: float | None - ) -> ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont: - if font_size is not None: - from . import ImageFont - - return ImageFont.load_default(font_size) - else: - return self.getfont() - - def _getink( - self, ink: _Ink | None, fill: _Ink | None = None - ) -> tuple[int | None, int | None]: - result_ink = None - result_fill = None - if ink is None and fill is None: - if self.fill: - result_fill = self.ink - else: - result_ink = self.ink - else: - if ink is not None: - if isinstance(ink, str): - ink = ImageColor.getcolor(ink, self.mode) - if self.palette and not isinstance(ink, numbers.Number): - ink = self.palette.getcolor(ink, self._image) - result_ink = self.draw.draw_ink(ink) - if fill is not None: - if isinstance(fill, str): - fill = ImageColor.getcolor(fill, self.mode) - if self.palette and not isinstance(fill, numbers.Number): - fill = self.palette.getcolor(fill, self._image) - result_fill = self.draw.draw_ink(fill) - return result_ink, result_fill - - def arc( - self, - xy: Coords, - start: float, - end: float, - fill: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw an arc.""" - ink, fill = self._getink(fill) - if ink is not None: - self.draw.draw_arc(xy, start, end, ink, width) - - def bitmap( - self, xy: Sequence[int], bitmap: Image.Image, fill: _Ink | None = None - ) -> 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: Coords, - start: float, - end: float, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a chord.""" - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_chord(xy, start, end, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - self.draw.draw_chord(xy, start, end, ink, 0, width) - - def ellipse( - self, - xy: Coords, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw an ellipse.""" - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_ellipse(xy, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - self.draw.draw_ellipse(xy, ink, 0, width) - - def circle( - self, - xy: Sequence[float], - radius: float, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a circle given center coordinates and a radius.""" - ellipse_xy = (xy[0] - radius, xy[1] - radius, xy[0] + radius, xy[1] + radius) - self.ellipse(ellipse_xy, fill, outline, width) - - def line( - self, - xy: Coords, - fill: _Ink | None = None, - width: int = 0, - joint: str | None = None, - ) -> None: - """Draw a line, or a connected sequence of line segments.""" - ink = self._getink(fill)[0] - if ink is not None: - self.draw.draw_lines(xy, ink, width) - if joint == "curve" and width > 4: - points: Sequence[Sequence[float]] - if isinstance(xy[0], (list, tuple)): - points = cast(Sequence[Sequence[float]], xy) - else: - points = [ - cast(Sequence[float], tuple(xy[i : i + 2])) - for i in range(0, len(xy), 2) - ] - for i in range(1, len(points) - 1): - point = points[i] - angles = [ - math.degrees(math.atan2(end[0] - start[0], start[1] - end[1])) - % 360 - for start, end in ( - (points[i - 1], point), - (point, points[i + 1]), - ) - ] - if angles[0] == angles[1]: - # This is a straight line, so no joint is required - continue - - def coord_at_angle( - coord: Sequence[float], angle: float - ) -> tuple[float, ...]: - x, y = coord - angle -= 90 - distance = width / 2 - 1 - return tuple( - p + (math.floor(p_d) if p_d > 0 else math.ceil(p_d)) - for p, p_d in ( - (x, distance * math.cos(math.radians(angle))), - (y, distance * math.sin(math.radians(angle))), - ) - ) - - flipped = ( - angles[1] > angles[0] and angles[1] - 180 > angles[0] - ) or (angles[1] < angles[0] and angles[1] + 180 > angles[0]) - coords = [ - (point[0] - width / 2 + 1, point[1] - width / 2 + 1), - (point[0] + width / 2 - 1, point[1] + width / 2 - 1), - ] - if flipped: - start, end = (angles[1] + 90, angles[0] + 90) - else: - start, end = (angles[0] - 90, angles[1] - 90) - self.pieslice(coords, start - 90, end - 90, fill) - - if width > 8: - # Cover potential gaps between the line and the joint - if flipped: - gap_coords = [ - coord_at_angle(point, angles[0] + 90), - point, - coord_at_angle(point, angles[1] + 90), - ] - else: - gap_coords = [ - coord_at_angle(point, angles[0] - 90), - point, - coord_at_angle(point, angles[1] - 90), - ] - self.line(gap_coords, fill, width=3) - - def shape( - self, - shape: Image.core._Outline, - fill: _Ink | None = None, - outline: _Ink | None = None, - ) -> None: - """(Experimental) Draw a shape.""" - shape.close() - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_outline(shape, fill_ink, 1) - if ink is not None and ink != fill_ink: - self.draw.draw_outline(shape, ink, 0) - - def pieslice( - self, - xy: Coords, - start: float, - end: float, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a pieslice.""" - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_pieslice(xy, start, end, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - self.draw.draw_pieslice(xy, start, end, ink, 0, width) - - def point(self, xy: Coords, fill: _Ink | None = None) -> 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: Coords, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a polygon.""" - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_polygon(xy, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - if width == 1: - self.draw.draw_polygon(xy, ink, 0, width) - elif self.im is not None: - # To avoid expanding the polygon outwards, - # use the fill as a mask - mask = Image.new("1", self.im.size) - mask_ink = self._getink(1)[0] - - fill_im = mask.copy() - draw = Draw(fill_im) - draw.draw.draw_polygon(xy, mask_ink, 1) - - ink_im = mask.copy() - draw = Draw(ink_im) - width = width * 2 - 1 - draw.draw.draw_polygon(xy, mask_ink, 0, width) - - mask.paste(ink_im, mask=fill_im) - - im = Image.new(self.mode, self.im.size) - draw = Draw(im) - draw.draw.draw_polygon(xy, ink, 0, width) - self.im.paste(im.im, (0, 0) + im.size, mask.im) - - def regular_polygon( - self, - bounding_circle: Sequence[Sequence[float] | float], - n_sides: int, - rotation: float = 0, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a regular polygon.""" - xy = _compute_regular_polygon_vertices(bounding_circle, n_sides, rotation) - self.polygon(xy, fill, outline, width) - - def rectangle( - self, - xy: Coords, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - ) -> None: - """Draw a rectangle.""" - ink, fill_ink = self._getink(outline, fill) - if fill_ink is not None: - self.draw.draw_rectangle(xy, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - self.draw.draw_rectangle(xy, ink, 0, width) - - def rounded_rectangle( - self, - xy: Coords, - radius: float = 0, - fill: _Ink | None = None, - outline: _Ink | None = None, - width: int = 1, - *, - corners: tuple[bool, bool, bool, bool] | None = None, - ) -> None: - """Draw a rounded rectangle.""" - if isinstance(xy[0], (list, tuple)): - (x0, y0), (x1, y1) = cast(Sequence[Sequence[float]], xy) - else: - x0, y0, x1, y1 = cast(Sequence[float], xy) - if x1 < x0: - msg = "x1 must be greater than or equal to x0" - raise ValueError(msg) - if y1 < y0: - msg = "y1 must be greater than or equal to y0" - raise ValueError(msg) - if corners is None: - corners = (True, True, True, True) - - d = radius * 2 - - x0 = round(x0) - y0 = round(y0) - x1 = round(x1) - y1 = round(y1) - full_x, full_y = False, False - if all(corners): - full_x = d >= x1 - x0 - 1 - if full_x: - # The two left and two right corners are joined - d = x1 - x0 - full_y = d >= y1 - y0 - 1 - if full_y: - # The two top and two bottom corners are joined - d = y1 - y0 - if full_x and full_y: - # If all corners are joined, that is a circle - return self.ellipse(xy, fill, outline, width) - - if d == 0 or not any(corners): - # If the corners have no curve, - # or there are no corners, - # that is a rectangle - return self.rectangle(xy, fill, outline, width) - - r = int(d // 2) - ink, fill_ink = self._getink(outline, fill) - - def draw_corners(pieslice: bool) -> None: - parts: tuple[tuple[tuple[float, float, float, float], int, int], ...] - if full_x: - # Draw top and bottom halves - parts = ( - ((x0, y0, x0 + d, y0 + d), 180, 360), - ((x0, y1 - d, x0 + d, y1), 0, 180), - ) - elif full_y: - # Draw left and right halves - parts = ( - ((x0, y0, x0 + d, y0 + d), 90, 270), - ((x1 - d, y0, x1, y0 + d), 270, 90), - ) - else: - # Draw four separate corners - parts = tuple( - part - for i, part in enumerate( - ( - ((x0, y0, x0 + d, y0 + d), 180, 270), - ((x1 - d, y0, x1, y0 + d), 270, 360), - ((x1 - d, y1 - d, x1, y1), 0, 90), - ((x0, y1 - d, x0 + d, y1), 90, 180), - ) - ) - if corners[i] - ) - for part in parts: - if pieslice: - self.draw.draw_pieslice(*(part + (fill_ink, 1))) - else: - self.draw.draw_arc(*(part + (ink, width))) - - if fill_ink is not None: - draw_corners(True) - - if full_x: - self.draw.draw_rectangle((x0, y0 + r + 1, x1, y1 - r - 1), fill_ink, 1) - else: - self.draw.draw_rectangle((x0 + r + 1, y0, x1 - r - 1, y1), fill_ink, 1) - if not full_x and not full_y: - left = [x0, y0, x0 + r, y1] - if corners[0]: - left[1] += r + 1 - if corners[3]: - left[3] -= r + 1 - self.draw.draw_rectangle(left, fill_ink, 1) - - right = [x1 - r, y0, x1, y1] - if corners[1]: - right[1] += r + 1 - if corners[2]: - right[3] -= r + 1 - self.draw.draw_rectangle(right, fill_ink, 1) - if ink is not None and ink != fill_ink and width != 0: - draw_corners(False) - - if not full_x: - top = [x0, y0, x1, y0 + width - 1] - if corners[0]: - top[0] += r + 1 - if corners[1]: - top[2] -= r + 1 - self.draw.draw_rectangle(top, ink, 1) - - bottom = [x0, y1 - width + 1, x1, y1] - if corners[3]: - bottom[0] += r + 1 - if corners[2]: - bottom[2] -= r + 1 - self.draw.draw_rectangle(bottom, ink, 1) - if not full_y: - left = [x0, y0, x0 + width - 1, y1] - if corners[0]: - left[1] += r + 1 - if corners[3]: - left[3] -= r + 1 - self.draw.draw_rectangle(left, ink, 1) - - right = [x1 - width + 1, y0, x1, y1] - if corners[1]: - right[1] += r + 1 - if corners[2]: - right[3] -= r + 1 - self.draw.draw_rectangle(right, ink, 1) - - def _multiline_check(self, text: AnyStr) -> bool: - split_character = "\n" if isinstance(text, str) else b"\n" - - return split_character in text - - def _multiline_split(self, text: AnyStr) -> list[AnyStr]: - return text.split("\n" if isinstance(text, str) else b"\n") - - def _multiline_spacing(self, font, spacing, stroke_width): - return ( - self.textbbox((0, 0), "A", font, stroke_width=stroke_width)[3] - + stroke_width - + spacing - ) - - def text( - self, - xy: tuple[float, float], - text: str, - fill=None, - font: ( - ImageFont.ImageFont - | ImageFont.FreeTypeFont - | ImageFont.TransposedFont - | None - ) = None, - anchor=None, - spacing=4, - align="left", - direction=None, - features=None, - language=None, - stroke_width=0, - stroke_fill=None, - embedded_color=False, - *args, - **kwargs, - ) -> None: - """Draw text.""" - if embedded_color and self.mode not in ("RGB", "RGBA"): - msg = "Embedded color supported only in RGB and RGBA modes" - raise ValueError(msg) - - if font is None: - font = self._getfont(kwargs.get("font_size")) - - if self._multiline_check(text): - return self.multiline_text( - xy, - text, - fill, - font, - anchor, - spacing, - align, - direction, - features, - language, - stroke_width, - stroke_fill, - embedded_color, - ) - - def getink(fill: _Ink | None) -> int: - ink, fill_ink = self._getink(fill) - if ink is None: - assert fill_ink is not None - return fill_ink - return ink - - def draw_text(ink, stroke_width=0, stroke_offset=None) -> None: - mode = self.fontmode - if stroke_width == 0 and embedded_color: - mode = "RGBA" - coord = [] - start = [] - for i in range(2): - coord.append(int(xy[i])) - start.append(math.modf(xy[i])[0]) - try: - mask, offset = font.getmask2( # type: ignore[union-attr,misc] - text, - mode, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - anchor=anchor, - ink=ink, - start=start, - *args, - **kwargs, - ) - coord = [coord[0] + offset[0], coord[1] + offset[1]] - except AttributeError: - try: - mask = font.getmask( # type: ignore[misc] - text, - mode, - direction, - features, - language, - stroke_width, - anchor, - ink, - start=start, - *args, - **kwargs, - ) - except TypeError: - mask = font.getmask(text) - if stroke_offset: - coord = [coord[0] + stroke_offset[0], coord[1] + stroke_offset[1]] - if mode == "RGBA": - # font.getmask2(mode="RGBA") returns color in RGB bands and mask in A - # extract mask and set text alpha - color, mask = mask, mask.getband(3) - ink_alpha = struct.pack("i", ink)[3] - color.fillband(3, ink_alpha) - x, y = coord - if self.im is not None: - self.im.paste( - color, (x, y, x + mask.size[0], y + mask.size[1]), mask - ) - else: - self.draw.draw_bitmap(coord, mask, ink) - - ink = getink(fill) - if ink is not None: - stroke_ink = None - if stroke_width: - stroke_ink = getink(stroke_fill) if stroke_fill is not None else ink - - if stroke_ink is not None: - # Draw stroked text - draw_text(stroke_ink, stroke_width) - - # Draw normal text - draw_text(ink, 0) - else: - # Only draw normal text - draw_text(ink) - - def multiline_text( - self, - xy: tuple[float, float], - text: str, - fill=None, - font: ( - ImageFont.ImageFont - | ImageFont.FreeTypeFont - | ImageFont.TransposedFont - | None - ) = None, - anchor=None, - spacing=4, - align="left", - direction=None, - features=None, - language=None, - stroke_width=0, - stroke_fill=None, - embedded_color=False, - *, - font_size=None, - ) -> None: - if direction == "ttb": - msg = "ttb direction is unsupported for multiline text" - raise ValueError(msg) - - if anchor is None: - anchor = "la" - elif len(anchor) != 2: - msg = "anchor must be a 2 character string" - raise ValueError(msg) - elif anchor[1] in "tb": - msg = "anchor not supported for multiline text" - raise ValueError(msg) - - if font is None: - font = self._getfont(font_size) - - widths = [] - max_width: float = 0 - lines = self._multiline_split(text) - line_spacing = self._multiline_spacing(font, spacing, stroke_width) - for line in lines: - line_width = self.textlength( - line, font, direction=direction, features=features, language=language - ) - widths.append(line_width) - max_width = max(max_width, line_width) - - top = xy[1] - if anchor[1] == "m": - top -= (len(lines) - 1) * line_spacing / 2.0 - elif anchor[1] == "d": - top -= (len(lines) - 1) * line_spacing - - for idx, line in enumerate(lines): - left = xy[0] - width_difference = max_width - widths[idx] - - # first align left by anchor - if anchor[0] == "m": - left -= width_difference / 2.0 - elif anchor[0] == "r": - left -= width_difference - - # then align by align parameter - if align == "left": - pass - elif align == "center": - left += width_difference / 2.0 - elif align == "right": - left += width_difference - else: - msg = 'align must be "left", "center" or "right"' - raise ValueError(msg) - - self.text( - (left, top), - line, - fill, - font, - anchor, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - stroke_fill=stroke_fill, - embedded_color=embedded_color, - ) - top += line_spacing - - def textlength( - self, - text: str, - font: ( - ImageFont.ImageFont - | ImageFont.FreeTypeFont - | ImageFont.TransposedFont - | None - ) = None, - direction=None, - features=None, - language=None, - embedded_color=False, - *, - font_size=None, - ) -> float: - """Get the length of a given string, in pixels with 1/64 precision.""" - if self._multiline_check(text): - msg = "can't measure length of multiline text" - raise ValueError(msg) - if embedded_color and self.mode not in ("RGB", "RGBA"): - msg = "Embedded color supported only in RGB and RGBA modes" - raise ValueError(msg) - - if font is None: - font = self._getfont(font_size) - mode = "RGBA" if embedded_color else self.fontmode - return font.getlength(text, mode, direction, features, language) - - def textbbox( - self, - xy, - text, - font=None, - anchor=None, - spacing=4, - align="left", - direction=None, - features=None, - language=None, - stroke_width=0, - embedded_color=False, - *, - font_size=None, - ) -> tuple[int, int, int, int]: - """Get the bounding box of a given string, in pixels.""" - if embedded_color and self.mode not in ("RGB", "RGBA"): - msg = "Embedded color supported only in RGB and RGBA modes" - raise ValueError(msg) - - if font is None: - font = self._getfont(font_size) - - if self._multiline_check(text): - return self.multiline_textbbox( - xy, - text, - font, - anchor, - spacing, - align, - direction, - features, - language, - stroke_width, - embedded_color, - ) - - mode = "RGBA" if embedded_color else self.fontmode - bbox = font.getbbox( - text, mode, direction, features, language, stroke_width, anchor - ) - return bbox[0] + xy[0], bbox[1] + xy[1], bbox[2] + xy[0], bbox[3] + xy[1] - - def multiline_textbbox( - self, - xy, - text, - font=None, - anchor=None, - spacing=4, - align="left", - direction=None, - features=None, - language=None, - stroke_width=0, - embedded_color=False, - *, - font_size=None, - ) -> tuple[int, int, int, int]: - if direction == "ttb": - msg = "ttb direction is unsupported for multiline text" - raise ValueError(msg) - - if anchor is None: - anchor = "la" - elif len(anchor) != 2: - msg = "anchor must be a 2 character string" - raise ValueError(msg) - elif anchor[1] in "tb": - msg = "anchor not supported for multiline text" - raise ValueError(msg) - - if font is None: - font = self._getfont(font_size) - - widths = [] - max_width: float = 0 - lines = self._multiline_split(text) - line_spacing = self._multiline_spacing(font, spacing, stroke_width) - for line in lines: - line_width = self.textlength( - line, - font, - direction=direction, - features=features, - language=language, - embedded_color=embedded_color, - ) - widths.append(line_width) - max_width = max(max_width, line_width) - - top = xy[1] - if anchor[1] == "m": - top -= (len(lines) - 1) * line_spacing / 2.0 - elif anchor[1] == "d": - top -= (len(lines) - 1) * line_spacing - - bbox: tuple[int, int, int, int] | None = None - - for idx, line in enumerate(lines): - left = xy[0] - width_difference = max_width - widths[idx] - - # first align left by anchor - if anchor[0] == "m": - left -= width_difference / 2.0 - elif anchor[0] == "r": - left -= width_difference - - # then align by align parameter - if align == "left": - pass - elif align == "center": - left += width_difference / 2.0 - elif align == "right": - left += width_difference - else: - msg = 'align must be "left", "center" or "right"' - raise ValueError(msg) - - bbox_line = self.textbbox( - (left, top), - line, - font, - anchor, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - embedded_color=embedded_color, - ) - if bbox is None: - bbox = bbox_line - else: - bbox = ( - min(bbox[0], bbox_line[0]), - min(bbox[1], bbox_line[1]), - max(bbox[2], bbox_line[2]), - max(bbox[3], bbox_line[3]), - ) - - top += line_spacing - - if bbox is None: - return xy[0], xy[1], xy[0], xy[1] - return bbox - - -def Draw(im: Image.Image, mode: str | None = None) -> ImageDraw: - """ - 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 getattr(im, "getdraw")(mode) - except AttributeError: - return ImageDraw(im, mode) - - -def getdraw( - im: Image.Image | None = None, hints: list[str] | None = None -) -> tuple[ImageDraw2.Draw | None, ModuleType]: - """ - :param im: The image to draw in. - :param hints: An optional list of hints. Deprecated. - :returns: A (drawing context, drawing resource factory) tuple. - """ - if hints is not None: - deprecate("'hints' parameter", 12) - from . import ImageDraw2 - - draw = ImageDraw2.Draw(im) if im is not None else None - return draw, ImageDraw2 - - -def floodfill( - image: Image.Image, - xy: tuple[int, int], - value: float | tuple[int, ...], - border: float | tuple[int, ...] | None = None, - thresh: float = 0, -) -> None: - """ - .. warning:: This method is experimental. - - Fills a bounded region with a given color. - - :param image: Target image. - :param xy: Seed position (a 2-item coordinate tuple). See - :ref:`coordinate-system`. - :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 - # amended by yo1995 @20180806 - pixel = image.load() - assert pixel is not None - 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)} - # use a set to keep record of current and previous edge pixels - # to reduce memory consumption - full_edge = set() - while edge: - new_edge = set() - for x, y in edge: # 4 adjacent method - for s, t in ((x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)): - # If already processed, or if a coordinate is negative, skip - if (s, t) in full_edge or s < 0 or t < 0: - continue - try: - p = pixel[s, t] - except (ValueError, IndexError): - pass - else: - full_edge.add((s, t)) - if border is None: - fill = _color_diff(p, background) <= thresh - else: - fill = p not in (value, border) - if fill: - pixel[s, t] = value - new_edge.add((s, t)) - full_edge = edge # discard pixels processed - edge = new_edge - - -def _compute_regular_polygon_vertices( - bounding_circle: Sequence[Sequence[float] | float], n_sides: int, rotation: float -) -> list[tuple[float, float]]: - """ - Generate a list of vertices for a 2D regular polygon. - - :param bounding_circle: The bounding circle is a sequence defined - by a point and radius. The polygon is inscribed in this circle. - (e.g. ``bounding_circle=(x, y, r)`` or ``((x, y), r)``) - :param n_sides: Number of sides - (e.g. ``n_sides=3`` for a triangle, ``6`` for a hexagon) - :param rotation: Apply an arbitrary rotation to the polygon - (e.g. ``rotation=90``, applies a 90 degree rotation) - :return: List of regular polygon vertices - (e.g. ``[(25, 50), (50, 50), (50, 25), (25, 25)]``) - - How are the vertices computed? - 1. Compute the following variables - - theta: Angle between the apothem & the nearest polygon vertex - - side_length: Length of each polygon edge - - centroid: Center of bounding circle (1st, 2nd elements of bounding_circle) - - polygon_radius: Polygon radius (last element of bounding_circle) - - angles: Location of each polygon vertex in polar grid - (e.g. A square with 0 degree rotation => [225.0, 315.0, 45.0, 135.0]) - - 2. For each angle in angles, get the polygon vertex at that angle - The vertex is computed using the equation below. - X= xcos(φ) + ysin(φ) - Y= −xsin(φ) + ycos(φ) - - Note: - φ = angle in degrees - x = 0 - y = polygon_radius - - The formula above assumes rotation around the origin. - In our case, we are rotating around the centroid. - To account for this, we use the formula below - X = xcos(φ) + ysin(φ) + centroid_x - Y = −xsin(φ) + ycos(φ) + centroid_y - """ - # 1. Error Handling - # 1.1 Check `n_sides` has an appropriate value - if not isinstance(n_sides, int): - msg = "n_sides should be an int" # type: ignore[unreachable] - raise TypeError(msg) - if n_sides < 3: - msg = "n_sides should be an int > 2" - raise ValueError(msg) - - # 1.2 Check `bounding_circle` has an appropriate value - if not isinstance(bounding_circle, (list, tuple)): - msg = "bounding_circle should be a sequence" - raise TypeError(msg) - - if len(bounding_circle) == 3: - if not all(isinstance(i, (int, float)) for i in bounding_circle): - msg = "bounding_circle should only contain numeric data" - raise ValueError(msg) - - *centroid, polygon_radius = cast(List[float], list(bounding_circle)) - elif len(bounding_circle) == 2 and isinstance(bounding_circle[0], (list, tuple)): - if not all( - isinstance(i, (int, float)) for i in bounding_circle[0] - ) or not isinstance(bounding_circle[1], (int, float)): - msg = "bounding_circle should only contain numeric data" - raise ValueError(msg) - - if len(bounding_circle[0]) != 2: - msg = "bounding_circle centre should contain 2D coordinates (e.g. (x, y))" - raise ValueError(msg) - - centroid = cast(List[float], list(bounding_circle[0])) - polygon_radius = cast(float, bounding_circle[1]) - else: - msg = ( - "bounding_circle should contain 2D coordinates " - "and a radius (e.g. (x, y, r) or ((x, y), r) )" - ) - raise ValueError(msg) - - if polygon_radius <= 0: - msg = "bounding_circle radius should be > 0" - raise ValueError(msg) - - # 1.3 Check `rotation` has an appropriate value - if not isinstance(rotation, (int, float)): - msg = "rotation should be an int or float" # type: ignore[unreachable] - raise ValueError(msg) - - # 2. Define Helper Functions - def _apply_rotation(point: list[float], degrees: float) -> tuple[float, float]: - return ( - round( - point[0] * math.cos(math.radians(360 - degrees)) - - point[1] * math.sin(math.radians(360 - degrees)) - + centroid[0], - 2, - ), - round( - point[1] * math.cos(math.radians(360 - degrees)) - + point[0] * math.sin(math.radians(360 - degrees)) - + centroid[1], - 2, - ), - ) - - def _compute_polygon_vertex(angle: float) -> tuple[float, float]: - start_point = [polygon_radius, 0] - return _apply_rotation(start_point, angle) - - def _get_angles(n_sides: int, rotation: float) -> list[float]: - angles = [] - degrees = 360 / n_sides - # Start with the bottom left polygon vertex - current_angle = (270 - 0.5 * degrees) + rotation - for _ in range(0, n_sides): - angles.append(current_angle) - current_angle += degrees - if current_angle > 360: - current_angle -= 360 - return angles - - # 3. Variable Declarations - angles = _get_angles(n_sides, rotation) - - # 4. Compute Vertices - return [_compute_polygon_vertex(angle) for angle in angles] - - -def _color_diff( - color1: float | tuple[int, ...], color2: float | tuple[int, ...] -) -> float: - """ - Uses 1-norm distance to calculate difference between two values. - """ - first = color1 if isinstance(color1, tuple) else (color1,) - second = color2 if isinstance(color2, tuple) else (color2,) - - return sum(abs(first[i] - second[i]) for i in range(0, len(second))) diff --git a/.venv/Lib/site-packages/PIL/ImageDraw2.py b/.venv/Lib/site-packages/PIL/ImageDraw2.py deleted file mode 100644 index e89a78b..0000000 --- a/.venv/Lib/site-packages/PIL/ImageDraw2.py +++ /dev/null @@ -1,206 +0,0 @@ -# -# 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. -# - - -""" -(Experimental) WCK-style drawing interface operations - -.. seealso:: :py:mod:`PIL.ImageDraw` -""" -from __future__ import annotations - -from typing import BinaryIO - -from . import Image, ImageColor, ImageDraw, ImageFont, ImagePath -from ._typing import StrOrBytesPath - - -class Pen: - """Stores an outline color and width.""" - - def __init__(self, color: str, width: int = 1, opacity: int = 255) -> None: - self.color = ImageColor.getrgb(color) - self.width = width - - -class Brush: - """Stores a fill color""" - - def __init__(self, color: str, opacity: int = 255) -> None: - self.color = ImageColor.getrgb(color) - - -class Font: - """Stores a TrueType font and color""" - - def __init__( - self, color: str, file: StrOrBytesPath | BinaryIO, size: float = 12 - ) -> None: - # FIXME: add support for bitmap fonts - self.color = ImageColor.getrgb(color) - self.font = ImageFont.truetype(file, size) - - -class Draw: - """ - (Experimental) WCK-style drawing interface - """ - - def __init__( - self, - image: Image.Image | str, - size: tuple[int, int] | list[int] | None = None, - color: float | tuple[float, ...] | str | None = None, - ) -> None: - if isinstance(image, str): - if size is None: - msg = "If image argument is mode string, size must be a list or tuple" - raise ValueError(msg) - image = Image.new(image, size, color) - self.draw = ImageDraw.Draw(image) - self.image = image - self.transform = None - - def flush(self) -> Image.Image: - 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): - """Sets a transformation offset.""" - (xoffset, yoffset) = offset - self.transform = (1, 0, xoffset, 0, 1, yoffset) - - def arc(self, xy, start, end, *options): - """ - Draws an arc (a portion of a circle outline) between the start and end - angles, inside the given bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.arc` - """ - self.render("arc", xy, start, end, *options) - - def chord(self, xy, start, end, *options): - """ - Same as :py:meth:`~PIL.ImageDraw2.Draw.arc`, but connects the end points - with a straight line. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.chord` - """ - self.render("chord", xy, start, end, *options) - - def ellipse(self, xy, *options): - """ - Draws an ellipse inside the given bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.ellipse` - """ - self.render("ellipse", xy, *options) - - def line(self, xy, *options): - """ - Draws a line between the coordinates in the ``xy`` list. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.line` - """ - self.render("line", xy, *options) - - def pieslice(self, xy, start, end, *options): - """ - Same as arc, but also draws straight lines between the end points and the - center of the bounding box. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.pieslice` - """ - self.render("pieslice", xy, start, end, *options) - - def polygon(self, xy, *options): - """ - Draws a polygon. - - The polygon outline consists of straight lines between the given - coordinates, plus a straight line between the last and the first - coordinate. - - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.polygon` - """ - self.render("polygon", xy, *options) - - def rectangle(self, xy, *options): - """ - Draws a rectangle. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.rectangle` - """ - self.render("rectangle", xy, *options) - - def text(self, xy, text, font): - """ - Draws the string at the given position. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.text` - """ - if self.transform: - xy = ImagePath.Path(xy) - xy.transform(self.transform) - self.draw.text(xy, text, font=font.font, fill=font.color) - - def textbbox(self, xy, text, font): - """ - Returns bounding box (in pixels) of given text. - - :return: ``(left, top, right, bottom)`` bounding box - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textbbox` - """ - if self.transform: - xy = ImagePath.Path(xy) - xy.transform(self.transform) - return self.draw.textbbox(xy, text, font=font.font) - - def textlength(self, text, font): - """ - Returns length (in pixels) of given text. - This is the amount by which following text should be offset. - - .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textlength` - """ - return self.draw.textlength(text, font=font.font) diff --git a/.venv/Lib/site-packages/PIL/ImageEnhance.py b/.venv/Lib/site-packages/PIL/ImageEnhance.py deleted file mode 100644 index d7e99a9..0000000 --- a/.venv/Lib/site-packages/PIL/ImageEnhance.py +++ /dev/null @@ -1,107 +0,0 @@ -# -# 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 __future__ import annotations - -from . import Image, ImageFilter, ImageStat - - -class _Enhance: - image: Image.Image - degenerate: Image.Image - - def enhance(self, factor: float) -> Image.Image: - """ - 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: Image.Image) -> None: - 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 gray image. A factor of 1.0 gives the original image. - """ - - def __init__(self, image: Image.Image) -> None: - 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: Image.Image) -> None: - 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: Image.Image) -> None: - self.image = image - self.degenerate = image.filter(ImageFilter.SMOOTH) - - if "A" in image.getbands(): - self.degenerate.putalpha(image.getchannel("A")) diff --git a/.venv/Lib/site-packages/PIL/ImageFile.py b/.venv/Lib/site-packages/PIL/ImageFile.py deleted file mode 100644 index 69e7ee5..0000000 --- a/.venv/Lib/site-packages/PIL/ImageFile.py +++ /dev/null @@ -1,810 +0,0 @@ -# -# 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 __future__ import annotations - -import abc -import io -import itertools -import struct -import sys -from typing import IO, Any, NamedTuple - -from . import Image -from ._deprecate import deprecate -from ._util import is_path - -MAXBLOCK = 65536 - -SAFEBLOCK = 1024 * 1024 - -LOAD_TRUNCATED_IMAGES = False -"""Whether or not to load truncated image files. User code may change this.""" - -ERRORS = { - -1: "image buffer overrun error", - -2: "decoding error", - -3: "unknown error", - -8: "bad configuration", - -9: "out of memory error", -} -""" -Dict of known error codes returned from :meth:`.PyDecoder.decode`, -:meth:`.PyEncoder.encode` :meth:`.PyEncoder.encode_to_pyfd` and -:meth:`.PyEncoder.encode_to_file`. -""" - - -# -# -------------------------------------------------------------------- -# Helpers - - -def _get_oserror(error: int, *, encoder: bool) -> OSError: - try: - msg = Image.core.getcodecstatus(error) - except AttributeError: - msg = ERRORS.get(error) - if not msg: - msg = f"{'encoder' if encoder else 'decoder'} error {error}" - msg += f" when {'writing' if encoder else 'reading'} image file" - return OSError(msg) - - -def raise_oserror(error: int) -> OSError: - deprecate( - "raise_oserror", - 12, - action="It is only useful for translating error codes returned by a codec's " - "decode() method, which ImageFile already does automatically.", - ) - raise _get_oserror(error, encoder=False) - - -def _tilesort(t): - # sort on offset - return t[2] - - -class _Tile(NamedTuple): - codec_name: str - extents: tuple[int, int, int, int] - offset: int - args: tuple[Any, ...] | str | None - - -# -# -------------------------------------------------------------------- -# ImageFile base class - - -class ImageFile(Image.Image): - """Base class for image file format handlers.""" - - def __init__(self, fp=None, filename=None): - super().__init__() - - self._min_frame = 0 - - self.custom_mimetype = None - - self.tile = None - """ A list of tile descriptors, or ``None`` """ - - self.readonly = 1 # until we know better - - self.decoderconfig = () - self.decodermaxblock = MAXBLOCK - - if is_path(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: - 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: - raise SyntaxError(v) from v - - if not self.mode or self.size[0] <= 0 or self.size[1] <= 0: - msg = "not identified by this driver" - raise SyntaxError(msg) - except BaseException: - # close the file only if we have opened it this constructor - if self._exclusive_fp: - self.fp.close() - raise - - def get_format_mimetype(self) -> str | None: - if self.custom_mimetype: - return self.custom_mimetype - if self.format is not None: - return Image.MIME.get(self.format.upper()) - return None - - def __setstate__(self, state): - self.tile = [] - super().__setstate__(state) - - def verify(self) -> None: - """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""" - - if self.tile is None: - msg = "cannot load this image" - raise OSError(msg) - - pixel = Image.Image.load(self) - 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 isinstance(args, str): - args = (args, 0, 1) - if ( - decoder_name == "raw" - and len(args) >= 3 - and args[0] == self.mode - and args[0] in Image._MAPMODES - ): - try: - # use mmap, if possible - import mmap - - with open(self.filename) as fp: - self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ) - if offset + self.size[1] * args[1] > self.map.size(): - msg = "buffer is not large enough" - raise OSError(msg) - self.im = Image.core.map_buffer( - self.map, self.size, decoder_name, 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, OSError, 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"" - - # Remove consecutive duplicates that only differ by their offset - self.tile = [ - list(tiles)[-1] - for _, tiles in itertools.groupby( - self.tile, lambda tile: (tile[0], tile[1], tile[3]) - ) - ] - for decoder_name, extents, offset, args in self.tile: - seek(offset) - decoder = Image._getdecoder( - self.mode, decoder_name, args, self.decoderconfig - ) - try: - decoder.setimage(self.im, extents) - if decoder.pulls_fd: - decoder.setfd(self.fp) - err_code = decoder.decode(b"")[1] - else: - b = prefix - while True: - try: - s = read(self.decodermaxblock) - except (IndexError, struct.error) as e: - # truncated png/gif - if LOAD_TRUNCATED_IMAGES: - break - else: - msg = "image file is truncated" - raise OSError(msg) from e - - if not s: # truncated jpeg - if LOAD_TRUNCATED_IMAGES: - break - else: - msg = ( - "image file is truncated " - f"({len(b)} bytes not processed)" - ) - raise OSError(msg) - - b = b + s - n, err_code = decoder.decode(b) - if n < 0: - break - b = b[n:] - finally: - # Need to cleanup here to prevent leaks - 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 _get_oserror(err_code, encoder=False) - - return Image.Image.load(self) - - def load_prepare(self) -> None: - # 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) -> None: - # may be overridden - pass - - # may be defined for contained formats - # def load_seek(self, pos: int) -> None: - # pass - - # may be defined for blocked formats (e.g. PNG) - # def load_read(self, read_bytes: int) -> bytes: - # pass - - def _seek_check(self, frame): - if ( - frame < self._min_frame - # Only check upper limit on frames if additional seek operations - # are not required to do so - or ( - not (hasattr(self, "_n_frames") and self._n_frames is None) - and frame >= self.n_frames + self._min_frame - ) - ): - msg = "attempt to seek outside sequence" - raise EOFError(msg) - - return self.tell() != frame - - -class StubHandler: - def open(self, im: StubImageFile) -> None: - pass - - @abc.abstractmethod - def load(self, im: StubImageFile) -> Image.Image: - pass - - -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) -> None: - msg = "StubImageFile subclass must implement _open" - raise NotImplementedError(msg) - - def load(self): - loader = self._load() - if loader is None: - msg = f"cannot find loader for this {self.format} file" - raise OSError(msg) - image = loader.load(self) - assert image is not None - # become the other object (!) - self.__class__ = image.__class__ - self.__dict__ = image.__dict__ - return image.load() - - def _load(self) -> StubHandler | None: - """(Hook) Find actual image loader.""" - msg = "StubImageFile subclass must implement _load" - raise NotImplementedError(msg) - - -class Parser: - """ - Incremental image parser. This class implements the standard - feed/close consumer interface. - """ - - incremental = None - image: Image.Image | None = None - data = None - decoder = None - offset = 0 - finished = 0 - - def reset(self) -> None: - """ - (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 OSError: 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 _get_oserror(e, encoder=False) - 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 OSError: - 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 __enter__(self): - return self - - def __exit__(self, *args: object) -> None: - self.close() - - def close(self): - """ - (Consumer) Close the stream. - - :returns: An image object. - :exception OSError: 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: - msg = "image was incomplete" - raise OSError(msg) - if not self.image: - msg = "cannot parse this image" - raise OSError(msg) - 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) -> None: - """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 - try: - fh = fp.fileno() - fp.flush() - _encode_tile(im, fp, tile, bufsize, fh) - except (AttributeError, io.UnsupportedOperation) as exc: - _encode_tile(im, fp, tile, bufsize, None, exc) - if hasattr(fp, "flush"): - fp.flush() - - -def _encode_tile(im, fp, tile: list[_Tile], bufsize, fh, exc=None): - for encoder_name, extents, offset, args in tile: - if offset > 0: - fp.seek(offset) - encoder = Image._getencoder(im.mode, encoder_name, args, im.encoderconfig) - try: - encoder.setimage(im.im, extents) - if encoder.pushes_fd: - encoder.setfd(fp) - errcode = encoder.encode_to_pyfd()[1] - else: - if exc: - # compress to Python file-compatible object - while True: - errcode, data = encoder.encode(bufsize)[1:] - fp.write(data) - if errcode: - break - else: - # slight speedup: compress to real file object - errcode = encoder.encode_to_file(fh, bufsize) - if errcode < 0: - raise _get_oserror(errcode, encoder=True) from exc - finally: - encoder.cleanup() - - -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 size bytes of data. - - Raises an OSError if the file is truncated and the read cannot be completed - - """ - if size <= 0: - return b"" - if size <= SAFEBLOCK: - data = fp.read(size) - if len(data) < size: - msg = "Truncated File Read" - raise OSError(msg) - return data - data = [] - remaining_size = size - while remaining_size > 0: - block = fp.read(min(remaining_size, SAFEBLOCK)) - if not block: - break - data.append(block) - remaining_size -= len(block) - if sum(len(d) for d in data) < size: - msg = "Truncated File Read" - raise OSError(msg) - return b"".join(data) - - -class PyCodecState: - def __init__(self) -> None: - self.xsize = 0 - self.ysize = 0 - self.xoff = 0 - self.yoff = 0 - - def extents(self) -> tuple[int, int, int, int]: - return self.xoff, self.yoff, self.xoff + self.xsize, self.yoff + self.ysize - - -class PyCodec: - fd: IO[bytes] | None - - 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 codec specific initialization - - :param args: Array of args items from the tile entry - :returns: None - """ - self.args = args - - def cleanup(self) -> None: - """ - Override to perform codec 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: tuple[int, int, int, int] | None = None) -> None: - """ - Called from ImageFile to set the core output image for the codec - - :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: - msg = "Size cannot be negative" - raise ValueError(msg) - - if ( - self.state.xsize + self.state.xoff > self.im.size[0] - or self.state.ysize + self.state.yoff > self.im.size[1] - ): - msg = "Tile cannot extend outside image" - raise ValueError(msg) - - -class PyDecoder(PyCodec): - """ - Python implementation of a format decoder. Override this class and - add the decoding logic in the :meth:`decode` method. - - See :ref:`Writing Your Own File Codec in Python` - """ - - _pulls_fd = False - - @property - def pulls_fd(self) -> bool: - return self._pulls_fd - - def decode(self, buffer: bytes) -> tuple[int, int]: - """ - Override to perform the decoding process. - - :param buffer: A bytes object with the data to be decoded. - :returns: A tuple of ``(bytes consumed, errcode)``. - If finished with decoding return -1 for the bytes consumed. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - msg = "unavailable in base decoder" - raise NotImplementedError(msg) - - def set_as_raw(self, data: bytes, rawmode=None) -> 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) - assert self.im is not None - d.setimage(self.im, self.state.extents()) - s = d.decode(data) - - if s[0] >= 0: - msg = "not enough image data" - raise ValueError(msg) - if s[1] != 0: - msg = "cannot decode image data" - raise ValueError(msg) - - -class PyEncoder(PyCodec): - """ - Python implementation of a format encoder. Override this class and - add the decoding logic in the :meth:`encode` method. - - See :ref:`Writing Your Own File Codec in Python` - """ - - _pushes_fd = False - - @property - def pushes_fd(self) -> bool: - return self._pushes_fd - - def encode(self, bufsize: int) -> tuple[int, int, bytes]: - """ - Override to perform the encoding process. - - :param bufsize: Buffer size. - :returns: A tuple of ``(bytes encoded, errcode, bytes)``. - If finished with encoding return 1 for the error code. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - msg = "unavailable in base encoder" - raise NotImplementedError(msg) - - def encode_to_pyfd(self) -> tuple[int, int]: - """ - If ``pushes_fd`` is ``True``, then this method will be used, - and ``encode()`` will only be called once. - - :returns: A tuple of ``(bytes consumed, errcode)``. - Err codes are from :data:`.ImageFile.ERRORS`. - """ - if not self.pushes_fd: - return 0, -8 # bad configuration - bytes_consumed, errcode, data = self.encode(0) - if data: - assert self.fd is not None - self.fd.write(data) - return bytes_consumed, errcode - - def encode_to_file(self, fh, bufsize): - """ - :param fh: File handle. - :param bufsize: Buffer size. - - :returns: If finished successfully, return 0. - Otherwise, return an error code. Err codes are from - :data:`.ImageFile.ERRORS`. - """ - errcode = 0 - while errcode == 0: - status, errcode, buf = self.encode(bufsize) - if status > 0: - fh.write(buf[status:]) - return errcode diff --git a/.venv/Lib/site-packages/PIL/ImageFilter.py b/.venv/Lib/site-packages/PIL/ImageFilter.py deleted file mode 100644 index e18b4a4..0000000 --- a/.venv/Lib/site-packages/PIL/ImageFilter.py +++ /dev/null @@ -1,604 +0,0 @@ -# -# 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. -# -from __future__ import annotations - -import abc -import functools -from types import ModuleType -from typing import TYPE_CHECKING, Any, Callable, Sequence, cast - -if TYPE_CHECKING: - from . import _imaging - from ._typing import NumpyArray - - -class Filter: - @abc.abstractmethod - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - pass - - -class MultibandFilter(Filter): - pass - - -class BuiltinFilter(MultibandFilter): - filterargs: tuple[Any, ...] - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - if image.mode == "P": - msg = "cannot filter palette images" - raise ValueError(msg) - return image.filter(*self.filterargs) - - -class Kernel(BuiltinFilter): - """ - Create a convolution kernel. This only supports 3x3 and 5x5 integer and floating - point kernels. - - Kernels can only be applied to "L" and "RGB" images. - - :param size: Kernel size, given as (width, height). This must be (3,3) or (5,5). - :param kernel: A sequence containing kernel weights. The kernel will be flipped - vertically before being applied to the image. - :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. - """ - - name = "Kernel" - - def __init__( - self, - size: tuple[int, int], - kernel: Sequence[float], - scale: float | None = None, - offset: float = 0, - ) -> None: - 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): - msg = "not enough coefficients in kernel" - raise ValueError(msg) - self.filterargs = size, scale, offset, kernel - - -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: int, rank: int) -> None: - self.size = size - self.rank = rank - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - if image.mode == "P": - msg = "cannot filter palette images" - raise ValueError(msg) - 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: int = 3) -> None: - 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: int = 3) -> None: - 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: int = 3) -> None: - 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: int = 3) -> None: - self.size = size - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - return image.modefilter(self.size) - - -class GaussianBlur(MultibandFilter): - """Blurs the image with a sequence of extended box filters, which - approximates a Gaussian kernel. For details on accuracy see - - - :param radius: Standard deviation of the Gaussian kernel. Either a sequence of two - numbers for x and y, or a single number for both. - """ - - name = "GaussianBlur" - - def __init__(self, radius: float | Sequence[float] = 2) -> None: - self.radius = radius - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - xy = self.radius - if isinstance(xy, (int, float)): - xy = (xy, xy) - if xy == (0, 0): - return image.copy() - return image.gaussian_blur(xy) - - -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 a direction. Either a sequence of two numbers for - x and y, or a single number for both. - - 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: float | Sequence[float]) -> None: - xy = radius if isinstance(radius, (tuple, list)) else (radius, radius) - if xy[0] < 0 or xy[1] < 0: - msg = "radius must be >= 0" - raise ValueError(msg) - self.radius = radius - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - xy = self.radius - if isinstance(xy, (int, float)): - xy = (xy, xy) - if xy == (0, 0): - return image.copy() - return image.box_blur(xy) - - -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: float = 2, percent: int = 150, threshold: int = 3 - ) -> None: - self.radius = radius - self.percent = percent - self.threshold = threshold - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - return image.unsharp_mask(self.radius, self.percent, self.threshold) - - -class BLUR(BuiltinFilter): - name = "Blur" - # fmt: off - 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, - ) - # fmt: on - - -class CONTOUR(BuiltinFilter): - name = "Contour" - # fmt: off - filterargs = (3, 3), 1, 255, ( - -1, -1, -1, - -1, 8, -1, - -1, -1, -1, - ) - # fmt: on - - -class DETAIL(BuiltinFilter): - name = "Detail" - # fmt: off - filterargs = (3, 3), 6, 0, ( - 0, -1, 0, - -1, 10, -1, - 0, -1, 0, - ) - # fmt: on - - -class EDGE_ENHANCE(BuiltinFilter): - name = "Edge-enhance" - # fmt: off - filterargs = (3, 3), 2, 0, ( - -1, -1, -1, - -1, 10, -1, - -1, -1, -1, - ) - # fmt: on - - -class EDGE_ENHANCE_MORE(BuiltinFilter): - name = "Edge-enhance More" - # fmt: off - filterargs = (3, 3), 1, 0, ( - -1, -1, -1, - -1, 9, -1, - -1, -1, -1, - ) - # fmt: on - - -class EMBOSS(BuiltinFilter): - name = "Emboss" - # fmt: off - filterargs = (3, 3), 1, 128, ( - -1, 0, 0, - 0, 1, 0, - 0, 0, 0, - ) - # fmt: on - - -class FIND_EDGES(BuiltinFilter): - name = "Find Edges" - # fmt: off - filterargs = (3, 3), 1, 0, ( - -1, -1, -1, - -1, 8, -1, - -1, -1, -1, - ) - # fmt: on - - -class SHARPEN(BuiltinFilter): - name = "Sharpen" - # fmt: off - filterargs = (3, 3), 16, 0, ( - -2, -2, -2, - -2, 32, -2, - -2, -2, -2, - ) - # fmt: on - - -class SMOOTH(BuiltinFilter): - name = "Smooth" - # fmt: off - filterargs = (3, 3), 13, 0, ( - 1, 1, 1, - 1, 5, 1, - 1, 1, 1, - ) - # fmt: on - - -class SMOOTH_MORE(BuiltinFilter): - name = "Smooth More" - # fmt: off - 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, - ) - # fmt: on - - -class Color3DLUT(MultibandFilter): - """Three-dimensional color lookup table. - - Transforms 3-channel pixels using the values of the channels as coordinates - in the 3D lookup table and interpolating the nearest elements. - - This method allows you to apply almost any color transformation - in constant time by using pre-calculated decimated tables. - - .. versionadded:: 5.2.0 - - :param size: Size of the table. One int or tuple of (int, int, int). - Minimal size in any dimension is 2, maximum is 65. - :param table: Flat lookup table. A list of ``channels * size**3`` - float elements or a list of ``size**3`` channels-sized - tuples with floats. Channels are changed first, - then first dimension, then second, then third. - Value 0.0 corresponds lowest value of output, 1.0 highest. - :param channels: Number of channels in the table. Could be 3 or 4. - Default is 3. - :param target_mode: A mode for the result image. Should have not less - than ``channels`` channels. Default is ``None``, - which means that mode wouldn't be changed. - """ - - name = "Color 3D LUT" - - def __init__( - self, - size: int | tuple[int, int, int], - table: Sequence[float] | Sequence[Sequence[int]] | NumpyArray, - channels: int = 3, - target_mode: str | None = None, - **kwargs: bool, - ) -> None: - if channels not in (3, 4): - msg = "Only 3 or 4 output channels are supported" - raise ValueError(msg) - self.size = size = self._check_size(size) - self.channels = channels - self.mode = target_mode - - # Hidden flag `_copy_table=False` could be used to avoid extra copying - # of the table if the table is specially made for the constructor. - copy_table = kwargs.get("_copy_table", True) - items = size[0] * size[1] * size[2] - wrong_size = False - - numpy: ModuleType | None = None - if hasattr(table, "shape"): - try: - import numpy - except ImportError: - pass - - if numpy and isinstance(table, numpy.ndarray): - numpy_table: NumpyArray = table - if copy_table: - numpy_table = numpy_table.copy() - - if numpy_table.shape in [ - (items * channels,), - (items, channels), - (size[2], size[1], size[0], channels), - ]: - table = numpy_table.reshape(items * channels) - else: - wrong_size = True - - else: - if copy_table: - table = list(table) - - # Convert to a flat list - if table and isinstance(table[0], (list, tuple)): - raw_table = cast(Sequence[Sequence[int]], table) - flat_table: list[int] = [] - for pixel in raw_table: - if len(pixel) != channels: - msg = ( - "The elements of the table should " - f"have a length of {channels}." - ) - raise ValueError(msg) - flat_table.extend(pixel) - table = flat_table - - if wrong_size or len(table) != items * channels: - msg = ( - "The table should have either channels * size**3 float items " - "or size**3 items of channels-sized tuples with floats. " - f"Table should be: {channels}x{size[0]}x{size[1]}x{size[2]}. " - f"Actual length: {len(table)}" - ) - raise ValueError(msg) - self.table = table - - @staticmethod - def _check_size(size: Any) -> tuple[int, int, int]: - try: - _, _, _ = size - except ValueError as e: - msg = "Size should be either an integer or a tuple of three integers." - raise ValueError(msg) from e - except TypeError: - size = (size, size, size) - size = tuple(int(x) for x in size) - for size_1d in size: - if not 2 <= size_1d <= 65: - msg = "Size should be in [2, 65] range." - raise ValueError(msg) - return size - - @classmethod - def generate( - cls, - size: int | tuple[int, int, int], - callback: Callable[[float, float, float], tuple[float, ...]], - channels: int = 3, - target_mode: str | None = None, - ) -> Color3DLUT: - """Generates new LUT using provided callback. - - :param size: Size of the table. Passed to the constructor. - :param callback: Function with three parameters which correspond - three color channels. Will be called ``size**3`` - times with values from 0.0 to 1.0 and should return - a tuple with ``channels`` elements. - :param channels: The number of channels which should return callback. - :param target_mode: Passed to the constructor of the resulting - lookup table. - """ - size_1d, size_2d, size_3d = cls._check_size(size) - if channels not in (3, 4): - msg = "Only 3 or 4 output channels are supported" - raise ValueError(msg) - - table: list[float] = [0] * (size_1d * size_2d * size_3d * channels) - idx_out = 0 - for b in range(size_3d): - for g in range(size_2d): - for r in range(size_1d): - table[idx_out : idx_out + channels] = callback( - r / (size_1d - 1), g / (size_2d - 1), b / (size_3d - 1) - ) - idx_out += channels - - return cls( - (size_1d, size_2d, size_3d), - table, - channels=channels, - target_mode=target_mode, - _copy_table=False, - ) - - def transform( - self, - callback: Callable[..., tuple[float, ...]], - with_normals: bool = False, - channels: int | None = None, - target_mode: str | None = None, - ) -> Color3DLUT: - """Transforms the table values using provided callback and returns - a new LUT with altered values. - - :param callback: A function which takes old lookup table values - and returns a new set of values. The number - of arguments which function should take is - ``self.channels`` or ``3 + self.channels`` - if ``with_normals`` flag is set. - Should return a tuple of ``self.channels`` or - ``channels`` elements if it is set. - :param with_normals: If true, ``callback`` will be called with - coordinates in the color cube as the first - three arguments. Otherwise, ``callback`` - will be called only with actual color values. - :param channels: The number of channels in the resulting lookup table. - :param target_mode: Passed to the constructor of the resulting - lookup table. - """ - if channels not in (None, 3, 4): - msg = "Only 3 or 4 output channels are supported" - raise ValueError(msg) - ch_in = self.channels - ch_out = channels or ch_in - size_1d, size_2d, size_3d = self.size - - table = [0] * (size_1d * size_2d * size_3d * ch_out) - idx_in = 0 - idx_out = 0 - for b in range(size_3d): - for g in range(size_2d): - for r in range(size_1d): - values = self.table[idx_in : idx_in + ch_in] - if with_normals: - values = callback( - r / (size_1d - 1), - g / (size_2d - 1), - b / (size_3d - 1), - *values, - ) - else: - values = callback(*values) - table[idx_out : idx_out + ch_out] = values - idx_in += ch_in - idx_out += ch_out - - return type(self)( - self.size, - table, - channels=ch_out, - target_mode=target_mode or self.mode, - _copy_table=False, - ) - - def __repr__(self) -> str: - r = [ - f"{self.__class__.__name__} from {self.table.__class__.__name__}", - "size={:d}x{:d}x{:d}".format(*self.size), - f"channels={self.channels:d}", - ] - if self.mode: - r.append(f"target_mode={self.mode}") - return "<{}>".format(" ".join(r)) - - def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: - from . import Image - - return image.color_lut_3d( - self.mode or image.mode, - Image.Resampling.BILINEAR, - self.channels, - self.size[0], - self.size[1], - self.size[2], - self.table, - ) diff --git a/.venv/Lib/site-packages/PIL/ImageFont.py b/.venv/Lib/site-packages/PIL/ImageFont.py deleted file mode 100644 index d260eef..0000000 --- a/.venv/Lib/site-packages/PIL/ImageFont.py +++ /dev/null @@ -1,1290 +0,0 @@ -# -# 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 __future__ import annotations - -import base64 -import os -import sys -import warnings -from enum import IntEnum -from io import BytesIO -from types import ModuleType -from typing import IO, TYPE_CHECKING, Any, BinaryIO - -from . import Image -from ._typing import StrOrBytesPath -from ._util import DeferredError, is_path - -if TYPE_CHECKING: - from . import ImageFile - from ._imaging import ImagingFont - from ._imagingft import Font - - -class Layout(IntEnum): - BASIC = 0 - RAQM = 1 - - -MAX_STRING_LENGTH = 1_000_000 - - -core: ModuleType | DeferredError -try: - from . import _imagingft as core -except ImportError as ex: - core = DeferredError.new(ex) - - -def _string_length_check(text: str | bytes | bytearray) -> None: - if MAX_STRING_LENGTH is not None and len(text) > MAX_STRING_LENGTH: - msg = "too many characters in string" - raise ValueError(msg) - - -# 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: - """PIL font wrapper""" - - font: ImagingFont - - def _load_pilfont(self, filename: str) -> None: - with open(filename, "rb") as fp: - image: ImageFile.ImageFile | None = None - for ext in (".png", ".gif", ".pbm"): - if image: - image.close() - try: - fullname = os.path.splitext(filename)[0] + ext - image = Image.open(fullname) - except Exception: - pass - else: - if image and image.mode in ("1", "L"): - break - else: - if image: - image.close() - msg = "cannot find glyph data file" - raise OSError(msg) - - self.file = fullname - - self._load_pilfont_data(fp, image) - image.close() - - def _load_pilfont_data(self, file: IO[bytes], image: Image.Image) -> None: - # read PILfont header - if file.readline() != b"PILfont\n": - msg = "Not a PILfont file" - raise SyntaxError(msg) - 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"): - msg = "invalid font image mode" - raise TypeError(msg) - - image.load() - - self.font = Image.core.font(image.im, data) - - def getmask(self, text, mode="", *args, **kwargs): - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :return: An internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module. - """ - _string_length_check(text) - Image._decompression_bomb_check(self.font.getsize(text)) - return self.font.getmask(text, mode) - - def getbbox( - self, text: str | bytes | bytearray, *args: Any, **kwargs: Any - ) -> tuple[int, int, int, int]: - """ - Returns bounding box (in pixels) of given text. - - .. versionadded:: 9.2.0 - - :param text: Text to render. - - :return: ``(left, top, right, bottom)`` bounding box - """ - _string_length_check(text) - width, height = self.font.getsize(text) - return 0, 0, width, height - - def getlength( - self, text: str | bytes | bytearray, *args: Any, **kwargs: Any - ) -> int: - """ - Returns length (in pixels) of given text. - This is the amount by which following text should be offset. - - .. versionadded:: 9.2.0 - """ - _string_length_check(text) - width, height = self.font.getsize(text) - return width - - -## -# Wrapper for FreeType fonts. Application code should use the -# truetype factory function to create font objects. - - -class FreeTypeFont: - """FreeType font wrapper (requires _imagingft service)""" - - font: Font - font_bytes: bytes - - def __init__( - self, - font: StrOrBytesPath | BinaryIO | None = None, - size: float = 10, - index: int = 0, - encoding: str = "", - layout_engine: Layout | None = None, - ) -> None: - # FIXME: use service provider instead - - if isinstance(core, DeferredError): - raise core.ex - - if size <= 0: - msg = "font size must be greater than 0" - raise ValueError(msg) - - 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 - elif layout_engine == Layout.RAQM and not core.HAVE_RAQM: - warnings.warn( - "Raqm layout was requested, but Raqm is not available. " - "Falling back to basic layout." - ) - layout_engine = Layout.BASIC - - self.layout_engine = layout_engine - - def load_from_bytes(f): - self.font_bytes = f.read() - self.font = core.getfont( - "", size, index, encoding, self.font_bytes, layout_engine - ) - - if is_path(font): - font = os.path.realpath(os.fspath(font)) - if sys.platform == "win32": - font_bytes_path = font if isinstance(font, bytes) else font.encode() - try: - font_bytes_path.decode("ascii") - except UnicodeDecodeError: - # FreeType cannot load fonts with non-ASCII characters on Windows - # So load it into memory first - with open(font, "rb") as f: - load_from_bytes(f) - return - self.font = core.getfont( - font, size, index, encoding, layout_engine=layout_engine - ) - else: - load_from_bytes(font) - - def __getstate__(self): - return [self.path, self.size, self.index, self.encoding, self.layout_engine] - - def __setstate__(self, state): - path, size, index, encoding, layout_engine = state - self.__init__(path, size, index, encoding, layout_engine) - - def getname(self) -> tuple[str | None, str | None]: - """ - :return: A tuple of the font family (e.g. Helvetica) and the font style - (e.g. Bold) - """ - return self.font.family, self.font.style - - def getmetrics(self) -> tuple[int, int]: - """ - :return: A tuple of the font ascent (the distance from the baseline to - the highest outline point) and descent (the distance from the - baseline to the lowest outline point, a negative value) - """ - return self.font.ascent, self.font.descent - - def getlength( - self, text: str | bytes, mode="", direction=None, features=None, language=None - ) -> float: - """ - Returns length (in pixels with 1/64 precision) of given text when rendered - in font with provided direction, features, and language. - - This is the amount by which following text should be offset. - Text bounding box may extend past the length in some fonts, - e.g. when using italics or accents. - - The result is returned as a float; it is a whole number if using basic layout. - - Note that the sum of two lengths may not equal the length of a concatenated - string due to kerning. If you need to adjust for kerning, include the following - character and subtract its length. - - For example, instead of :: - - hello = font.getlength("Hello") - world = font.getlength("World") - hello_world = hello + world # not adjusted for kerning - assert hello_world == font.getlength("HelloWorld") # may fail - - use :: - - hello = font.getlength("HelloW") - font.getlength("W") # adjusted for kerning - world = font.getlength("World") - hello_world = hello + world # adjusted for kerning - assert hello_world == font.getlength("HelloWorld") # True - - or disable kerning with (requires libraqm) :: - - hello = draw.textlength("Hello", font, features=["-kern"]) - world = draw.textlength("World", font, features=["-kern"]) - hello_world = hello + world # kerning is disabled, no need to adjust - assert hello_world == draw.textlength("HelloWorld", font, features=["-kern"]) - - .. versionadded:: 8.0.0 - - :param text: Text to measure. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - :return: Either width for horizontal text, or height for vertical text. - """ - _string_length_check(text) - return self.font.getlength(text, mode, direction, features, language) / 64 - - def getbbox( - self, - text: str | bytes, - mode: str = "", - direction: str | None = None, - features: list[str] | None = None, - language: str | None = None, - stroke_width: float = 0, - anchor: str | None = None, - ) -> tuple[float, float, float, float]: - """ - Returns bounding box (in pixels) of given text relative to given anchor - when rendered in font with provided direction, features, and language. - - Use :py:meth:`getlength()` to get the offset of following text with - 1/64 pixel precision. The bounding box includes extra margins for - some fonts, e.g. italics or accents. - - .. versionadded:: 8.0.0 - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - :param stroke_width: The width of the text stroke. - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left, - specifically ``la`` for horizontal text and ``lt`` for - vertical text. See :ref:`text-anchors` for details. - - :return: ``(left, top, right, bottom)`` bounding box - """ - _string_length_check(text) - size, offset = self.font.getsize( - text, mode, direction, features, language, anchor - ) - left, top = offset[0] - stroke_width, offset[1] - stroke_width - width, height = size[0] + 2 * stroke_width, size[1] + 2 * stroke_width - return left, top, left + width, top + height - - def getmask( - self, - text, - mode="", - direction=None, - features=None, - language=None, - stroke_width=0, - anchor=None, - ink=0, - start=None, - ): - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. If the font has embedded color data, the bitmap - should have mode ``RGBA``. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - .. versionadded:: 6.0.0 - - :param stroke_width: The width of the text stroke. - - .. versionadded:: 6.2.0 - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left, - specifically ``la`` for horizontal text and ``lt`` for - vertical text. See :ref:`text-anchors` for details. - - .. versionadded:: 8.0.0 - - :param ink: Foreground ink for rendering in RGBA mode. - - .. versionadded:: 8.0.0 - - :param start: Tuple of horizontal and vertical offset, as text may render - differently when starting at fractional coordinates. - - .. versionadded:: 9.4.0 - - :return: An internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module. - """ - return self.getmask2( - text, - mode, - direction=direction, - features=features, - language=language, - stroke_width=stroke_width, - anchor=anchor, - ink=ink, - start=start, - )[0] - - def getmask2( - self, - text: str | bytes, - mode="", - direction=None, - features=None, - language=None, - stroke_width=0, - anchor=None, - ink=0, - start=None, - *args, - **kwargs, - ): - """ - Create a bitmap for the text. - - If the font uses antialiasing, the bitmap should have mode ``L`` and use a - maximum value of 255. If the font has embedded color data, the bitmap - should have mode ``RGBA``. Otherwise, it should have mode ``1``. - - :param text: Text to render. - :param mode: Used by some graphics drivers to indicate what mode the - driver prefers; if empty, the renderer may return either - mode. Note that the mode is always a string, to simplify - C-level implementations. - - .. versionadded:: 1.1.5 - - :param direction: Direction of the text. It can be 'rtl' (right to - left), 'ltr' (left to right) or 'ttb' (top to bottom). - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param features: A list of OpenType font features to be used during text - layout. This is usually used to turn on optional - font features that are not enabled by default, - for example 'dlig' or 'ss01', but can be also - used to turn off default font features for - example '-liga' to disable ligatures or '-kern' - to disable kerning. To get all supported - features, see - https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist - Requires libraqm. - - .. versionadded:: 4.2.0 - - :param language: Language of the text. Different languages may use - different glyph shapes or ligatures. This parameter tells - the font which language the text is in, and to apply the - correct substitutions as appropriate, if available. - It should be a `BCP 47 language code - `_ - Requires libraqm. - - .. versionadded:: 6.0.0 - - :param stroke_width: The width of the text stroke. - - .. versionadded:: 6.2.0 - - :param anchor: The text anchor alignment. Determines the relative location of - the anchor to the text. The default alignment is top left, - specifically ``la`` for horizontal text and ``lt`` for - vertical text. See :ref:`text-anchors` for details. - - .. versionadded:: 8.0.0 - - :param ink: Foreground ink for rendering in RGBA mode. - - .. versionadded:: 8.0.0 - - :param start: Tuple of horizontal and vertical offset, as text may render - differently when starting at fractional coordinates. - - .. versionadded:: 9.4.0 - - :return: A tuple of an internal PIL storage memory instance as defined by the - :py:mod:`PIL.Image.core` interface module, and the text offset, the - gap between the starting coordinate and the first marking - """ - _string_length_check(text) - if start is None: - start = (0, 0) - - def fill(width, height): - size = (width, height) - Image._decompression_bomb_check(size) - return Image.core.fill("RGBA" if mode == "RGBA" else "L", size) - - return self.font.render( - text, - fill, - mode, - direction, - features, - language, - stroke_width, - anchor, - ink, - start[0], - start[1], - ) - - 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. - """ - if font is None: - try: - font = BytesIO(self.font_bytes) - except AttributeError: - font = self.path - return FreeTypeFont( - font=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=layout_engine or self.layout_engine, - ) - - def get_variation_names(self) -> list[bytes]: - """ - :returns: A list of the named styles in a variation font. - :exception OSError: If the font is not a variation font. - """ - try: - names = self.font.getvarnames() - except AttributeError as e: - msg = "FreeType 2.9.1 or greater is required" - raise NotImplementedError(msg) from e - return [name.replace(b"\x00", b"") for name in names] - - def set_variation_by_name(self, name): - """ - :param name: The name of the style. - :exception OSError: If the font is not a variation font. - """ - names = self.get_variation_names() - if not isinstance(name, bytes): - name = name.encode() - index = names.index(name) + 1 - - if index == getattr(self, "_last_variation_index", None): - # When the same name is set twice in a row, - # there is an 'unknown freetype error' - # https://savannah.nongnu.org/bugs/?56186 - return - self._last_variation_index = index - - self.font.setvarname(index) - - def get_variation_axes(self): - """ - :returns: A list of the axes in a variation font. - :exception OSError: If the font is not a variation font. - """ - try: - axes = self.font.getvaraxes() - except AttributeError as e: - msg = "FreeType 2.9.1 or greater is required" - raise NotImplementedError(msg) from e - for axis in axes: - if axis["name"]: - axis["name"] = axis["name"].replace(b"\x00", b"") - return axes - - def set_variation_by_axes(self, axes: list[float]) -> None: - """ - :param axes: A list of values for each axis. - :exception OSError: If the font is not a variation font. - """ - try: - self.font.setvaraxes(axes) - except AttributeError as e: - msg = "FreeType 2.9.1 or greater is required" - raise NotImplementedError(msg) from e - - -class TransposedFont: - """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.Transpose.FLIP_LEFT_RIGHT, Image.Transpose.FLIP_TOP_BOTTOM, - Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_180, or - Image.Transpose.ROTATE_270. - """ - self.font = font - self.orientation = orientation # any 'transpose' argument, or None - - 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 getbbox(self, text, *args, **kwargs): - # TransposedFont doesn't support getmask2, move top-left point to (0, 0) - # this has no effect on ImageFont and simulates anchor="lt" for FreeTypeFont - left, top, right, bottom = self.font.getbbox(text, *args, **kwargs) - width = right - left - height = bottom - top - if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): - return 0, 0, height, width - return 0, 0, width, height - - def getlength(self, text: str | bytes, *args, **kwargs) -> float: - if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): - msg = "text length is undefined for text rotated by 90 or 270 degrees" - raise ValueError(msg) - return self.font.getlength(text, *args, **kwargs) - - -def load(filename: str) -> ImageFont: - """ - 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 OSError: If the file could not be read. - """ - f = ImageFont() - f._load_pilfont(filename) - return f - - -def truetype( - font: StrOrBytesPath | BinaryIO | None = None, - size: float = 10, - index: int = 0, - encoding: str = "", - layout_engine: Layout | None = None, -) -> FreeTypeFont: - """ - Load a TrueType or OpenType font from a file or file-like object, - and create a font object. - This function loads a font object from the given file or file-like - object, and creates a font object for a font of the given size. - - Pillow uses FreeType to open font files. On Windows, be aware that FreeType - will keep the file open as long as the FreeTypeFont object exists. Windows - limits the number of files that can be open in C at once to 512, so if many - fonts are opened simultaneously and that limit is approached, an - ``OSError`` may be thrown, reporting that FreeType "cannot open resource". - A workaround would be to copy the file(s) into memory, and open that instead. - - This function requires the _imagingft service. - - :param font: A filename or file-like object containing a TrueType font. - If the file is not found in this filename, the loader may also - search in other directories, such as: - - * The :file:`fonts/` directory on Windows, - * :file:`/Library/Fonts/`, :file:`/System/Library/Fonts/` - and :file:`~/Library/Fonts/` on macOS. - * :file:`~/.local/share/fonts`, :file:`/usr/local/share/fonts`, - and :file:`/usr/share/fonts` on Linux; or those specified by - the ``XDG_DATA_HOME`` and ``XDG_DATA_DIRS`` environment variables - for user-installed and system-wide fonts, respectively. - - :param size: The requested size, in pixels. - :param index: Which font face to load (default is first available face). - :param encoding: Which font encoding to use (default is Unicode). Possible - encodings include (see the FreeType documentation for more - information): - - * "unic" (Unicode) - * "symb" (Microsoft Symbol) - * "ADOB" (Adobe Standard) - * "ADBE" (Adobe Expert) - * "ADBC" (Adobe Custom) - * "armn" (Apple Roman) - * "sjis" (Shift JIS) - * "gb " (PRC) - * "big5" - * "wans" (Extended Wansung) - * "joha" (Johab) - * "lat1" (Latin-1) - - This specifies the character set to use. It does not alter the - encoding of any text provided in subsequent operations. - :param layout_engine: Which layout engine to use, if available: - :attr:`.ImageFont.Layout.BASIC` or :attr:`.ImageFont.Layout.RAQM`. - If it is available, Raqm layout will be used by default. - Otherwise, basic layout will be used. - - Raqm layout is recommended for all non-English text. If Raqm layout - is not required, basic layout will have better performance. - - You can check support for Raqm layout using - :py:func:`PIL.features.check_feature` with ``feature="raqm"``. - - .. versionadded:: 4.2.0 - :return: A font object. - :exception OSError: If the file could not be read. - :exception ValueError: If the font size is not greater than zero. - """ - - def freetype(font: StrOrBytesPath | BinaryIO | None) -> FreeTypeFont: - return FreeTypeFont(font, size, index, encoding, layout_engine) - - try: - return freetype(font) - except OSError: - if not is_path(font): - raise - 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"): - data_home = os.environ.get("XDG_DATA_HOME") - if not data_home: - # The freedesktop spec defines the following default directory for - # when XDG_DATA_HOME is unset or empty. This user-level directory - # takes precedence over system-level directories. - data_home = os.path.expanduser("~/.local/share") - xdg_dirs = [data_home] - - data_dirs = os.environ.get("XDG_DATA_DIRS") - if not data_dirs: - # Similarly, defaults are defined for the system-level directories - data_dirs = "/usr/local/share:/usr/share" - xdg_dirs += data_dirs.split(":") - - dirs += [os.path.join(xdg_dir, "fonts") for xdg_dir in xdg_dirs] - 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: - return freetype(os.path.join(walkroot, walkfilename)) - 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 freetype(fontpath) - 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 freetype(first_font_with_a_different_extension) - raise - - -def load_path(filename: str | bytes) -> ImageFont: - """ - 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 OSError: If the file could not be read. - """ - if not isinstance(filename, str): - filename = filename.decode("utf-8") - for directory in sys.path: - try: - return load(os.path.join(directory, filename)) - except OSError: - pass - msg = "cannot find font file" - raise OSError(msg) - - -def load_default_imagefont() -> ImageFont: - 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 - - -def load_default(size: float | None = None) -> FreeTypeFont | ImageFont: - """If FreeType support is available, load a version of Aileron Regular, - https://dotcolon.net/font/aileron, with a more limited character set. - - Otherwise, load a "better than nothing" font. - - .. versionadded:: 1.1.4 - - :param size: The font size of Aileron Regular. - - .. versionadded:: 10.1.0 - - :return: A font object. - """ - if isinstance(core, ModuleType) or size is not None: - return truetype( - BytesIO( - base64.b64decode( - b""" -AAEAAAAPAIAAAwBwRkZUTYwDlUAAADFoAAAAHEdERUYAqADnAAAo8AAAACRHUE9ThhmITwAAKfgAA -AduR1NVQnHxefoAACkUAAAA4k9TLzJovoHLAAABeAAAAGBjbWFw5lFQMQAAA6gAAAGqZ2FzcP//AA -MAACjoAAAACGdseWYmRXoPAAAGQAAAHfhoZWFkE18ayQAAAPwAAAA2aGhlYQboArEAAAE0AAAAJGh -tdHjjERZ8AAAB2AAAAdBsb2NhuOexrgAABVQAAADqbWF4cAC7AEYAAAFYAAAAIG5hbWUr+h5lAAAk -OAAAA6Jwb3N0D3oPTQAAJ9wAAAEKAAEAAAABGhxJDqIhXw889QALA+gAAAAA0Bqf2QAAAADhCh2h/ -2r/LgOxAyAAAAAIAAIAAAAAAAAAAQAAA8r/GgAAA7j/av9qA7EAAQAAAAAAAAAAAAAAAAAAAHQAAQ -AAAHQAQwAFAAAAAAACAAAAAQABAAAAQAAAAAAAAAADAfoBkAAFAAgCigJYAAAASwKKAlgAAAFeADI -BPgAAAAAFAAAAAAAAAAAAAAcAAAAAAAAAAAAAAABVS1dOAEAAIPsCAwL/GgDIA8oA5iAAAJMAAAAA -AhICsgAAACAAAwH0AAAAAAAAAU0AAADYAAAA8gA5AVMAVgJEAEYCRAA1AuQAKQKOAEAAsAArATsAZ -AE7AB4CMABVAkQAUADc/+EBEgAgANwAJQEv//sCRAApAkQAggJEADwCRAAtAkQAIQJEADkCRAArAk -QAMgJEACwCRAAxANwAJQDc/+ECRABnAkQAUAJEAEQB8wAjA1QANgJ/AB0CcwBkArsALwLFAGQCSwB -kAjcAZALGAC8C2gBkAQgAZAIgADcCYQBkAj8AZANiAGQCzgBkAuEALwJWAGQC3QAvAmsAZAJJADQC -ZAAiAqoAXgJuACADuAAaAnEAGQJFABMCTwAuATMAYgEv//sBJwAiAkQAUAH0ADIBLAApAhMAJAJjA -EoCEQAeAmcAHgIlAB4BIgAVAmcAHgJRAEoA7gA+AOn/8wIKAEoA9wBGA1cASgJRAEoCSgAeAmMASg -JnAB4BSgBKAcsAGAE5ABQCUABCAgIAAQMRAAEB4v/6AgEAAQHOABQBLwBAAPoAYAEvACECRABNA0Y -AJAItAHgBKgAcAkQAUAEsAHQAygAgAi0AOQD3ADYA9wAWAaEANgGhABYCbAAlAYMAeAGDADkA6/9q -AhsAFAIKABUB/QAVAAAAAwAAAAMAAAAcAAEAAAAAAKQAAwABAAAAHAAEAIgAAAAeABAAAwAOAH4Aq -QCrALEAtAC3ALsgGSAdICYgOiBEISL7Av//AAAAIACpAKsAsAC0ALcAuyAYIBwgJiA5IEQhIvsB// -//4/+5/7j/tP+y/7D/reBR4E/gR+A14CzfTwVxAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAEGAAABAAAAAAAAAAECAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAMEBQYHCAkKCwwNDg8QERIT -FBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMT -U5PUFFSU1RVVldYWVpbXF1eX2BhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAA -AAAAAAYnFmAAAAAABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAY2htAAAAAAAAAABrbGlqAAAAAHAAbm9 -ycwBnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmACYAJgAmAD4AUgCCAMoBCgFO -AVwBcgGIAaYBvAHKAdYB6AH2AgwCIAJKAogCpgLWAw4DIgNkA5wDugPUA+gD/AQQBEYEogS8BPoFJ -gVSBWoFgAWwBcoF1gX6BhQGJAZMBmgGiga0BuIHGgdUB2YHkAeiB8AH3AfyCAoIHAgqCDoITghcCG -oIogjSCPoJKglYCXwJwgnqCgIKKApACl4Klgq8CtwLDAs8C1YLjAuyC9oL7gwMDCYMSAxgDKAMrAz -qDQoNTA1mDYQNoA2uDcAN2g3oDfYODA4iDkoOXA5sDnoOnA7EDvwAAAAFAAAAAAH0ArwAAwAGAAkA -DAAPAAAxESERAxMhExcRASELARETAfT6qv6syKr+jgFUqsiqArz9RAGLAP/+1P8B/v3VAP8BLP4CA -P8AAgA5//IAuQKyAAMACwAANyMDMwIyFhQGIiY0oE4MZk84JCQ4JLQB/v3AJDgkJDgAAgBWAeUBPA -LfAAMABwAAEyMnMxcjJzOmRgpagkYKWgHl+vr6AAAAAAIARgAAAf4CsgAbAB8AAAEHMxUjByM3Iwc -jNyM1MzcjNTM3MwczNzMHMxUrAQczAZgdZXEvOi9bLzovWmYdZXEvOi9bLzovWp9bHlsBn4w429vb -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 -EQQ/BCQvEjQCFQZWFSEWQv40AcxCDiUblhP9uSEAAAAAAAAWAQ4AAQAAAAAAAAATACgAAQAAAAAAA -QAHAEwAAQAAAAAAAgAHAGQAAQAAAAAAAwAaAKIAAQAAAAAABAAHAM0AAQAAAAAABQA8AU8AAQAAAA -AABgAPAawAAQAAAAAACAALAdQAAQAAAAAACQALAfgAAQAAAAAACwAXAjQAAQAAAAAADAAXAnwAAwA -BBAkAAAAmAAAAAwABBAkAAQAOADwAAwABBAkAAgAOAFQAAwABBAkAAwA0AGwAAwABBAkABAAOAL0A -AwABBAkABQB4ANUAAwABBAkABgAeAYwAAwABBAkACAAWAbwAAwABBAkACQAWAeAAAwABBAkACwAuA -gQAAwABBAkADAAuAkwATgBvACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAATm8gUm -lnaHRzIFJlc2VydmVkLgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAUgBlAGcAdQBsAGEAcgAAUmV -ndWxhcgAAMQAuADEAMAAyADsAVQBLAFcATgA7AEEAaQBsAGUAcgBvAG4ALQBSAGUAZwB1AGwAYQBy -AAAxLjEwMjtVS1dOO0FpbGVyb24tUmVndWxhcgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAVgBlA -HIAcwBpAG8AbgAgADEALgAxADAAMgA7AFAAUwAgADAAMAAxAC4AMQAwADIAOwBoAG8AdABjAG8Abg -B2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADk -AAFZlcnNpb24gMS4xMDI7UFMgMDAxLjEwMjtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41 -ODMyOQAAQQBpAGwAZQByAG8AbgAtAFIAZQBnAHUAbABhAHIAAEFpbGVyb24tUmVndWxhcgAAUwBvA -HIAYQAgAFMAYQBnAGEAbgBvAABTb3JhIFNhZ2FubwAAUwBvAHIAYQAgAFMAYQBnAGEAbgBvAABTb3 -JhIFNhZ2FubwAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBsAG8AbgAuAG4AZQB0AAB -odHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBs -AG8AbgAuAG4AZQB0AABodHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAAAACAAAAAAAA/4MAMgAAAAAAA -AAAAAAAAAAAAAAAAAAAAHQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATAB -QAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAA -xADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0A -TgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAIsAqQCDAJMAjQDDAKoAtgC3A -LQAtQCrAL4AvwC8AIwAwADBAAAAAAAB//8AAgABAAAADAAAABwAAAACAAIAAwBxAAEAcgBzAAIABA -AAAAIAAAABAAAACgBMAGYAAkRGTFQADmxhdG4AGgAEAAAAAP//AAEAAAAWAANDQVQgAB5NT0wgABZ -ST00gABYAAP//AAEAAAAA//8AAgAAAAEAAmxpZ2EADmxvY2wAFAAAAAEAAQAAAAEAAAACAAYAEAAG -AAAAAgASADQABAAAAAEATAADAAAAAgAQABYAAQAcAAAAAQABAE8AAQABAGcAAQABAE8AAwAAAAIAE -AAWAAEAHAAAAAEAAQAvAAEAAQBnAAEAAQAvAAEAGgABAAgAAgAGAAwAcwACAE8AcgACAEwAAQABAE -kAAAABAAAACgBGAGAAAkRGTFQADmxhdG4AHAAEAAAAAP//AAIAAAABABYAA0NBVCAAFk1PTCAAFlJ -PTSAAFgAA//8AAgAAAAEAAmNwc3AADmtlcm4AFAAAAAEAAAAAAAEAAQACAAYADgABAAAAAQASAAIA -AAACAB4ANgABAAoABQAFAAoAAgABACQAPQAAAAEAEgAEAAAAAQAMAAEAOP/nAAEAAQAkAAIGigAEA -AAFJAXKABoAGQAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAD/sv+4/+z/7v/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAD/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9T/6AAAAAD/8QAA -ABD/vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAA//MAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAP/5AAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAD/4AAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//L/9AAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAA/+gAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/zAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/mAAAAAAAAAAAAAAAAAAD -/4gAA//AAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAP/OAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zv/qAAAAAP/0AAAACAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/ZAAD/egAA/1kAAAAA/5D/rgAAAAAAAAAAAA -AAAAAAAAAAAAAAAAD/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAD/8AAA/7b/8P+wAAD/8P/E/98AAAAA/8P/+P/0//oAAAAAAAAAAAAA//gA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/w//C/9MAAP/SAAD/9wAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yAAA/+kAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9wAAAAD//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAP/cAAAAAAAAAAAAAAAA/7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAkAFAAEAAAAAQACwAAABcA -BgAAAAAAAAAIAA4AAAAAAAsAEgAAAAAAAAATABkAAwANAAAAAQAJAAAAAAAAAAAAAAAAAAAAGAAAA -AAABwAAAAAAAAAAAAAAFQAFAAAAAAAYABgAAAAUAAAACgAAAAwAAgAPABEAFgAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAEAEQBdAAYAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAABwAAAAAACAAAAAAAAAAAAAcAAAAHAAAAEwAJ -ABUADgAPAAAACwAQAAAAAAAAAAAAAAAAAAUAGAACAAIAAgAAAAIAGAAXAAAAGAAAABYAFgACABYAA -gAWAAAAEQADAAoAFAAMAA0ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAEgAGAAEAHgAkAC -YAJwApACoALQAuAC8AMgAzADcAOAA5ADoAPAA9AEUASABOAE8AUgBTAFUAVwBZAFoAWwBcAF0AcwA -AAAAAAQAAAADa3tfFAAAAANAan9kAAAAA4QodoQ== -""" - ) - ), - 10 if size is None else size, - layout_engine=Layout.BASIC, - ) - return load_default_imagefont() diff --git a/.venv/Lib/site-packages/PIL/ImageGrab.py b/.venv/Lib/site-packages/PIL/ImageGrab.py deleted file mode 100644 index e27ca7e..0000000 --- a/.venv/Lib/site-packages/PIL/ImageGrab.py +++ /dev/null @@ -1,194 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# screen grabber -# -# 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 __future__ import annotations - -import io -import os -import shutil -import subprocess -import sys -import tempfile - -from . import Image - - -def grab( - bbox: tuple[int, int, int, int] | None = None, - include_layered_windows: bool = False, - all_screens: bool = False, - xdisplay: str | None = None, -) -> Image.Image: - im: Image.Image - if xdisplay is None: - if sys.platform == "darwin": - fh, filepath = tempfile.mkstemp(".png") - os.close(fh) - args = ["screencapture"] - if bbox: - left, top, right, bottom = bbox - args += ["-R", f"{left},{top},{right-left},{bottom-top}"] - subprocess.call(args + ["-x", filepath]) - im = Image.open(filepath) - im.load() - os.unlink(filepath) - if bbox: - im_resized = im.resize((right - left, bottom - top)) - im.close() - return im_resized - return im - elif sys.platform == "win32": - offset, size, data = Image.core.grabscreen_win32( - include_layered_windows, all_screens - ) - 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: - x0, y0 = offset - left, top, right, bottom = bbox - im = im.crop((left - x0, top - y0, right - x0, bottom - y0)) - return im - # Cast to Optional[str] needed for Windows and macOS. - display_name: str | None = xdisplay - try: - if not Image.core.HAVE_XCB: - msg = "Pillow was built without XCB support" - raise OSError(msg) - size, data = Image.core.grabscreen_x11(display_name) - except OSError: - if ( - display_name is None - and sys.platform not in ("darwin", "win32") - and shutil.which("gnome-screenshot") - ): - fh, filepath = tempfile.mkstemp(".png") - os.close(fh) - subprocess.call(["gnome-screenshot", "-f", filepath]) - im = Image.open(filepath) - im.load() - os.unlink(filepath) - if bbox: - im_cropped = im.crop(bbox) - im.close() - return im_cropped - return im - else: - raise - else: - im = Image.frombytes("RGB", size, data, "raw", "BGRX", size[0] * 4, 1) - if bbox: - im = im.crop(bbox) - return im - - -def grabclipboard() -> Image.Image | list[str] | None: - if sys.platform == "darwin": - fh, filepath = tempfile.mkstemp(".png") - os.close(fh) - commands = [ - 'set theFile to (open for access POSIX file "' - + filepath - + '" with write permission)', - "try", - " write (the clipboard as «class PNGf») 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 - elif sys.platform == "win32": - fmt, data = Image.core.grabclipboard_win32() - if fmt == "file": # CF_HDROP - import struct - - o = struct.unpack_from("I", data)[0] - if data[16] != 0: - files = data[o:].decode("utf-16le").split("\0") - else: - files = data[o:].decode("mbcs").split("\0") - return files[: files.index("")] - if isinstance(data, bytes): - data = io.BytesIO(data) - if fmt == "png": - from . import PngImagePlugin - - return PngImagePlugin.PngImageFile(data) - elif fmt == "DIB": - from . import BmpImagePlugin - - return BmpImagePlugin.DibImageFile(data) - return None - else: - if os.getenv("WAYLAND_DISPLAY"): - session_type = "wayland" - elif os.getenv("DISPLAY"): - session_type = "x11" - else: # Session type check failed - session_type = None - - if shutil.which("wl-paste") and session_type in ("wayland", None): - args = ["wl-paste", "-t", "image"] - elif shutil.which("xclip") and session_type in ("x11", None): - args = ["xclip", "-selection", "clipboard", "-t", "image/png", "-o"] - else: - msg = "wl-paste or xclip is required for ImageGrab.grabclipboard() on Linux" - raise NotImplementedError(msg) - - p = subprocess.run(args, capture_output=True) - if p.returncode != 0: - err = p.stderr - for silent_error in [ - # wl-paste, when the clipboard is empty - b"Nothing is copied", - # Ubuntu/Debian wl-paste, when the clipboard is empty - b"No selection", - # Ubuntu/Debian wl-paste, when an image isn't available - b"No suitable type of content copied", - # wl-paste or Ubuntu/Debian xclip, when an image isn't available - b" not available", - # xclip, when an image isn't available - b"cannot convert ", - # xclip, when the clipboard isn't initialized - b"xclip: Error: There is no owner for the ", - ]: - if silent_error in err: - return None - msg = f"{args[0]} error" - if err: - msg += f": {err.strip().decode()}" - raise ChildProcessError(msg) - - data = io.BytesIO(p.stdout) - im = Image.open(data) - im.load() - return im diff --git a/.venv/Lib/site-packages/PIL/ImageMath.py b/.venv/Lib/site-packages/PIL/ImageMath.py deleted file mode 100644 index 6664434..0000000 --- a/.venv/Lib/site-packages/PIL/ImageMath.py +++ /dev/null @@ -1,357 +0,0 @@ -# -# 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 __future__ import annotations - -import builtins -from types import CodeType -from typing import Any, Callable - -from . import Image, _imagingmath -from ._deprecate import deprecate - - -class _Operand: - """Wraps an image operand, providing standard operators""" - - def __init__(self, im: Image.Image): - self.im = im - - def __fixup(self, im1: _Operand | float) -> Image.Image: - # 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: - msg = f"unsupported mode: {im1.im.mode}" - raise ValueError(msg) - else: - # argument was a constant - if isinstance(im1, (int, float)) 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: str, - im1: _Operand | float, - im2: _Operand | float | None = None, - mode: str | None = None, - ) -> _Operand: - im_1 = self.__fixup(im1) - if im2 is None: - # unary operation - out = Image.new(mode or im_1.mode, im_1.size, None) - im_1.load() - try: - op = getattr(_imagingmath, f"{op}_{im_1.mode}") - except AttributeError as e: - msg = f"bad operand type for '{op}'" - raise TypeError(msg) from e - _imagingmath.unop(op, out.im.id, im_1.im.id) - else: - # binary operation - im_2 = self.__fixup(im2) - if im_1.mode != im_2.mode: - # convert both arguments to floating point - if im_1.mode != "F": - im_1 = im_1.convert("F") - if im_2.mode != "F": - im_2 = im_2.convert("F") - if im_1.size != im_2.size: - # crop both arguments to a common size - size = ( - min(im_1.size[0], im_2.size[0]), - min(im_1.size[1], im_2.size[1]), - ) - if im_1.size != size: - im_1 = im_1.crop((0, 0) + size) - if im_2.size != size: - im_2 = im_2.crop((0, 0) + size) - out = Image.new(mode or im_1.mode, im_1.size, None) - im_1.load() - im_2.load() - try: - op = getattr(_imagingmath, f"{op}_{im_1.mode}") - except AttributeError as e: - msg = f"bad operand type for '{op}'" - raise TypeError(msg) from e - _imagingmath.binop(op, out.im.id, im_1.im.id, im_2.im.id) - return _Operand(out) - - # unary operators - def __bool__(self) -> bool: - # an image is "true" if it contains at least one non-zero pixel - return self.im.getbbox() is not None - - def __abs__(self) -> _Operand: - return self.apply("abs", self) - - def __pos__(self) -> _Operand: - return self - - def __neg__(self) -> _Operand: - return self.apply("neg", self) - - # binary operators - def __add__(self, other: _Operand | float) -> _Operand: - return self.apply("add", self, other) - - def __radd__(self, other: _Operand | float) -> _Operand: - return self.apply("add", other, self) - - def __sub__(self, other: _Operand | float) -> _Operand: - return self.apply("sub", self, other) - - def __rsub__(self, other: _Operand | float) -> _Operand: - return self.apply("sub", other, self) - - def __mul__(self, other: _Operand | float) -> _Operand: - return self.apply("mul", self, other) - - def __rmul__(self, other: _Operand | float) -> _Operand: - return self.apply("mul", other, self) - - def __truediv__(self, other: _Operand | float) -> _Operand: - return self.apply("div", self, other) - - def __rtruediv__(self, other: _Operand | float) -> _Operand: - return self.apply("div", other, self) - - def __mod__(self, other: _Operand | float) -> _Operand: - return self.apply("mod", self, other) - - def __rmod__(self, other: _Operand | float) -> _Operand: - return self.apply("mod", other, self) - - def __pow__(self, other: _Operand | float) -> _Operand: - return self.apply("pow", self, other) - - def __rpow__(self, other: _Operand | float) -> _Operand: - return self.apply("pow", other, self) - - # bitwise - def __invert__(self) -> _Operand: - return self.apply("invert", self) - - def __and__(self, other: _Operand | float) -> _Operand: - return self.apply("and", self, other) - - def __rand__(self, other: _Operand | float) -> _Operand: - return self.apply("and", other, self) - - def __or__(self, other: _Operand | float) -> _Operand: - return self.apply("or", self, other) - - def __ror__(self, other: _Operand | float) -> _Operand: - return self.apply("or", other, self) - - def __xor__(self, other: _Operand | float) -> _Operand: - return self.apply("xor", self, other) - - def __rxor__(self, other: _Operand | float) -> _Operand: - return self.apply("xor", other, self) - - def __lshift__(self, other: _Operand | float) -> _Operand: - return self.apply("lshift", self, other) - - def __rshift__(self, other: _Operand | float) -> _Operand: - 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: _Operand | float) -> _Operand: - return self.apply("lt", self, other) - - def __le__(self, other: _Operand | float) -> _Operand: - return self.apply("le", self, other) - - def __gt__(self, other: _Operand | float) -> _Operand: - return self.apply("gt", self, other) - - def __ge__(self, other: _Operand | float) -> _Operand: - return self.apply("ge", self, other) - - -# conversions -def imagemath_int(self: _Operand) -> _Operand: - return _Operand(self.im.convert("I")) - - -def imagemath_float(self: _Operand) -> _Operand: - return _Operand(self.im.convert("F")) - - -# logical -def imagemath_equal(self: _Operand, other: _Operand | float | None) -> _Operand: - return self.apply("eq", self, other, mode="I") - - -def imagemath_notequal(self: _Operand, other: _Operand | float | None) -> _Operand: - return self.apply("ne", self, other, mode="I") - - -def imagemath_min(self: _Operand, other: _Operand | float | None) -> _Operand: - return self.apply("min", self, other) - - -def imagemath_max(self: _Operand, other: _Operand | float | None) -> _Operand: - return self.apply("max", self, other) - - -def imagemath_convert(self: _Operand, mode: str) -> _Operand: - return _Operand(self.im.convert(mode)) - - -ops = { - "int": imagemath_int, - "float": imagemath_float, - "equal": imagemath_equal, - "notequal": imagemath_notequal, - "min": imagemath_min, - "max": imagemath_max, - "convert": imagemath_convert, -} - - -def lambda_eval( - expression: Callable[[dict[str, Any]], Any], - options: dict[str, Any] = {}, - **kw: Any, -) -> Any: - """ - Returns the result of an image function. - - :py:mod:`~PIL.ImageMath` only supports single-layer images. To process multi-band - images, use the :py:meth:`~PIL.Image.Image.split` method or - :py:func:`~PIL.Image.merge` function. - - :param expression: A function that receives a dictionary. - :param options: Values to add to the function's dictionary. You - can either use a dictionary, or one or more keyword - arguments. - :return: The expression result. This is usually an image object, but can - also be an integer, a floating point value, or a pixel tuple, - depending on the expression. - """ - - args: dict[str, Any] = ops.copy() - args.update(options) - args.update(kw) - for k, v in args.items(): - if hasattr(v, "im"): - args[k] = _Operand(v) - - out = expression(args) - try: - return out.im - except AttributeError: - return out - - -def unsafe_eval( - expression: str, - options: dict[str, Any] = {}, - **kw: Any, -) -> Any: - """ - Evaluates an image expression. This uses Python's ``eval()`` function to process - the expression string, and carries the security risks of doing so. It is not - recommended to process expressions without considering this. - :py:meth:`~lambda_eval` is a more secure alternative. - - :py:mod:`~PIL.ImageMath` only supports single-layer images. To process multi-band - images, use the :py:meth:`~PIL.Image.Image.split` method or - :py:func:`~PIL.Image.merge` function. - - :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: dict[str, Any] = ops.copy() - for k in list(options.keys()) + list(kw.keys()): - if "__" in k or hasattr(builtins, k): - msg = f"'{k}' not allowed" - raise ValueError(msg) - - args.update(options) - args.update(kw) - for k, v in args.items(): - if hasattr(v, "im"): - args[k] = _Operand(v) - - compiled_code = compile(expression, "", "eval") - - def scan(code: CodeType) -> None: - for const in code.co_consts: - if type(const) is type(compiled_code): - scan(const) - - for name in code.co_names: - if name not in args and name != "abs": - msg = f"'{name}' not allowed" - raise ValueError(msg) - - scan(compiled_code) - out = builtins.eval(expression, {"__builtins": {"abs": abs}}, args) - try: - return out.im - except AttributeError: - return out - - -def eval( - expression: str, - _dict: dict[str, Any] = {}, - **kw: Any, -) -> Any: - """ - Evaluates an image expression. - - Deprecated. Use lambda_eval() or unsafe_eval() instead. - - :param expression: A string containing a Python-style expression. - :param _dict: 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. - - .. deprecated:: 10.3.0 - """ - - deprecate( - "ImageMath.eval", - 12, - "ImageMath.lambda_eval or ImageMath.unsafe_eval", - ) - return unsafe_eval(expression, _dict, **kw) diff --git a/.venv/Lib/site-packages/PIL/ImageMode.py b/.venv/Lib/site-packages/PIL/ImageMode.py deleted file mode 100644 index 92a08d2..0000000 --- a/.venv/Lib/site-packages/PIL/ImageMode.py +++ /dev/null @@ -1,92 +0,0 @@ -# -# 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. -# -from __future__ import annotations - -import sys -from functools import lru_cache -from typing import NamedTuple - -from ._deprecate import deprecate - - -class ModeDescriptor(NamedTuple): - """Wrapper for mode strings.""" - - mode: str - bands: tuple[str, ...] - basemode: str - basetype: str - typestr: str - - def __str__(self) -> str: - return self.mode - - -@lru_cache -def getmode(mode: str) -> ModeDescriptor: - """Gets a mode descriptor for the given mode.""" - endian = "<" if sys.byteorder == "little" else ">" - - modes = { - # core modes - # Bits need to be extended to bytes - "1": ("L", "L", ("1",), "|b1"), - "L": ("L", "L", ("L",), "|u1"), - "I": ("L", "I", ("I",), f"{endian}i4"), - "F": ("L", "F", ("F",), f"{endian}f4"), - "P": ("P", "L", ("P",), "|u1"), - "RGB": ("RGB", "L", ("R", "G", "B"), "|u1"), - "RGBX": ("RGB", "L", ("R", "G", "B", "X"), "|u1"), - "RGBA": ("RGB", "L", ("R", "G", "B", "A"), "|u1"), - "CMYK": ("RGB", "L", ("C", "M", "Y", "K"), "|u1"), - "YCbCr": ("RGB", "L", ("Y", "Cb", "Cr"), "|u1"), - # UNDONE - unsigned |u1i1i1 - "LAB": ("RGB", "L", ("L", "A", "B"), "|u1"), - "HSV": ("RGB", "L", ("H", "S", "V"), "|u1"), - # extra experimental modes - "RGBa": ("RGB", "L", ("R", "G", "B", "a"), "|u1"), - "BGR;15": ("RGB", "L", ("B", "G", "R"), "|u1"), - "BGR;16": ("RGB", "L", ("B", "G", "R"), "|u1"), - "BGR;24": ("RGB", "L", ("B", "G", "R"), "|u1"), - "LA": ("L", "L", ("L", "A"), "|u1"), - "La": ("L", "L", ("L", "a"), "|u1"), - "PA": ("RGB", "L", ("P", "A"), "|u1"), - } - if mode in modes: - if mode in ("BGR;15", "BGR;16", "BGR;24"): - deprecate(mode, 12) - base_mode, base_type, bands, type_str = modes[mode] - return ModeDescriptor(mode, bands, base_mode, base_type, type_str) - - mapping_modes = { - # I;16 == I;16L, and I;32 == I;32L - "I;16": "u2", - "I;16BS": ">i2", - "I;16N": f"{endian}u2", - "I;16NS": f"{endian}i2", - "I;32": "u4", - "I;32L": "i4", - "I;32LS": " -from __future__ import annotations - -import re - -from . import Image, _imagingmorph - -LUT_SIZE = 1 << 9 - -# fmt: off -ROTATION_MATRIX = [ - 6, 3, 0, - 7, 4, 1, - 8, 5, 2, -] -MIRROR_MATRIX = [ - 2, 1, 0, - 5, 4, 3, - 8, 7, 6, -] -# fmt: on - - -class LutBuilder: - """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: list[str] | None = None, op_name: str | None = None - ) -> None: - if patterns is not None: - self.patterns = patterns - else: - self.patterns = [] - self.lut: bytearray | None = 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: - msg = f"Unknown pattern {op_name}!" - raise Exception(msg) - - self.patterns = known_patterns[op_name] - - def add_patterns(self, patterns: list[str]) -> None: - self.patterns += patterns - - def build_default_lut(self) -> None: - 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) -> bytearray | None: - return self.lut - - def _string_permute(self, pattern: str, permutation: list[int]) -> str: - """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: str, options: str, basic_result: int - ) -> list[tuple[str, int]]: - """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], ROTATION_MATRIX), res) - ) - # mirror - if "M" in options: - n = len(patterns) - for pattern, res in patterns[:n]: - patterns.append((self._string_permute(pattern, MIRROR_MATRIX), res)) - - # negate - if "N" in options: - n = len(patterns) - for pattern, res in patterns[: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) -> bytearray: - """Compile all patterns into a morphology lut. - - TBD :Build based on (file) morphlut:modify_lut - """ - self.build_default_lut() - assert self.lut is not None - 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: - msg = 'Syntax error in pattern "' + p + '"' - raise Exception(msg) - 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) - - # compile the patterns into regular expressions for speed - compiled_patterns = [] - for pattern in patterns: - p = pattern[0].replace(".", "X").replace("X", "[01]") - compiled_patterns.append((re.compile(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 pattern, r in compiled_patterns: - if pattern.match(bitpattern): - self.lut[i] = [0, 1][r] - - return self.lut - - -class MorphOp: - """A class for binary morphological operators""" - - def __init__( - self, - lut: bytearray | None = None, - op_name: str | None = None, - patterns: list[str] | None = None, - ) -> 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: Image.Image) -> tuple[int, Image.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: - msg = "No operator loaded" - raise Exception(msg) - - if image.mode != "L": - msg = "Image mode must be L" - raise ValueError(msg) - 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: Image.Image) -> list[tuple[int, int]]: - """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. See :ref:`coordinate-system`.""" - if self.lut is None: - msg = "No operator loaded" - raise Exception(msg) - - if image.mode != "L": - msg = "Image mode must be L" - raise ValueError(msg) - return _imagingmorph.match(bytes(self.lut), image.im.id) - - def get_on_pixels(self, image: Image.Image) -> list[tuple[int, int]]: - """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. See :ref:`coordinate-system`.""" - - if image.mode != "L": - msg = "Image mode must be L" - raise ValueError(msg) - return _imagingmorph.get_on_pixels(image.im.id) - - def load_lut(self, filename: str) -> None: - """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 - msg = "Wrong size operator file!" - raise Exception(msg) - - def save_lut(self, filename: str) -> None: - """Save an operator to an mrl file""" - if self.lut is None: - msg = "No operator loaded" - raise Exception(msg) - with open(filename, "wb") as f: - f.write(self.lut) - - def set_lut(self, lut: bytearray | None) -> None: - """Set the lut from an external source""" - self.lut = lut diff --git a/.venv/Lib/site-packages/PIL/ImageOps.py b/.venv/Lib/site-packages/PIL/ImageOps.py deleted file mode 100644 index a84c083..0000000 --- a/.venv/Lib/site-packages/PIL/ImageOps.py +++ /dev/null @@ -1,728 +0,0 @@ -# -# 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 __future__ import annotations - -import functools -import operator -import re -from typing import Protocol, Sequence, cast - -from . import ExifTags, Image, ImagePalette - -# -# helpers - - -def _border(border: int | tuple[int, ...]) -> tuple[int, int, int, int]: - 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: str | int | tuple[int, ...], mode: str) -> int | tuple[int, ...]: - if isinstance(color, str): - from . import ImageColor - - color = ImageColor.getcolor(color, mode) - return color - - -def _lut(image: Image.Image, lut: list[int]) -> Image.Image: - if image.mode == "P": - # FIXME: apply to lookup table, not image data - msg = "mode P support coming soon" - raise NotImplementedError(msg) - elif image.mode in ("L", "RGB"): - if image.mode == "RGB" and len(lut) == 256: - lut = lut + lut + lut - return image.point(lut) - else: - msg = f"not supported for mode {image.mode}" - raise OSError(msg) - - -# -# actions - - -def autocontrast( - image: Image.Image, - cutoff: float | tuple[float, float] = 0, - ignore: int | Sequence[int] | None = None, - mask: Image.Image | None = None, - preserve_tone: bool = False, -) -> Image.Image: - """ - Maximize (normalize) image contrast. This function calculates a - histogram of the input image (or mask region), 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: The percent to cut off from the histogram on the low and - high ends. Either a tuple of (low, high), or a single - number for both. - :param ignore: The background pixel value (use None for no background). - :param mask: Histogram used in contrast operation is computed using pixels - within the mask. If no mask is given the entire image is used - for histogram computation. - :param preserve_tone: Preserve image tone in Photoshop-like style autocontrast. - - .. versionadded:: 8.2.0 - - :return: An image. - """ - if preserve_tone: - histogram = image.convert("L").histogram(mask) - else: - histogram = image.histogram(mask) - - lut = [] - for layer in range(0, len(histogram), 256): - h = histogram[layer : layer + 256] - if ignore is not None: - # get rid of outliers - if isinstance(ignore, int): - h[ignore] = 0 - else: - for ix in ignore: - h[ix] = 0 - if cutoff: - # cut off pixels from both ends of the histogram - if not isinstance(cutoff, tuple): - cutoff = (cutoff, cutoff) - # get number of pixels - n = 0 - for ix in range(256): - n = n + h[ix] - # remove cutoff% pixels from the low end - cut = int(n * cutoff[0] // 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 high end - cut = int(n * cutoff[1] // 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: Image.Image, - black: str | tuple[int, ...], - white: str | tuple[int, ...], - mid: str | int | tuple[int, ...] | None = None, - blackpoint: int = 0, - whitepoint: int = 255, - midpoint: int = 127, -) -> Image.Image: - """ - Colorize grayscale image. - This function calculates a color wedge which maps all black pixels in - the source image to the first color and all white pixels to the - second color. If ``mid`` is specified, it uses three-color mapping. - The ``black`` and ``white`` arguments should be RGB tuples or color names; - optionally you can use three-color mapping by also specifying ``mid``. - Mapping positions for any of the colors can be specified - (e.g. ``blackpoint``), where these parameters are the integer - value corresponding to where the corresponding color should be mapped. - These parameters must have logical order, such that - ``blackpoint <= midpoint <= whitepoint`` (if ``mid`` is specified). - - :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. - :param mid: The color to use for midtone input pixels. - :param blackpoint: an int value [0, 255] for the black mapping. - :param whitepoint: an int value [0, 255] for the white mapping. - :param midpoint: an int value [0, 255] for the midtone mapping. - :return: An image. - """ - - # Initial asserts - assert image.mode == "L" - if mid is None: - assert 0 <= blackpoint <= whitepoint <= 255 - else: - assert 0 <= blackpoint <= midpoint <= whitepoint <= 255 - - # Define colors from arguments - rgb_black = cast(Sequence[int], _color(black, "RGB")) - rgb_white = cast(Sequence[int], _color(white, "RGB")) - rgb_mid = cast(Sequence[int], _color(mid, "RGB")) if mid is not None else None - - # Empty lists for the mapping - red = [] - green = [] - blue = [] - - # Create the low-end values - for i in range(0, blackpoint): - red.append(rgb_black[0]) - green.append(rgb_black[1]) - blue.append(rgb_black[2]) - - # Create the mapping (2-color) - if rgb_mid is None: - range_map = range(0, whitepoint - blackpoint) - - for i in range_map: - red.append( - rgb_black[0] + i * (rgb_white[0] - rgb_black[0]) // len(range_map) - ) - green.append( - rgb_black[1] + i * (rgb_white[1] - rgb_black[1]) // len(range_map) - ) - blue.append( - rgb_black[2] + i * (rgb_white[2] - rgb_black[2]) // len(range_map) - ) - - # Create the mapping (3-color) - else: - range_map1 = range(0, midpoint - blackpoint) - range_map2 = range(0, whitepoint - midpoint) - - for i in range_map1: - red.append( - rgb_black[0] + i * (rgb_mid[0] - rgb_black[0]) // len(range_map1) - ) - green.append( - rgb_black[1] + i * (rgb_mid[1] - rgb_black[1]) // len(range_map1) - ) - blue.append( - rgb_black[2] + i * (rgb_mid[2] - rgb_black[2]) // len(range_map1) - ) - for i in range_map2: - red.append(rgb_mid[0] + i * (rgb_white[0] - rgb_mid[0]) // len(range_map2)) - green.append( - rgb_mid[1] + i * (rgb_white[1] - rgb_mid[1]) // len(range_map2) - ) - blue.append(rgb_mid[2] + i * (rgb_white[2] - rgb_mid[2]) // len(range_map2)) - - # Create the high-end values - for i in range(0, 256 - whitepoint): - red.append(rgb_white[0]) - green.append(rgb_white[1]) - blue.append(rgb_white[2]) - - # Return converted image - image = image.convert("RGB") - return _lut(image, red + green + blue) - - -def contain( - image: Image.Image, size: tuple[int, int], method: int = Image.Resampling.BICUBIC -) -> Image.Image: - """ - Returns a resized version of the image, set to the maximum width and height - within the requested size, while maintaining the original aspect ratio. - - :param image: The image to resize. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :return: An image. - """ - - im_ratio = image.width / image.height - dest_ratio = size[0] / size[1] - - if im_ratio != dest_ratio: - if im_ratio > dest_ratio: - new_height = round(image.height / image.width * size[0]) - if new_height != size[1]: - size = (size[0], new_height) - else: - new_width = round(image.width / image.height * size[1]) - if new_width != size[0]: - size = (new_width, size[1]) - return image.resize(size, resample=method) - - -def cover( - image: Image.Image, size: tuple[int, int], method: int = Image.Resampling.BICUBIC -) -> Image.Image: - """ - Returns a resized version of the image, so that the requested size is - covered, while maintaining the original aspect ratio. - - :param image: The image to resize. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :return: An image. - """ - - im_ratio = image.width / image.height - dest_ratio = size[0] / size[1] - - if im_ratio != dest_ratio: - if im_ratio < dest_ratio: - new_height = round(image.height / image.width * size[0]) - if new_height != size[1]: - size = (size[0], new_height) - else: - new_width = round(image.width / image.height * size[1]) - if new_width != size[0]: - size = (new_width, size[1]) - return image.resize(size, resample=method) - - -def pad( - image: Image.Image, - size: tuple[int, int], - method: int = Image.Resampling.BICUBIC, - color: str | int | tuple[int, ...] | None = None, - centering: tuple[float, float] = (0.5, 0.5), -) -> Image.Image: - """ - Returns a resized and padded version of the image, expanded to fill the - requested aspect ratio and size. - - :param image: The image to resize and crop. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :param color: The background color of the padded image. - :param centering: Control the position of the original image within the - padded version. - - (0.5, 0.5) will keep the image centered - (0, 0) will keep the image aligned to the top left - (1, 1) will keep the image aligned to the bottom - right - :return: An image. - """ - - resized = contain(image, size, method) - if resized.size == size: - out = resized - else: - out = Image.new(image.mode, size, color) - if resized.palette: - out.putpalette(resized.getpalette()) - if resized.width != size[0]: - x = round((size[0] - resized.width) * max(0, min(centering[0], 1))) - out.paste(resized, (x, 0)) - else: - y = round((size[1] - resized.height) * max(0, min(centering[1], 1))) - out.paste(resized, (0, y)) - return out - - -def crop(image: Image.Image, border: int = 0) -> Image.Image: - """ - 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: Image.Image, factor: float, resample: int = Image.Resampling.BICUBIC -) -> Image.Image: - """ - 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: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :returns: An :py:class:`~PIL.Image.Image` object. - """ - if factor == 1: - return image.copy() - elif factor <= 0: - msg = "the factor must be greater than 0" - raise ValueError(msg) - else: - size = (round(factor * image.width), round(factor * image.height)) - return image.resize(size, resample) - - -class SupportsGetMesh(Protocol): - """ - An object that supports the ``getmesh`` method, taking an image as an - argument, and returning a list of tuples. Each tuple contains two tuples, - the source box as a tuple of 4 integers, and a tuple of 8 integers for the - final quadrilateral, in order of top left, bottom left, bottom right, top - right. - """ - - def getmesh( - self, image: Image.Image - ) -> list[ - tuple[tuple[int, int, int, int], tuple[int, int, int, int, int, int, int, int]] - ]: ... - - -def deform( - image: Image.Image, - deformer: SupportsGetMesh, - resample: int = Image.Resampling.BILINEAR, -) -> Image.Image: - """ - 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.Transform.MESH, deformer.getmesh(image), resample - ) - - -def equalize(image: Image.Image, mask: Image.Image | None = None) -> Image.Image: - """ - 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: Image.Image, - border: int | tuple[int, ...] = 0, - fill: str | int | tuple[int, ...] = 0, -) -> Image.Image: - """ - 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 - color = _color(fill, image.mode) - if image.palette: - palette = ImagePalette.ImagePalette(palette=image.getpalette()) - if isinstance(color, tuple) and (len(color) == 3 or len(color) == 4): - color = palette.getcolor(color) - else: - palette = None - out = Image.new(image.mode, (width, height), color) - if palette: - out.putpalette(palette.palette) - out.paste(image, (left, top)) - return out - - -def fit( - image: Image.Image, - size: tuple[int, int], - method: int = Image.Resampling.BICUBIC, - bleed: float = 0.0, - centering: tuple[float, float] = (0.5, 0.5), -) -> Image.Image: - """ - Returns a resized 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 resize and crop. - :param size: The requested output size in pixels, given as a - (width, height) tuple. - :param method: Resampling method to use. Default is - :py:attr:`~PIL.Image.Resampling.BICUBIC`. - See :ref:`concept-filters`. - :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). - Cannot be greater than or equal to 0.5. - :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 - # https://www.cazabon.com - - centering_x, centering_y = centering - - if not 0.0 <= centering_x <= 1.0: - centering_x = 0.5 - if not 0.0 <= centering_y <= 1.0: - centering_y = 0.5 - - if not 0.0 <= bleed < 0.5: - 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 - bleed_pixels = (bleed * image.size[0], bleed * image.size[1]) - - live_size = ( - image.size[0] - bleed_pixels[0] * 2, - image.size[1] - bleed_pixels[1] * 2, - ) - - # calculate the aspect ratio of the live_size - live_size_ratio = live_size[0] / live_size[1] - - # calculate the aspect ratio of the output image - output_ratio = size[0] / size[1] - - # figure out if the sides or top/bottom will be cropped off - if live_size_ratio == output_ratio: - # live_size is already the needed ratio - crop_width = live_size[0] - crop_height = live_size[1] - elif live_size_ratio >= output_ratio: - # live_size is wider than what's needed, crop the sides - crop_width = output_ratio * live_size[1] - crop_height = live_size[1] - else: - # live_size is taller than what's needed, crop the top and bottom - crop_width = live_size[0] - crop_height = live_size[0] / output_ratio - - # make the crop - crop_left = bleed_pixels[0] + (live_size[0] - crop_width) * centering_x - crop_top = bleed_pixels[1] + (live_size[1] - crop_height) * centering_y - - crop = (crop_left, crop_top, crop_left + crop_width, crop_top + crop_height) - - # resize the image and return it - return image.resize(size, method, box=crop) - - -def flip(image: Image.Image) -> Image.Image: - """ - Flip the image vertically (top to bottom). - - :param image: The image to flip. - :return: An image. - """ - return image.transpose(Image.Transpose.FLIP_TOP_BOTTOM) - - -def grayscale(image: Image.Image) -> Image.Image: - """ - Convert the image to grayscale. - - :param image: The image to convert. - :return: An image. - """ - return image.convert("L") - - -def invert(image: Image.Image) -> Image.Image: - """ - Invert (negate) the image. - - :param image: The image to invert. - :return: An image. - """ - lut = list(range(255, -1, -1)) - return image.point(lut) if image.mode == "1" else _lut(image, lut) - - -def mirror(image: Image.Image) -> Image.Image: - """ - Flip image horizontally (left to right). - - :param image: The image to mirror. - :return: An image. - """ - return image.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - - -def posterize(image: Image.Image, bits: int) -> Image.Image: - """ - 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. - """ - mask = ~(2 ** (8 - bits) - 1) - lut = [i & mask for i in range(256)] - return _lut(image, lut) - - -def solarize(image: Image.Image, threshold: int = 128) -> Image.Image: - """ - Invert all pixel values above a threshold. - - :param image: The image to solarize. - :param threshold: All pixels above this grayscale 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) - - -def exif_transpose(image: Image.Image, *, in_place: bool = False) -> Image.Image | None: - """ - If an image has an EXIF Orientation tag, other than 1, transpose the image - accordingly, and remove the orientation data. - - :param image: The image to transpose. - :param in_place: Boolean. Keyword-only argument. - If ``True``, the original image is modified in-place, and ``None`` is returned. - If ``False`` (default), a new :py:class:`~PIL.Image.Image` object is returned - with the transposition applied. If there is no transposition, a copy of the - image will be returned. - """ - image.load() - image_exif = image.getexif() - orientation = image_exif.get(ExifTags.Base.Orientation, 1) - method = { - 2: Image.Transpose.FLIP_LEFT_RIGHT, - 3: Image.Transpose.ROTATE_180, - 4: Image.Transpose.FLIP_TOP_BOTTOM, - 5: Image.Transpose.TRANSPOSE, - 6: Image.Transpose.ROTATE_270, - 7: Image.Transpose.TRANSVERSE, - 8: Image.Transpose.ROTATE_90, - }.get(orientation) - if method is not None: - transposed_image = image.transpose(method) - if in_place: - image.im = transposed_image.im - image.pyaccess = None - image._size = transposed_image._size - exif_image = image if in_place else transposed_image - - exif = exif_image.getexif() - if ExifTags.Base.Orientation in exif: - del exif[ExifTags.Base.Orientation] - if "exif" in exif_image.info: - exif_image.info["exif"] = exif.tobytes() - elif "Raw profile type exif" in exif_image.info: - exif_image.info["Raw profile type exif"] = exif.tobytes().hex() - for key in ("XML:com.adobe.xmp", "xmp"): - if key in exif_image.info: - for pattern in ( - r'tiff:Orientation="([0-9])"', - r"([0-9])", - ): - value = exif_image.info[key] - exif_image.info[key] = ( - re.sub(pattern, "", value) - if isinstance(value, str) - else re.sub(pattern.encode(), b"", value) - ) - if not in_place: - return transposed_image - elif not in_place: - return image.copy() - return None diff --git a/.venv/Lib/site-packages/PIL/ImagePalette.py b/.venv/Lib/site-packages/PIL/ImagePalette.py deleted file mode 100644 index ed38285..0000000 --- a/.venv/Lib/site-packages/PIL/ImagePalette.py +++ /dev/null @@ -1,284 +0,0 @@ -# -# 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. -# -from __future__ import annotations - -import array -from typing import IO, TYPE_CHECKING, Sequence - -from . import GimpGradientFile, GimpPaletteFile, ImageColor, PaletteFile - -if TYPE_CHECKING: - from . import Image - - -class ImagePalette: - """ - 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. The list must consist of - all channels for one color followed by the next color (e.g. RGBRGBRGB). - Defaults to an empty palette. - """ - - def __init__( - self, - mode: str = "RGB", - palette: Sequence[int] | bytes | bytearray | None = None, - ) -> None: - self.mode = mode - self.rawmode: str | None = None # if set, palette contains raw data - self.palette = palette or bytearray() - self.dirty: int | None = None - - @property - def palette(self) -> Sequence[int] | bytes | bytearray: - return self._palette - - @palette.setter - def palette(self, palette: Sequence[int] | bytes | bytearray) -> None: - self._colors: dict[tuple[int, ...], int] | None = None - self._palette = palette - - @property - def colors(self) -> dict[tuple[int, ...], int]: - if self._colors is None: - mode_len = len(self.mode) - self._colors = {} - for i in range(0, len(self.palette), mode_len): - color = tuple(self.palette[i : i + mode_len]) - if color in self._colors: - continue - self._colors[color] = i // mode_len - return self._colors - - @colors.setter - def colors(self, colors: dict[tuple[int, ...], int]) -> None: - self._colors = colors - - def copy(self) -> ImagePalette: - new = ImagePalette() - - new.mode = self.mode - new.rawmode = self.rawmode - if self.palette is not None: - new.palette = self.palette[:] - new.dirty = self.dirty - - return new - - def getdata(self) -> tuple[str, Sequence[int] | bytes | bytearray]: - """ - 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, self.tobytes() - - def tobytes(self) -> bytes: - """Convert palette to bytes. - - .. warning:: This method is experimental. - """ - if self.rawmode: - msg = "palette contains raw palette data" - raise ValueError(msg) - if isinstance(self.palette, bytes): - return self.palette - arr = array.array("B", self.palette) - return arr.tobytes() - - # Declare tostring as an alias for tobytes - tostring = tobytes - - def _new_color_index( - self, image: Image.Image | None = None, e: Exception | None = None - ) -> int: - if not isinstance(self.palette, bytearray): - self._palette = bytearray(self.palette) - index = len(self.palette) // 3 - special_colors: tuple[int | tuple[int, ...] | None, ...] = () - if image: - special_colors = ( - image.info.get("background"), - image.info.get("transparency"), - ) - while index in special_colors: - index += 1 - if index >= 256: - if image: - # Search for an unused index - for i, count in reversed(list(enumerate(image.histogram()))): - if count == 0 and i not in special_colors: - index = i - break - if index >= 256: - msg = "cannot allocate more than 256 colors" - raise ValueError(msg) from e - return index - - def getcolor( - self, - color: tuple[int, ...], - image: Image.Image | None = None, - ) -> int: - """Given an rgb tuple, allocate palette entry. - - .. warning:: This method is experimental. - """ - if self.rawmode: - msg = "palette contains raw palette data" - raise ValueError(msg) - if isinstance(color, tuple): - if self.mode == "RGB": - if len(color) == 4: - if color[3] != 255: - msg = "cannot add non-opaque RGBA color to RGB palette" - raise ValueError(msg) - color = color[:3] - elif self.mode == "RGBA": - if len(color) == 3: - color += (255,) - try: - return self.colors[color] - except KeyError as e: - # allocate new color slot - index = self._new_color_index(image, e) - assert isinstance(self._palette, bytearray) - self.colors[color] = index - if index * 3 < len(self.palette): - self._palette = ( - self._palette[: index * 3] - + bytes(color) - + self._palette[index * 3 + 3 :] - ) - else: - self._palette += bytes(color) - self.dirty = 1 - return index - else: - msg = f"unknown color specifier: {repr(color)}" # type: ignore[unreachable] - raise ValueError(msg) - - def save(self, fp: str | IO[str]) -> None: - """Save palette to text file. - - .. warning:: This method is experimental. - """ - if self.rawmode: - msg = "palette contains raw palette data" - raise ValueError(msg) - if isinstance(fp, str): - fp = open(fp, "w") - fp.write("# Palette\n") - fp.write(f"# Mode: {self.mode}\n") - for i in range(256): - fp.write(f"{i}") - for j in range(i * len(self.mode), (i + 1) * len(self.mode)): - try: - fp.write(f" {self.palette[j]}") - except IndexError: - fp.write(" 0") - fp.write("\n") - fp.close() - - -# -------------------------------------------------------------------- -# Internal - - -def raw(rawmode, data: Sequence[int] | bytes | bytearray) -> ImagePalette: - palette = ImagePalette() - palette.rawmode = rawmode - palette.palette = data - palette.dirty = 1 - return palette - - -# -------------------------------------------------------------------- -# Factories - - -def make_linear_lut(black: int, white: float) -> list[int]: - if black == 0: - return [int(white * i // 255) for i in range(256)] - - msg = "unavailable when black is non-zero" - raise NotImplementedError(msg) # FIXME - - -def make_gamma_lut(exp: float) -> list[int]: - return [int(((i / 255.0) ** exp) * 255.0 + 0.5) for i in range(256)] - - -def negative(mode: str = "RGB") -> ImagePalette: - palette = list(range(256 * len(mode))) - palette.reverse() - return ImagePalette(mode, [i // len(mode) for i in palette]) - - -def random(mode: str = "RGB") -> ImagePalette: - from random import randint - - palette = [randint(0, 255) for _ in range(256 * len(mode))] - return ImagePalette(mode, palette) - - -def sepia(white: str = "#fff0c0") -> ImagePalette: - bands = [make_linear_lut(0, band) for band in ImageColor.getrgb(white)] - return ImagePalette("RGB", [bands[i % 3][i // 3] for i in range(256 * 3)]) - - -def wedge(mode: str = "RGB") -> ImagePalette: - palette = list(range(256 * len(mode))) - return ImagePalette(mode, [i // len(mode) for i in palette]) - - -def load(filename: str) -> tuple[bytes, str]: - # FIXME: supports GIMP gradients only - - with open(filename, "rb") as fp: - paletteHandlers: list[ - type[ - GimpPaletteFile.GimpPaletteFile - | GimpGradientFile.GimpGradientFile - | PaletteFile.PaletteFile - ] - ] = [ - GimpPaletteFile.GimpPaletteFile, - GimpGradientFile.GimpGradientFile, - PaletteFile.PaletteFile, - ] - for paletteHandler in paletteHandlers: - try: - fp.seek(0) - lut = paletteHandler(fp).getpalette() - if lut: - break - except (SyntaxError, ValueError): - pass - else: - msg = "cannot load palette" - raise OSError(msg) - - return lut # data, rawmode diff --git a/.venv/Lib/site-packages/PIL/ImagePath.py b/.venv/Lib/site-packages/PIL/ImagePath.py deleted file mode 100644 index 77e8a60..0000000 --- a/.venv/Lib/site-packages/PIL/ImagePath.py +++ /dev/null @@ -1,20 +0,0 @@ -# -# 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 __future__ import annotations - -from . import Image - -Path = Image.core.path diff --git a/.venv/Lib/site-packages/PIL/ImageQt.py b/.venv/Lib/site-packages/PIL/ImageQt.py deleted file mode 100644 index 35a3776..0000000 --- a/.venv/Lib/site-packages/PIL/ImageQt.py +++ /dev/null @@ -1,205 +0,0 @@ -# -# 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 __future__ import annotations - -import sys -from io import BytesIO -from typing import Callable - -from . import Image -from ._util import is_path - -qt_version: str | None -qt_versions = [ - ["6", "PyQt6"], - ["side6", "PySide6"], -] - -# If a version has already been imported, attempt it first -qt_versions.sort(key=lambda version: version[1] in sys.modules, reverse=True) -for version, qt_module in qt_versions: - try: - QBuffer: type - QIODevice: type - QImage: type - QPixmap: type - qRgba: Callable[[int, int, int, int], int] - if qt_module == "PyQt6": - from PyQt6.QtCore import QBuffer, QIODevice - from PyQt6.QtGui import QImage, QPixmap, qRgba - elif qt_module == "PySide6": - from PySide6.QtCore import QBuffer, QIODevice - from PySide6.QtGui import QImage, QPixmap, qRgba - except (ImportError, RuntimeError): - continue - qt_is_installed = True - qt_version = version - break -else: - qt_is_installed = False - qt_version = None - - -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: QImage or PIL ImageQt object - """ - buffer = QBuffer() - if qt_version == "6": - try: - qt_openmode = QIODevice.OpenModeFlag - except AttributeError: - qt_openmode = QIODevice.OpenMode - else: - qt_openmode = QIODevice - buffer.open(qt_openmode.ReadWrite) - # preserve alpha 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() - b.write(buffer.data()) - buffer.close() - b.seek(0) - - return Image.open(b) - - -def fromqpixmap(im): - return fromqimage(im) - - -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, "I;16": 16}[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 = [ - bytes[i * bytes_per_line : (i + 1) * bytes_per_line] + b"\x00" * extra_padding - for i in range(len(bytes) // bytes_per_line) - ] - - return b"".join(new_data) - - -def _toqclass_helper(im): - data = None - colortable = None - exclusive_fp = False - - # handle filename, if given instead of image name - if hasattr(im, "toUtf8"): - # FIXME - is this really the best way to do this? - im = str(im.toUtf8(), "utf-8") - if is_path(im): - im = Image.open(im) - exclusive_fp = True - - qt_format = QImage.Format if qt_version == "6" else QImage - if im.mode == "1": - format = qt_format.Format_Mono - elif im.mode == "L": - format = qt_format.Format_Indexed8 - colortable = [rgb(i, i, i) for i in range(256)] - elif im.mode == "P": - format = qt_format.Format_Indexed8 - palette = im.getpalette() - colortable = [rgb(*palette[i : i + 3]) for i in range(0, len(palette), 3)] - elif im.mode == "RGB": - # Populate the 4th channel with 255 - im = im.convert("RGBA") - - data = im.tobytes("raw", "BGRA") - format = qt_format.Format_RGB32 - elif im.mode == "RGBA": - data = im.tobytes("raw", "BGRA") - format = qt_format.Format_ARGB32 - elif im.mode == "I;16": - im = im.point(lambda i: i * 256) - - format = qt_format.Format_Grayscale16 - else: - if exclusive_fp: - im.close() - msg = f"unsupported image mode {repr(im.mode)}" - raise ValueError(msg) - - size = im.size - __data = data or align8to32(im.tobytes(), size[0], im.mode) - if exclusive_fp: - im.close() - return {"data": __data, "size": size, "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"] - super().__init__( - self.__data, - im_data["size"][0], - im_data["size"][1], - im_data["format"], - ) - if im_data["colortable"]: - self.setColorTable(im_data["colortable"]) - - -def toqimage(im) -> ImageQt: - return ImageQt(im) - - -def toqpixmap(im): - qimage = toqimage(im) - return QPixmap.fromImage(qimage) diff --git a/.venv/Lib/site-packages/PIL/ImageSequence.py b/.venv/Lib/site-packages/PIL/ImageSequence.py deleted file mode 100644 index 2c18502..0000000 --- a/.venv/Lib/site-packages/PIL/ImageSequence.py +++ /dev/null @@ -1,86 +0,0 @@ -# -# 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. -# - -## -from __future__ import annotations - -from typing import Callable - -from . import Image - - -class Iterator: - """ - 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: Image.Image): - if not hasattr(im, "seek"): - msg = "im must have seek method" - raise AttributeError(msg) - self.im = im - self.position = getattr(self.im, "_min_frame", 0) - - def __getitem__(self, ix: int) -> Image.Image: - try: - self.im.seek(ix) - return self.im - except EOFError as e: - msg = "end of sequence" - raise IndexError(msg) from e - - def __iter__(self) -> Iterator: - return self - - def __next__(self) -> Image.Image: - try: - self.im.seek(self.position) - self.position += 1 - return self.im - except EOFError as e: - msg = "end of sequence" - raise StopIteration(msg) from e - - -def all_frames( - im: Image.Image | list[Image.Image], - func: Callable[[Image.Image], Image.Image] | None = None, -) -> list[Image.Image]: - """ - Applies a given function to all frames in an image or a list of images. - The frames are returned as a list of separate images. - - :param im: An image, or a list of images. - :param func: The function to apply to all of the image frames. - :returns: A list of images. - """ - if not isinstance(im, list): - im = [im] - - ims = [] - for imSequence in im: - current = imSequence.tell() - - ims += [im_frame.copy() for im_frame in Iterator(imSequence)] - - imSequence.seek(current) - return [func(im) for im in ims] if func else ims diff --git a/.venv/Lib/site-packages/PIL/ImageShow.py b/.venv/Lib/site-packages/PIL/ImageShow.py deleted file mode 100644 index 037d6f4..0000000 --- a/.venv/Lib/site-packages/PIL/ImageShow.py +++ /dev/null @@ -1,363 +0,0 @@ -# -# 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 annotations - -import abc -import os -import shutil -import subprocess -import sys -from shlex import quote -from typing import Any - -from . import Image - -_viewers = [] - - -def register(viewer, order: int = 1) -> None: - """ - The :py:func:`register` function is used to register additional viewers:: - - from PIL import ImageShow - ImageShow.register(MyViewer()) # MyViewer will be used as a last resort - ImageShow.register(MySecondViewer(), 0) # MySecondViewer will be prioritised - ImageShow.register(ImageShow.XVViewer(), 0) # XVViewer will be prioritised - - :param viewer: The viewer to be registered. - :param order: - Zero or a negative integer to prepend this viewer to the list, - a positive integer to append it. - """ - try: - if issubclass(viewer, Viewer): - viewer = viewer() - except TypeError: - pass # raised if viewer wasn't a class - if order > 0: - _viewers.append(viewer) - else: - _viewers.insert(0, viewer) - - -def show(image: Image.Image, title: str | None = None, **options: Any) -> bool: - 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 True - return False - - -class Viewer: - """Base class for viewers.""" - - # main api - - def show(self, image: Image.Image, **options: Any) -> int: - """ - The main function for displaying an image. - Converts the given image to the target format and displays it. - """ - - if not ( - image.mode in ("1", "RGBA") - or (self.format == "PNG" and image.mode in ("I;16", "LA")) - ): - base = Image.getmodebase(image.mode) - if image.mode != base: - image = image.convert(base) - - return self.show_image(image, **options) - - # hook methods - - format: str | None = None - """The format to convert the image into.""" - options: dict[str, Any] = {} - """Additional options used to convert the image.""" - - def get_format(self, image: Image.Image) -> str | None: - """Return format name, or ``None`` to save as PGM/PPM.""" - return self.format - - def get_command(self, file: str, **options: Any) -> str: - """ - Returns the command used to display the file. - Not implemented in the base class. - """ - msg = "unavailable in base viewer" - raise NotImplementedError(msg) - - def save_image(self, image: Image.Image) -> str: - """Save to temporary file and return filename.""" - return image._dump(format=self.get_format(image), **self.options) - - def show_image(self, image: Image.Image, **options: Any) -> int: - """Display the given image.""" - return self.show_file(self.save_image(image), **options) - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - os.system(self.get_command(path, **options)) # nosec - return 1 - - -# -------------------------------------------------------------------- - - -class WindowsViewer(Viewer): - """The default viewer on Windows is the default system application for PNG files.""" - - format = "PNG" - options = {"compress_level": 1, "save_all": True} - - def get_command(self, file: str, **options: Any) -> str: - return ( - f'start "Pillow" /WAIT "{file}" ' - "&& ping -n 4 127.0.0.1 >NUL " - f'&& del /f "{file}"' - ) - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - subprocess.Popen( - self.get_command(path, **options), - shell=True, - creationflags=getattr(subprocess, "CREATE_NO_WINDOW"), - ) # nosec - return 1 - - -if sys.platform == "win32": - register(WindowsViewer) - - -class MacViewer(Viewer): - """The default viewer on macOS using ``Preview.app``.""" - - format = "PNG" - options = {"compress_level": 1, "save_all": True} - - def get_command(self, file: str, **options: Any) -> str: - # on darwin open returns immediately resulting in the temp - # file removal while app is opening - command = "open -a Preview.app" - command = f"({command} {quote(file)}; sleep 20; rm -f {quote(file)})&" - return command - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - subprocess.call(["open", "-a", "Preview.app", path]) - executable = sys.executable or shutil.which("python3") - if executable: - subprocess.Popen( - [ - executable, - "-c", - "import os, sys, time; time.sleep(20); os.remove(sys.argv[1])", - path, - ] - ) - return 1 - - -if sys.platform == "darwin": - register(MacViewer) - - -class UnixViewer(Viewer): - format = "PNG" - options = {"compress_level": 1, "save_all": True} - - @abc.abstractmethod - def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: - pass - - def get_command(self, file: str, **options: Any) -> str: - command = self.get_command_ex(file, **options)[0] - return f"{command} {quote(file)}" - - -class XDGViewer(UnixViewer): - """ - The freedesktop.org ``xdg-open`` command. - """ - - def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: - command = executable = "xdg-open" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - subprocess.Popen(["xdg-open", path]) - return 1 - - -class DisplayViewer(UnixViewer): - """ - The ImageMagick ``display`` command. - This viewer supports the ``title`` parameter. - """ - - def get_command_ex( - self, file: str, title: str | None = None, **options: Any - ) -> tuple[str, str]: - command = executable = "display" - if title: - command += f" -title {quote(title)}" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - args = ["display"] - title = options.get("title") - if title: - args += ["-title", title] - args.append(path) - - subprocess.Popen(args) - return 1 - - -class GmDisplayViewer(UnixViewer): - """The GraphicsMagick ``gm display`` command.""" - - def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: - executable = "gm" - command = "gm display" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - subprocess.Popen(["gm", "display", path]) - return 1 - - -class EogViewer(UnixViewer): - """The GNOME Image Viewer ``eog`` command.""" - - def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: - executable = "eog" - command = "eog -n" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - subprocess.Popen(["eog", "-n", path]) - return 1 - - -class XVViewer(UnixViewer): - """ - The X Viewer ``xv`` command. - This viewer supports the ``title`` parameter. - """ - - def get_command_ex( - self, file: str, title: str | None = None, **options: Any - ) -> tuple[str, str]: - # note: xv is pretty outdated. most modern systems have - # imagemagick's display command instead. - command = executable = "xv" - if title: - command += f" -name {quote(title)}" - return command, executable - - def show_file(self, path: str, **options: Any) -> int: - """ - Display given file. - """ - if not os.path.exists(path): - raise FileNotFoundError - args = ["xv"] - title = options.get("title") - if title: - args += ["-name", title] - args.append(path) - - subprocess.Popen(args) - return 1 - - -if sys.platform not in ("win32", "darwin"): # unixoids - if shutil.which("xdg-open"): - register(XDGViewer) - if shutil.which("display"): - register(DisplayViewer) - if shutil.which("gm"): - register(GmDisplayViewer) - if shutil.which("eog"): - register(EogViewer) - if shutil.which("xv"): - register(XVViewer) - - -class IPythonViewer(Viewer): - """The viewer for IPython frontends.""" - - def show_image(self, image: Image.Image, **options: Any) -> int: - ipython_display(image) - return 1 - - -try: - from IPython.display import display as ipython_display -except ImportError: - pass -else: - register(IPythonViewer) - - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("Syntax: python3 ImageShow.py imagefile [title]") - sys.exit() - - with Image.open(sys.argv[1]) as im: - print(show(im, *sys.argv[2:])) diff --git a/.venv/Lib/site-packages/PIL/ImageStat.py b/.venv/Lib/site-packages/PIL/ImageStat.py deleted file mode 100644 index 8bc5045..0000000 --- a/.venv/Lib/site-packages/PIL/ImageStat.py +++ /dev/null @@ -1,160 +0,0 @@ -# -# 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. -# -from __future__ import annotations - -import math -from functools import cached_property - -from . import Image - - -class Stat: - def __init__( - self, image_or_list: Image.Image | list[int], mask: Image.Image | None = None - ) -> None: - """ - Calculate statistics for the given image. If a mask is included, - only the regions covered by that mask are included in the - statistics. You can also pass in a previously calculated histogram. - - :param image: A PIL image, or a precalculated histogram. - - .. note:: - - For a PIL image, calculations rely on the - :py:meth:`~PIL.Image.Image.histogram` method. The pixel counts are - grouped into 256 bins, even if the image has more than 8 bits per - channel. So ``I`` and ``F`` mode images have a maximum ``mean``, - ``median`` and ``rms`` of 255, and cannot have an ``extrema`` maximum - of more than 255. - - :param mask: An optional mask. - """ - if isinstance(image_or_list, Image.Image): - self.h = image_or_list.histogram(mask) - elif isinstance(image_or_list, list): - self.h = image_or_list - else: - msg = "first argument must be image or list" # type: ignore[unreachable] - raise TypeError(msg) - self.bands = list(range(len(self.h) // 256)) - - @cached_property - def extrema(self) -> list[tuple[int, int]]: - """ - Min/max values for each band in the image. - - .. note:: - This relies on the :py:meth:`~PIL.Image.Image.histogram` method, and - simply returns the low and high bins used. This is correct for - images with 8 bits per channel, but fails for other modes such as - ``I`` or ``F``. Instead, use :py:meth:`~PIL.Image.Image.getextrema` to - return per-band extrema for the image. This is more correct and - efficient because, for non-8-bit modes, the histogram method uses - :py:meth:`~PIL.Image.Image.getextrema` to determine the bins used. - """ - - def minmax(histogram: list[int]) -> tuple[int, int]: - res_min, res_max = 255, 0 - for i in range(256): - if histogram[i]: - res_min = i - break - for i in range(255, -1, -1): - if histogram[i]: - res_max = i - break - return res_min, res_max - - return [minmax(self.h[i:]) for i in range(0, len(self.h), 256)] - - @cached_property - def count(self) -> list[int]: - """Total number of pixels for each band in the image.""" - return [sum(self.h[i : i + 256]) for i in range(0, len(self.h), 256)] - - @cached_property - def sum(self) -> list[float]: - """Sum of all pixels for each band in the image.""" - - v = [] - for i in range(0, len(self.h), 256): - layer_sum = 0.0 - for j in range(256): - layer_sum += j * self.h[i + j] - v.append(layer_sum) - return v - - @cached_property - def sum2(self) -> list[float]: - """Squared sum of all pixels for each band in the image.""" - - 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 - - @cached_property - def mean(self) -> list[float]: - """Average (arithmetic mean) pixel level for each band in the image.""" - return [self.sum[i] / self.count[i] for i in self.bands] - - @cached_property - def median(self) -> list[int]: - """Median pixel level for each band in the image.""" - - v = [] - for i in self.bands: - s = 0 - half = self.count[i] // 2 - b = i * 256 - for j in range(256): - s = s + self.h[b + j] - if s > half: - break - v.append(j) - return v - - @cached_property - def rms(self) -> list[float]: - """RMS (root-mean-square) for each band in the image.""" - return [math.sqrt(self.sum2[i] / self.count[i]) for i in self.bands] - - @cached_property - def var(self) -> list[float]: - """Variance for each band in the image.""" - return [ - (self.sum2[i] - (self.sum[i] ** 2.0) / self.count[i]) / self.count[i] - for i in self.bands - ] - - @cached_property - def stddev(self) -> list[float]: - """Standard deviation for each band in the image.""" - return [math.sqrt(self.var[i]) for i in self.bands] - - -Global = Stat # compatibility diff --git a/.venv/Lib/site-packages/PIL/ImageTk.py b/.venv/Lib/site-packages/PIL/ImageTk.py deleted file mode 100644 index 90defdb..0000000 --- a/.venv/Lib/site-packages/PIL/ImageTk.py +++ /dev/null @@ -1,284 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# a Tk display interface -# -# History: -# 96-04-08 fl Created -# 96-09-06 fl Added getimage method -# 96-11-01 fl Rewritten, removed image attribute and crop method -# 97-05-09 fl Use PyImagingPaste method instead of image type -# 97-05-12 fl Minor tweaks to match the IFUNC95 interface -# 97-05-17 fl Support the "pilbitmap" booster patch -# 97-06-05 fl Added file= and data= argument to image constructors -# 98-03-09 fl Added width and height methods to Image classes -# 98-07-02 fl Use default mode for "P" images without palette attribute -# 98-07-02 fl Explicitly destroy Tkinter image objects -# 99-07-24 fl Support multiple Tk interpreters (from Greg Couch) -# 99-07-26 fl Automatically hook into Tkinter (if possible) -# 99-08-15 fl Hook uses _imagingtk instead of _imaging -# -# Copyright (c) 1997-1999 by Secret Labs AB -# Copyright (c) 1996-1997 by Fredrik Lundh -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import tkinter -from io import BytesIO - -from . import Image - -# -------------------------------------------------------------------- -# Check for Tkinter interface hooks - -_pilbitmap_ok = None - - -def _pilbitmap_check() -> int: - global _pilbitmap_ok - if _pilbitmap_ok is None: - try: - im = Image.new("1", (1, 1)) - tkinter.BitmapImage(data=f"PIL:{im.im.id}") - _pilbitmap_ok = 1 - except tkinter.TclError: - _pilbitmap_ok = 0 - return _pilbitmap_ok - - -def _get_image_from_kw(kw): - source = None - if "file" in kw: - source = kw.pop("file") - elif "data" in kw: - source = BytesIO(kw.pop("data")) - if source: - return Image.open(source) - - -def _pyimagingtkcall(command, photo, id): - tk = photo.tk - try: - tk.call(command, photo, id) - except tkinter.TclError: - # activate Tkinter hook - # may raise an error if it cannot attach to Tkinter - from . import _imagingtk - - _imagingtk.tkinit(tk.interpaddr()) - tk.call(command, photo, id) - - -# -------------------------------------------------------------------- -# PhotoImage - - -class PhotoImage: - """ - A Tkinter-compatible photo image. This can be used - everywhere Tkinter expects an image object. If the image is an RGBA - image, pixels having alpha 0 are treated as transparent. - - The constructor takes either a PIL image, or a mode and a size. - Alternatively, you can use the ``file`` or ``data`` options to initialize - the photo image object. - - :param image: Either a PIL image, or a mode string. If a mode string is - used, a size must also be given. - :param size: If the first argument is a mode string, this defines the size - of the image. - :keyword file: A filename to load the image from (using - ``Image.open(file)``). - :keyword data: An 8-bit string containing image data (as loaded from an - image file). - """ - - def __init__(self, image=None, size=None, **kw): - # Tk compatibility: file or data - if image is None: - image = _get_image_from_kw(kw) - - if hasattr(image, "mode") and hasattr(image, "size"): - # got an image instead of a mode - mode = image.mode - if mode == "P": - # palette mapped data - image.apply_transparency() - image.load() - try: - mode = image.palette.mode - except AttributeError: - mode = "RGB" # default - size = image.size - kw["width"], kw["height"] = size - else: - mode = image - image = None - - if mode not in ["1", "L", "RGB", "RGBA"]: - mode = Image.getmodebase(mode) - - self.__mode = mode - self.__size = size - self.__photo = tkinter.PhotoImage(**kw) - self.tk = self.__photo.tk - if image: - self.paste(image) - - def __del__(self) -> None: - name = self.__photo.name - self.__photo.name = None - try: - self.__photo.tk.call("image", "delete", name) - except Exception: - pass # ignore internal errors - - def __str__(self) -> str: - """ - Get the Tkinter photo image identifier. This method is automatically - called by Tkinter whenever a PhotoImage object is passed to a Tkinter - method. - - :return: A Tkinter photo image identifier (a string). - """ - return str(self.__photo) - - def width(self) -> int: - """ - Get the width of the image. - - :return: The width, in pixels. - """ - return self.__size[0] - - def height(self) -> int: - """ - Get the height of the image. - - :return: The height, in pixels. - """ - return self.__size[1] - - def paste(self, im: Image.Image) -> None: - """ - Paste a PIL image into the photo image. Note that this can - be very slow if the photo image is displayed. - - :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. - """ - # convert to blittable - im.load() - image = im.im - if image.isblock() and im.mode == self.__mode: - block = image - else: - block = image.new_block(self.__mode, im.size) - image.convert2(block, image) # convert directly between buffers - - _pyimagingtkcall("PyImagingPhoto", self.__photo, block.id) - - -# -------------------------------------------------------------------- -# BitmapImage - - -class BitmapImage: - """ - A Tkinter-compatible bitmap image. This can be used everywhere Tkinter - expects an image object. - - The given image must have mode "1". Pixels having value 0 are treated as - transparent. Options, if any, are passed on to Tkinter. The most commonly - used option is ``foreground``, which is used to specify the color for the - non-transparent parts. See the Tkinter documentation for information on - how to specify colours. - - :param image: A PIL image. - """ - - def __init__(self, image=None, **kw): - # Tk compatibility: file or data - if image is None: - image = _get_image_from_kw(kw) - - self.__mode = image.mode - self.__size = image.size - - if _pilbitmap_check(): - # fast way (requires the pilbitmap booster patch) - image.load() - kw["data"] = f"PIL:{image.im.id}" - self.__im = image # must keep a reference - else: - # slow but safe way - kw["data"] = image.tobitmap() - self.__photo = tkinter.BitmapImage(**kw) - - def __del__(self) -> None: - name = self.__photo.name - self.__photo.name = None - try: - self.__photo.tk.call("image", "delete", name) - except Exception: - pass # ignore internal errors - - def width(self) -> int: - """ - Get the width of the image. - - :return: The width, in pixels. - """ - return self.__size[0] - - def height(self) -> int: - """ - Get the height of the image. - - :return: The height, in pixels. - """ - return self.__size[1] - - def __str__(self) -> str: - """ - Get the Tkinter bitmap image identifier. This method is automatically - called by Tkinter whenever a BitmapImage object is passed to a Tkinter - method. - - :return: A Tkinter bitmap image identifier (a string). - """ - return str(self.__photo) - - -def getimage(photo: PhotoImage) -> Image.Image: - """Copies the contents of a PhotoImage to a PIL image memory.""" - im = Image.new("RGBA", (photo.width(), photo.height())) - block = im.im - - _pyimagingtkcall("PyImagingPhotoGet", photo, block.id) - - return im - - -def _show(image, title): - """Helper for the Image.show method.""" - - class UI(tkinter.Label): - def __init__(self, master, im): - if im.mode == "1": - self.image = BitmapImage(im, foreground="white", master=master) - else: - self.image = PhotoImage(im, master=master) - super().__init__(master, image=self.image, bg="black", bd=0) - - if not tkinter._default_root: - msg = "tkinter not initialized" - raise OSError(msg) - top = tkinter.Toplevel() - if title: - top.title(title) - UI(top, image).pack() diff --git a/.venv/Lib/site-packages/PIL/ImageTransform.py b/.venv/Lib/site-packages/PIL/ImageTransform.py deleted file mode 100644 index ffd7916..0000000 --- a/.venv/Lib/site-packages/PIL/ImageTransform.py +++ /dev/null @@ -1,135 +0,0 @@ -# -# 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 __future__ import annotations - -from typing import Any, Sequence - -from . import Image - - -class Transform(Image.ImageTransformHandler): - """Base class for other transforms defined in :py:mod:`~PIL.ImageTransform`.""" - - method: Image.Transform - - def __init__(self, data: Sequence[Any]) -> None: - self.data = data - - def getdata(self) -> tuple[Image.Transform, Sequence[int]]: - return self.method, self.data - - def transform( - self, - size: tuple[int, int], - image: Image.Image, - **options: Any, - ) -> Image.Image: - """Perform the transform. Called from :py:meth:`.Image.transform`.""" - # 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:`.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.Transform.AFFINE - - -class PerspectiveTransform(Transform): - """ - Define a perspective image transform. - - This function takes an 8-tuple (a, b, c, d, e, f, g, h). For each pixel - (x, y) in the output image, the new value is taken from a position - ((a x + b y + c) / (g x + h y + 1), (d x + e y + f) / (g x + h y + 1)) 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:`.Image.transform` - - :param matrix: An 8-tuple (a, b, c, d, e, f, g, h). - """ - - method = Image.Transform.PERSPECTIVE - - -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:`.Image.transform` - - :param bbox: A 4-tuple (x0, y0, x1, y1) which specifies two points in the - input image's coordinate system. See :ref:`coordinate-system`. - """ - - method = Image.Transform.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:`.Image.transform` - - :param xy: An 8-tuple (x0, y0, x1, y1, x2, y2, x3, y3) which contain the - upper left, lower left, lower right, and upper right corner of the - source quadrilateral. - """ - - method = Image.Transform.QUAD - - -class MeshTransform(Transform): - """ - Define a mesh image transform. A mesh transform consists of one or more - individual quad transforms. - - See :py:meth:`.Image.transform` - - :param data: A list of (bbox, quad) tuples. - """ - - method = Image.Transform.MESH diff --git a/.venv/Lib/site-packages/PIL/ImageWin.py b/.venv/Lib/site-packages/PIL/ImageWin.py deleted file mode 100644 index 978c5a9..0000000 --- a/.venv/Lib/site-packages/PIL/ImageWin.py +++ /dev/null @@ -1,238 +0,0 @@ -# -# 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 __future__ import annotations - -from . import Image - - -class HDC: - """ - 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: int) -> None: - self.dc = dc - - def __int__(self) -> int: - return self.dc - - -class HWND: - """ - 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: int) -> None: - self.wnd = wnd - - def __int__(self) -> int: - return self.wnd - - -class Dib: - """ - 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 graylevels - are allocated. For an "RGB" image, a 6x6x6 colour cube is used, together - with 20 graylevels. - - 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: Image.Image | str, size: tuple[int, int] | list[int] | None = None - ) -> None: - if isinstance(image, str): - mode = image - image = "" - else: - mode = image.mode - size = image.size - 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: - assert not isinstance(image, str) - 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 - ``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: Image.Image, box: tuple[int, int, int, int] | None = None - ) -> 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. See :ref:`coordinate-system`. 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: bytes) -> None: - """ - Load display memory contents from byte data. - - :param buffer: A buffer containing display data (usually - data returned from :py:func:`~PIL.ImageWin.Dib.tobytes`) - """ - self.image.frombytes(buffer) - - def tobytes(self) -> bytes: - """ - Copy display memory contents to bytes object. - - :return: A bytes object containing display data. - """ - return self.image.tobytes() - - -class Window: - """Create a Window with the given title size.""" - - def __init__( - self, title: str = "PIL", width: int | None = None, height: int | None = None - ) -> None: - self.hwnd = Image.core.createwindow( - title, self.__dispatcher, width or 0, height or 0 - ) - - def __dispatcher(self, action, *args): - return getattr(self, f"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) -> None: - pass - - def ui_handle_repair(self, dc, x0, y0, x1, y1): - pass - - def ui_handle_resize(self, width, height): - pass - - def mainloop(self) -> None: - 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 - super().__init__(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/.venv/Lib/site-packages/PIL/ImtImagePlugin.py b/.venv/Lib/site-packages/PIL/ImtImagePlugin.py deleted file mode 100644 index abb3fb7..0000000 --- a/.venv/Lib/site-packages/PIL/ImtImagePlugin.py +++ /dev/null @@ -1,103 +0,0 @@ -# -# 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. -# -from __future__ import annotations - -import re - -from . import Image, ImageFile - -# -# -------------------------------------------------------------------- - -field = re.compile(rb"([a-z]*) ([^ \r\n]*)") - - -## -# Image plugin for IM Tools images. - - -class ImtImageFile(ImageFile.ImageFile): - format = "IMT" - format_description = "IM Tools" - - def _open(self) -> None: - # Quick rejection: if there's not a LF among the first - # 100 bytes, this is (probably) not a text header. - - assert self.fp is not None - - buffer = self.fp.read(100) - if b"\n" not in buffer: - msg = "not an IM file" - raise SyntaxError(msg) - - xsize = ysize = 0 - - while True: - if buffer: - s = buffer[:1] - buffer = buffer[1:] - else: - 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() - len(buffer), - (self.mode, 0, 1), - ) - ] - - break - - else: - # read key/value pair - if b"\n" not in buffer: - buffer += self.fp.read(100) - lines = buffer.split(b"\n") - s += lines.pop(0) - buffer = b"\n".join(lines) - 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 == b"width": - xsize = int(v) - self._size = xsize, ysize - elif k == b"height": - ysize = int(v) - self._size = xsize, ysize - elif k == b"pixel" and v == b"n8": - self._mode = "L" - - -# -# -------------------------------------------------------------------- - -Image.register_open(ImtImageFile.format, ImtImageFile) - -# -# no extension registered (".im" is simply too common) diff --git a/.venv/Lib/site-packages/PIL/IptcImagePlugin.py b/.venv/Lib/site-packages/PIL/IptcImagePlugin.py deleted file mode 100644 index 73df83b..0000000 --- a/.venv/Lib/site-packages/PIL/IptcImagePlugin.py +++ /dev/null @@ -1,235 +0,0 @@ -# -# 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 annotations - -from io import BytesIO -from typing import Sequence - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._deprecate import deprecate - -COMPRESSION = {1: "raw", 5: "jpeg"} - - -def __getattr__(name: str) -> bytes: - if name == "PAD": - deprecate("IptcImagePlugin.PAD", 12) - return b"\0\0\0\0" - msg = f"module '{__name__}' has no attribute '{name}'" - raise AttributeError(msg) - - -# -# Helpers - - -def _i(c: bytes) -> int: - return i32((b"\0\0\0\0" + c)[-4:]) - - -def _i8(c: int | bytes) -> int: - return c if isinstance(c, int) else c[0] - - -def i(c: bytes) -> int: - """.. deprecated:: 10.2.0""" - deprecate("IptcImagePlugin.i", 12) - return _i(c) - - -def dump(c: Sequence[int | bytes]) -> None: - """.. deprecated:: 10.2.0""" - deprecate("IptcImagePlugin.dump", 12) - for i in c: - print(f"{_i8(i):02x}", 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: tuple[int, int]) -> int: - return _i(self.info[key]) - - def field(self) -> tuple[tuple[int, int] | None, int]: - # - # get a IPTC field header - s = self.fp.read(5) - if not s.strip(b"\x00"): - return None, 0 - - tag = s[1], s[2] - - # syntax - if s[0] != 0x1C or tag[0] not in [1, 2, 3, 4, 5, 6, 7, 8, 9, 240]: - msg = "invalid IPTC/NAA file" - raise SyntaxError(msg) - - # field size - size = s[3] - if size > 132: - msg = "illegal field length in IPTC/NAA file" - raise OSError(msg) - 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) -> None: - # 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 - - # mode - layers = self.info[(3, 60)][0] - component = self.info[(3, 60)][1] - if (3, 65) in self.info: - id = 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 as e: - msg = "Unknown IPTC image compression" - raise OSError(msg) from e - - # tile - if tag == (8, 10): - self.tile = [("iptc", (0, 0) + self.size, offset, compression)] - - def load(self): - if len(self.tile) != 1 or self.tile[0][0] != "iptc": - return ImageFile.ImageFile.load(self) - - offset, compression = self.tile[0][2:] - - self.fp.seek(offset) - - # Copy image data to temporary file - o = BytesIO() - if compression == "raw": - # To simplify access to the extracted file, - # prepend a PPM header - o.write(b"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) - - with Image.open(o) as _im: - _im.load() - self.im = _im.im - - -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 JpegImagePlugin, TiffImagePlugin - - data = None - - if isinstance(im, IptcImageFile): - # return info dictionary right away - return im.info - - elif isinstance(im, JpegImagePlugin.JpegImageFile): - # extract the IPTC/NAA resource - photoshop = im.info.get("photoshop") - if photoshop: - data = photoshop.get(0x0404) - - 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: - pass - - im = FakeImage() - im.__class__ = IptcImageFile - - # parse the IPTC information chunk - im.info = {} - im.fp = BytesIO(data) - - try: - im._open() - except (IndexError, KeyError): - pass # expected failure - - return im.info diff --git a/.venv/Lib/site-packages/PIL/Jpeg2KImagePlugin.py b/.venv/Lib/site-packages/PIL/Jpeg2KImagePlugin.py deleted file mode 100644 index e50cd77..0000000 --- a/.venv/Lib/site-packages/PIL/Jpeg2KImagePlugin.py +++ /dev/null @@ -1,408 +0,0 @@ -# -# The Python Imaging Library -# $Id$ -# -# JPEG2000 file handling -# -# History: -# 2014-03-12 ajh Created -# 2021-06-30 rogermb Extract dpi information from the 'resc' header box -# -# Copyright (c) 2014 Coriolis Systems Limited -# Copyright (c) 2014 Alastair Houghton -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import io -import os -import struct -from typing import IO, Tuple, cast - -from . import Image, ImageFile, ImagePalette, _binary - - -class BoxReader: - """ - A small helper class to read fields stored in JPEG2000 header boxes - and to easily step into and read sub-boxes. - """ - - def __init__(self, fp, length=-1): - self.fp = fp - self.has_length = length >= 0 - self.length = length - self.remaining_in_box = -1 - - def _can_read(self, num_bytes: int) -> bool: - if self.has_length and self.fp.tell() + num_bytes > self.length: - # Outside box: ensure we don't read past the known file length - return False - if self.remaining_in_box >= 0: - # Inside box contents: ensure read does not go past box boundaries - return num_bytes <= self.remaining_in_box - else: - return True # No length known, just read - - def _read_bytes(self, num_bytes: int) -> bytes: - if not self._can_read(num_bytes): - msg = "Not enough data in header" - raise SyntaxError(msg) - - data = self.fp.read(num_bytes) - if len(data) < num_bytes: - msg = f"Expected to read {num_bytes} bytes but only got {len(data)}." - raise OSError(msg) - - if self.remaining_in_box > 0: - self.remaining_in_box -= num_bytes - return data - - def read_fields(self, field_format: str) -> tuple[int | bytes, ...]: - size = struct.calcsize(field_format) - data = self._read_bytes(size) - return struct.unpack(field_format, data) - - def read_boxes(self) -> BoxReader: - size = self.remaining_in_box - data = self._read_bytes(size) - return BoxReader(io.BytesIO(data), size) - - def has_next_box(self) -> bool: - if self.has_length: - return self.fp.tell() + self.remaining_in_box < self.length - else: - return True - - def next_box_type(self) -> bytes: - # Skip the rest of the box if it has not been read - if self.remaining_in_box > 0: - self.fp.seek(self.remaining_in_box, os.SEEK_CUR) - self.remaining_in_box = -1 - - # Read the length and type of the next box - lbox, tbox = cast(Tuple[int, bytes], self.read_fields(">I4s")) - if lbox == 1: - lbox = cast(int, self.read_fields(">Q")[0]) - hlen = 16 - else: - hlen = 8 - - if lbox < hlen or not self._can_read(lbox - hlen): - msg = "Invalid header length" - raise SyntaxError(msg) - - self.remaining_in_box = lbox - hlen - return tbox - - -def _parse_codestream(fp) -> tuple[tuple[int, int], str]: - """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 = _binary.i16be(hdr) - siz = hdr + fp.read(lsiz - 2) - lsiz, rsiz, xsiz, ysiz, xosiz, yosiz, _, _, _, _, csiz = struct.unpack_from( - ">HHIIIIIIIIH", siz - ) - - size = (xsiz - xosiz, ysiz - yosiz) - if csiz == 1: - ssiz = struct.unpack_from(">B", siz, 38) - if (ssiz[0] & 0x7F) + 1 > 8: - mode = "I;16" - else: - mode = "L" - elif csiz == 2: - mode = "LA" - elif csiz == 3: - mode = "RGB" - elif csiz == 4: - mode = "RGBA" - else: - msg = "unable to determine J2K image mode" - raise SyntaxError(msg) - - return size, mode - - -def _res_to_dpi(num: int, denom: int, exp: int) -> float | None: - """Convert JPEG2000's (numerator, denominator, exponent-base-10) resolution, - calculated as (num / denom) * 10^exp and stored in dots per meter, - to floating-point dots per inch.""" - if denom == 0: - return None - return (254 * num * (10**exp)) / (10000 * denom) - - -def _parse_jp2_header(fp): - """Parse the JP2 header box to extract size, component count, - color space information, and optionally DPI information, - returning a (size, mode, mimetype, dpi) tuple.""" - - # Find the JP2 header box - reader = BoxReader(fp) - header = None - mimetype = None - while reader.has_next_box(): - tbox = reader.next_box_type() - - if tbox == b"jp2h": - header = reader.read_boxes() - break - elif tbox == b"ftyp": - if reader.read_fields(">4s")[0] == b"jpx ": - mimetype = "image/jpx" - - size = None - mode = None - bpc = None - nc = None - dpi = None # 2-tuple of DPI info, or None - palette = None - - while header.has_next_box(): - tbox = header.next_box_type() - - if tbox == b"ihdr": - height, width, nc, bpc = header.read_fields(">IIHB") - size = (width, height) - 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" - elif tbox == b"colr" and nc == 4: - meth, _, _, enumcs = header.read_fields(">BBBI") - if meth == 1 and enumcs == 12: - mode = "CMYK" - elif tbox == b"pclr" and mode in ("L", "LA"): - ne, npc = header.read_fields(">HB") - bitdepths = header.read_fields(">" + ("B" * npc)) - if max(bitdepths) <= 8: - palette = ImagePalette.ImagePalette() - for i in range(ne): - palette.getcolor(header.read_fields(">" + ("B" * npc))) - mode = "P" if mode == "L" else "PA" - elif tbox == b"res ": - res = header.read_boxes() - while res.has_next_box(): - tres = res.next_box_type() - if tres == b"resc": - vrcn, vrcd, hrcn, hrcd, vrce, hrce = res.read_fields(">HHHHBB") - hres = _res_to_dpi(hrcn, hrcd, hrce) - vres = _res_to_dpi(vrcn, vrcd, vrce) - if hres is not None and vres is not None: - dpi = (hres, vres) - break - - if size is None or mode is None: - msg = "Malformed JP2 header" - raise SyntaxError(msg) - - return size, mode, mimetype, dpi, palette - - -## -# Image plugin for JPEG2000 images. - - -class Jpeg2KImageFile(ImageFile.ImageFile): - format = "JPEG2000" - format_description = "JPEG 2000 (ISO 15444)" - - def _open(self) -> None: - 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" - header = _parse_jp2_header(self.fp) - self._size, self._mode, self.custom_mimetype, dpi, self.palette = header - if dpi is not None: - self.info["dpi"] = dpi - if self.fp.read(12).endswith(b"jp2c\xff\x4f\xff\x51"): - self._parse_comment() - else: - msg = "not a JPEG 2000 file" - raise SyntaxError(msg) - - self._reduce = 0 - self.layers = 0 - - fd = -1 - length = -1 - - try: - fd = self.fp.fileno() - length = os.fstat(fd).st_size - except Exception: - fd = -1 - try: - pos = self.fp.tell() - self.fp.seek(0, io.SEEK_END) - length = self.fp.tell() - self.fp.seek(pos) - except Exception: - length = -1 - - self.tile = [ - ( - "jpeg2k", - (0, 0) + self.size, - 0, - (self.codec, self._reduce, self.layers, fd, length), - ) - ] - - def _parse_comment(self) -> None: - hdr = self.fp.read(2) - length = _binary.i16be(hdr) - self.fp.seek(length - 2, os.SEEK_CUR) - - while True: - marker = self.fp.read(2) - if not marker: - break - typ = marker[1] - if typ in (0x90, 0xD9): - # Start of tile or end of codestream - break - hdr = self.fp.read(2) - length = _binary.i16be(hdr) - if typ == 0x64: - # Comment - self.info["comment"] = self.fp.read(length - 2)[2:] - break - else: - self.fp.seek(length - 2, os.SEEK_CUR) - - @property - def reduce(self): - # https://github.com/python-pillow/Pillow/issues/4343 found that the - # new Image 'reduce' method was shadowed by this plugin's 'reduce' - # property. This attempts to allow for both scenarios - return self._reduce or super().reduce - - @reduce.setter - def reduce(self, value): - self._reduce = value - - def load(self): - if self.tile and self._reduce: - power = 1 << self._reduce - adjust = power >> 1 - self._size = ( - int((self.size[0] + adjust) / power), - int((self.size[1] + adjust) / power), - ) - - # 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: bytes) -> bool: - 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: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - # Get the keyword arguments - info = im.encoderinfo - - if isinstance(filename, str): - filename = filename.encode() - if filename.endswith(b".j2k") or info.get("no_jp2", False): - kind = "j2k" - else: - kind = "jp2" - - 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) - if quality_layers is not None and not ( - isinstance(quality_layers, (list, tuple)) - and all( - isinstance(quality_layer, (int, float)) for quality_layer in quality_layers - ) - ): - msg = "quality_layers must be a sequence of numbers" - raise ValueError(msg) - - 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") - mct = info.get("mct", 0) - signed = info.get("signed", False) - comment = info.get("comment") - if isinstance(comment, str): - comment = comment.encode() - plt = info.get("plt", False) - - fd = -1 - if hasattr(fp, "fileno"): - try: - fd = fp.fileno() - except Exception: - fd = -1 - - im.encoderconfig = ( - offset, - tile_offset, - tile_size, - quality_mode, - quality_layers, - num_resolutions, - cblk_size, - precinct_size, - irreversible, - progression, - cinema_mode, - mct, - signed, - fd, - comment, - plt, - ) - - 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") diff --git a/.venv/Lib/site-packages/PIL/JpegImagePlugin.py b/.venv/Lib/site-packages/PIL/JpegImagePlugin.py deleted file mode 100644 index b15bf06..0000000 --- a/.venv/Lib/site-packages/PIL/JpegImagePlugin.py +++ /dev/null @@ -1,861 +0,0 @@ -# -# 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 annotations - -import array -import io -import math -import os -import struct -import subprocess -import sys -import tempfile -import warnings -from typing import IO, Any - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 -from ._binary import o16be as o16 -from .JpegPresets import presets - -# -# Parser - - -def Skip(self: JpegImageFile, marker: int) -> None: - 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 = s[7] - jfif_density = i16(s, 8), i16(s, 10) - except Exception: - 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[:6] == b"Exif\0\0": - # extract EXIF information - if "exif" in self.info: - self.info["exif"] += s[6:] - else: - self.info["exif"] = s - self._exif_offset = self.fp.tell() - n + 6 - elif marker == 0xFFE1 and s[:29] == b"http://ns.adobe.com/xap/1.0/\x00": - self.info["xmp"] = s.split(b"\x00", 1)[1] - 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 == 0xFFED and s[:14] == b"Photoshop 3.0\x00": - # parse the image resource block - offset = 14 - photoshop = self.info.setdefault("photoshop", {}) - while s[offset : offset + 4] == b"8BIM": - try: - offset += 4 - # resource code - code = i16(s, offset) - offset += 2 - # resource name (usually empty) - name_len = s[offset] - # name = s[offset+1:offset+1+name_len] - offset += 1 + name_len - offset += offset & 1 # align - # resource data block - size = i32(s, offset) - offset += 4 - data = s[offset : offset + size] - if code == 0x03ED: # ResolutionInfo - data = { - "XResolution": i32(data, 0) / 65536, - "DisplayedUnitsX": i16(data, 4), - "YResolution": i32(data, 8) / 65536, - "DisplayedUnitsY": i16(data, 12), - } - photoshop[code] = data - offset += size - offset += offset & 1 # align - except struct.error: - break # insufficient data - - elif marker == 0xFFEE and s[:5] == b"Adobe": - self.info["adobe"] = i16(s, 5) - # extract Adobe custom properties - try: - adobe_transform = s[11] - except IndexError: - 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 - - -def COM(self: JpegImageFile, marker: int) -> None: - # - # Comment marker. Store these in the APP dictionary. - n = i16(self.fp.read(2)) - 2 - s = ImageFile._safe_read(self.fp, n) - - self.info["comment"] = s - self.app["COM"] = s # compatibility - self.applist.append(("COM", s)) - - -def SOF(self: JpegImageFile, marker: int) -> None: - # - # 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 = s[0] - if self.bits != 8: - msg = f"cannot handle {self.bits}-bit layers" - raise SyntaxError(msg) - - self.layers = s[5] - if self.layers == 1: - self._mode = "L" - elif self.layers == 3: - self._mode = "RGB" - elif self.layers == 4: - self._mode = "CMYK" - else: - msg = f"cannot handle {self.layers}-layer images" - raise SyntaxError(msg) - - 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 self.icclist[0][13] == len(self.icclist): - profile = [p[14:] for p in self.icclist] - icc_profile = b"".join(profile) - else: - icc_profile = None # wrong number of fragments - self.info["icc_profile"] = icc_profile - self.icclist = [] - - for i in range(6, len(s), 3): - t = s[i : i + 3] - # 4-tuples: id, vsamp, hsamp, qtable - self.layer.append((t[0], t[1] // 16, t[1] & 15, t[2])) - - -def DQT(self: JpegImageFile, marker: int) -> None: - # - # Define quantization table. 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): - v = s[0] - precision = 1 if (v // 16 == 0) else 2 # in bytes - qt_length = 1 + precision * 64 - if len(s) < qt_length: - msg = "bad quantization table marker" - raise SyntaxError(msg) - data = array.array("B" if precision == 1 else "H", s[1:qt_length]) - if sys.byteorder == "little" and precision > 1: - data.byteswap() # the values are always big-endian - self.quantization[v & 15] = [data[i] for i in zigzag_index] - s = s[qt_length:] - - -# -# 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: bytes) -> bool: - # Magic number was taken from https://en.wikipedia.org/wiki/JPEG - return prefix[:3] == b"\xFF\xD8\xFF" - - -## -# 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(3) - - if not _accept(s): - msg = "not a JPEG file" - raise SyntaxError(msg) - s = b"\xFF" - - # 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 = s[0] - 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] - 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 in {0, 0xFFFF}: - # padded marker or junk; move on - s = b"\xff" - elif i == 0xFF00: # Skip extraneous data (escaped 0xFF) - s = self.fp.read(1) - else: - msg = "no marker found" - raise SyntaxError(msg) - - self._read_dpi_from_exif() - - def load_read(self, read_bytes: int) -> bytes: - """ - internal: read more image data - For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker - so libjpeg can finish decoding - """ - s = self.fp.read(read_bytes) - - if not s and ImageFile.LOAD_TRUNCATED_IMAGES and not hasattr(self, "_ended"): - # Premature EOF. - # Pretend file is finished adding EOI marker - self._ended = True - return b"\xFF\xD9" - - return s - - def draft( - self, mode: str | None, size: tuple[int, int] | None - ) -> tuple[str, tuple[int, int, float, float]] | None: - if len(self.tile) != 1: - return None - - # Protect from second call - if self.decoderconfig: - return None - - d, e, o, a = self.tile[0] - scale = 1 - original_size = self.size - - 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) - - box = (0, 0, original_size[0] / scale, original_size[1] / scale) - return self.mode, box - - def load_djpeg(self) -> None: - # ALTERNATIVE: handle JPEGs via the IJG command line utilities - - f, path = tempfile.mkstemp() - os.close(f) - if os.path.exists(self.filename): - subprocess.check_call(["djpeg", "-outfile", path, self.filename]) - else: - try: - os.unlink(path) - except OSError: - pass - - msg = "Invalid Filename" - raise ValueError(msg) - - try: - with Image.open(path) as _im: - _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) -> dict[str, Any] | None: - return _getexif(self) - - def _read_dpi_from_exif(self) -> None: - # If DPI isn't in JPEG header, fetch from EXIF - if "dpi" in self.info or "exif" not in self.info: - return - try: - exif = self.getexif() - resolution_unit = exif[0x0128] - x_resolution = exif[0x011A] - try: - dpi = float(x_resolution[0]) / x_resolution[1] - except TypeError: - dpi = x_resolution - if math.isnan(dpi): - msg = "DPI is not a number" - raise ValueError(msg) - if resolution_unit == 3: # cm - # 1 dpcm = 2.54 dpi - dpi *= 2.54 - self.info["dpi"] = dpi, dpi - except ( - struct.error, # truncated EXIF - KeyError, # dpi not included - SyntaxError, # invalid/unreadable EXIF - TypeError, # dpi is an invalid float - ValueError, # dpi is an invalid float - ZeroDivisionError, # invalid dpi rational value - ): - self.info["dpi"] = 72, 72 - - def _getmp(self): - return _getmp(self) - - -def _getexif(self) -> dict[str, Any] | None: - if "exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - -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 plugin. - - # 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 - from . import TiffImagePlugin - - try: - info = TiffImagePlugin.ImageFileDirectory_v2(head) - file_contents.seek(info.next) - info.load(file_contents) - mp = dict(info) - except Exception as e: - msg = "malformed MP Index (unreadable directory)" - raise SyntaxError(msg) from e - # it's an error not to have a number of images - try: - quant = mp[0xB001] - except KeyError as e: - msg = "malformed MP Index (no number of images)" - raise SyntaxError(msg) from e - # get MP entries - mpentries = [] - try: - rawmpentries = mp[0xB002] - for entrynum in range(0, quant): - unpackedentry = struct.unpack_from( - f"{endianness}LLLHH", 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: - msg = "unsupported picture format in MPO" - raise SyntaxError(msg) - 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 as e: - msg = "malformed MP Index (bad MP Entry)" - raise SyntaxError(msg) from e - # 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", -} - -# fmt: off -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, -} -# fmt: on - - -def get_sampling(im): - # There's no subsampling when images have only 1 layer - # (grayscale images) or when they are CMYK (4 layers), - # so set subsampling to the 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: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.width == 0 or im.height == 0: - msg = "cannot write empty image as JPEG" - raise ValueError(msg) - - try: - rawmode = RAWMODE[im.mode] - except KeyError as e: - msg = f"cannot write mode {im.mode} as JPEG" - raise OSError(msg) from e - - info = im.encoderinfo - - dpi = [round(x) for x in info.get("dpi", (0, 0))] - - quality = info.get("quality", -1) - subsampling = info.get("subsampling", -1) - qtables = info.get("qtables") - - if quality == "keep": - quality = -1 - subsampling = "keep" - qtables = "keep" - elif quality in presets: - preset = presets[quality] - quality = -1 - subsampling = preset.get("subsampling", -1) - qtables = preset.get("quantization") - elif not isinstance(quality, int): - msg = "Invalid quality setting" - raise ValueError(msg) - else: - if subsampling in presets: - subsampling = presets[subsampling].get("subsampling", -1) - if isinstance(qtables, str) 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": - msg = "Cannot use 'keep' when original image is not a JPEG" - raise ValueError(msg) - subsampling = get_sampling(im) - - def validate_qtables(qtables): - if qtables is None: - return qtables - if isinstance(qtables, str): - try: - lines = [ - int(num) - for line in qtables.splitlines() - for num in line.split("#", 1)[0].split() - ] - except ValueError as e: - msg = "Invalid quantization table" - raise ValueError(msg) from e - 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 = [ - qtables[key] for key in range(len(qtables)) if key in qtables - ] - elif isinstance(qtables, tuple): - qtables = list(qtables) - if not (0 < len(qtables) < 5): - msg = "None or too many quantization tables" - raise ValueError(msg) - for idx, table in enumerate(qtables): - try: - if len(table) != 64: - msg = "Invalid quantization table" - raise TypeError(msg) - table = array.array("H", table) - except TypeError as e: - msg = "Invalid quantization table" - raise ValueError(msg) from e - else: - qtables[idx] = list(table) - return qtables - - if qtables == "keep": - if im.format != "JPEG": - msg = "Cannot use 'keep' when original image is not a JPEG" - raise ValueError(msg) - qtables = getattr(im, "quantization", None) - qtables = validate_qtables(qtables) - - extra = info.get("extra", b"") - - MAX_BYTES_IN_MARKER = 65533 - icc_profile = info.get("icc_profile") - if icc_profile: - ICC_OVERHEAD_LEN = 14 - 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 = o16(2 + ICC_OVERHEAD_LEN + len(marker)) - extra += ( - b"\xFF\xE2" - + size - + b"ICC_PROFILE\0" - + o8(i) - + o8(len(markers)) - + marker - ) - i += 1 - - comment = info.get("comment", im.info.get("comment")) - - # "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) - - exif = info.get("exif", b"") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - if len(exif) > MAX_BYTES_IN_MARKER: - msg = "EXIF data is too long" - raise ValueError(msg) - - # get keyword arguments - im.encoderconfig = ( - quality, - progressive, - info.get("smooth", 0), - optimize, - info.get("keep_rgb", False), - info.get("streamtype", 0), - dpi[0], - dpi[1], - subsampling, - info.get("restart_marker_blocks", 0), - info.get("restart_marker_rows", 0), - qtables, - comment, - extra, - exif, - ) - - # 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 pixel 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 -1, but the actual value may be high. - elif quality >= 95 or quality == -1: - bufsize = 2 * im.size[0] * im.size[1] - else: - bufsize = im.size[0] * im.size[1] - if exif: - bufsize += len(exif) + 5 - if extra: - bufsize += len(extra) + 1 - else: - # 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(bufsize, len(exif) + 5, len(extra) + 1) - - ImageFile._save(im, fp, [("jpeg", (0, 0) + im.size, 0, rawmode)], bufsize) - - -def _save_cjpeg(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - # ALTERNATIVE: handle JPEGs via the IJG command line utilities. - 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: - for segment, content in im.applist: - if segment == "APP1" and b' hdrgm:Version="' in content: - # Ultra HDR images are not yet supported - return im - # It's actually an MPO - from .MpoImagePlugin import MpoImageFile - - # Don't reload everything, just convert it. - im = MpoImageFile.adopt(im, mpheader) - 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 - - -# --------------------------------------------------------------------- -# 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/.venv/Lib/site-packages/PIL/JpegPresets.py b/.venv/Lib/site-packages/PIL/JpegPresets.py deleted file mode 100644 index 3aefa07..0000000 --- a/.venv/Lib/site-packages/PIL/JpegPresets.py +++ /dev/null @@ -1,242 +0,0 @@ -""" -JPEG quality settings equivalent to the Photoshop settings. -Can be used when saving JPEG files. - -The following presets are available by default: -``web_low``, ``web_medium``, ``web_high``, ``web_very_high``, ``web_maximum``, -``low``, ``medium``, ``high``, ``maximum``. -More presets can be added to the :py:data:`presets` dict if needed. - -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 -:func:`.JpegImagePlugin.get_sampling` function. - -In JPEG compressed data a JPEG marker is used instead of an EXIF tag. -(ref.: https://web.archive.org/web/20240227115053/https://exiv2.org/tags.html) - - -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 lists. You can pass this dict -directly as the qtables argument when saving a JPEG. - -The quantization table format in presets is a list with sublists. These formats -are interchangeable. - -Libjpeg ref.: -https://web.archive.org/web/20120328125543/http://www.jpegcameras.com/libjpeg/libjpeg-3.html - -""" - -from __future__ import annotations - -# fmt: off -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] - ]}, -} -# fmt: on diff --git a/.venv/Lib/site-packages/PIL/McIdasImagePlugin.py b/.venv/Lib/site-packages/PIL/McIdasImagePlugin.py deleted file mode 100644 index 2797223..0000000 --- a/.venv/Lib/site-packages/PIL/McIdasImagePlugin.py +++ /dev/null @@ -1,78 +0,0 @@ -# -# 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. -# -from __future__ import annotations - -import struct - -from . import Image, ImageFile - - -def _accept(prefix: bytes) -> bool: - return prefix[: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) -> None: - # parse area file directory - assert self.fp is not None - - s = self.fp.read(256) - if not _accept(s) or len(s) != 256: - msg = "not an McIdas area file" - raise SyntaxError(msg) - - 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: - msg = "unsupported McIdas format" - raise SyntaxError(msg) - - 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/.venv/Lib/site-packages/PIL/MicImagePlugin.py b/.venv/Lib/site-packages/PIL/MicImagePlugin.py deleted file mode 100644 index 0723988..0000000 --- a/.venv/Lib/site-packages/PIL/MicImagePlugin.py +++ /dev/null @@ -1,107 +0,0 @@ -# -# 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 __future__ import annotations - -import olefile - -from . import Image, TiffImagePlugin - -# -# -------------------------------------------------------------------- - - -def _accept(prefix: bytes) -> bool: - 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) -> None: - # 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 OSError as e: - msg = "not an MIC file; invalid OLE file" - raise SyntaxError(msg) from e - - # find ACI subfiles with Image members (maybe not the - # best way to identify MIC files, but what the... ;-) - - self.images = [ - path - for path in self.ole.listdir() - if path[1:] and path[0][-4:] == ".ACI" and path[1] == "Image" - ] - - # if we didn't find any images, this is probably not - # an MIC file. - if not self.images: - msg = "not an MIC file; no image entries" - raise SyntaxError(msg) - - self.frame = -1 - self._n_frames = len(self.images) - self.is_animated = self._n_frames > 1 - - self.__fp = self.fp - self.seek(0) - - def seek(self, frame): - if not self._seek_check(frame): - return - try: - filename = self.images[frame] - except IndexError as e: - msg = "no such frame" - raise EOFError(msg) from e - - self.fp = self.ole.openstream(filename) - - TiffImagePlugin.TiffImageFile._open(self) - - self.frame = frame - - def tell(self) -> int: - return self.frame - - def close(self) -> None: - self.__fp.close() - self.ole.close() - super().close() - - def __exit__(self, *args: object) -> None: - self.__fp.close() - self.ole.close() - super().__exit__() - - -# -# -------------------------------------------------------------------- - -Image.register_open(MicImageFile.format, MicImageFile, _accept) - -Image.register_extension(MicImageFile.format, ".mic") diff --git a/.venv/Lib/site-packages/PIL/MpegImagePlugin.py b/.venv/Lib/site-packages/PIL/MpegImagePlugin.py deleted file mode 100644 index ad4d3e9..0000000 --- a/.venv/Lib/site-packages/PIL/MpegImagePlugin.py +++ /dev/null @@ -1,88 +0,0 @@ -# -# 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 __future__ import annotations - -from . import Image, ImageFile -from ._binary import i8 -from ._typing import SupportsRead - -# -# Bitstream parser - - -class BitStream: - def __init__(self, fp: SupportsRead[bytes]) -> None: - self.fp = fp - self.bits = 0 - self.bitbuffer = 0 - - def next(self) -> int: - return i8(self.fp.read(1)) - - def peek(self, bits: int) -> int: - 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: int) -> None: - 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: int) -> int: - v = self.peek(bits) - self.bits = self.bits - bits - return v - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == b"\x00\x00\x01\xb3" - - -## -# 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) -> None: - assert self.fp is not None - - s = BitStream(self.fp) - if s.read(32) != 0x1B3: - msg = "not an MPEG file" - raise SyntaxError(msg) - - self._mode = "RGB" - self._size = s.read(12), s.read(12) - - -# -------------------------------------------------------------------- -# Registry stuff - -Image.register_open(MpegImageFile.format, MpegImageFile, _accept) - -Image.register_extensions(MpegImageFile.format, [".mpg", ".mpeg"]) - -Image.register_mime(MpegImageFile.format, "video/mpeg") diff --git a/.venv/Lib/site-packages/PIL/MpoImagePlugin.py b/.venv/Lib/site-packages/PIL/MpoImagePlugin.py deleted file mode 100644 index f215706..0000000 --- a/.venv/Lib/site-packages/PIL/MpoImagePlugin.py +++ /dev/null @@ -1,180 +0,0 @@ -# -# 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 __future__ import annotations - -import itertools -import os -import struct -from typing import IO - -from . import ( - Image, - ImageSequence, - JpegImagePlugin, - TiffImagePlugin, -) -from ._binary import o32le - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - JpegImagePlugin._save(im, fp, filename) - - -def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - append_images = im.encoderinfo.get("append_images", []) - if not append_images and not getattr(im, "is_animated", False): - _save(im, fp, filename) - return - - mpf_offset = 28 - offsets: list[int] = [] - for imSequence in itertools.chain([im], append_images): - for im_frame in ImageSequence.Iterator(imSequence): - if not offsets: - # APP2 marker - im_frame.encoderinfo["extra"] = ( - b"\xFF\xE2" + struct.pack(">H", 6 + 82) + b"MPF\0" + b" " * 82 - ) - exif = im_frame.encoderinfo.get("exif") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - im_frame.encoderinfo["exif"] = exif - if exif: - mpf_offset += 4 + len(exif) - - JpegImagePlugin._save(im_frame, fp, filename) - offsets.append(fp.tell()) - else: - im_frame.save(fp, "JPEG") - offsets.append(fp.tell() - offsets[-1]) - - ifd = TiffImagePlugin.ImageFileDirectory_v2() - ifd[0xB000] = b"0100" - ifd[0xB001] = len(offsets) - - mpentries = b"" - data_offset = 0 - for i, size in enumerate(offsets): - if i == 0: - mptype = 0x030000 # Baseline MP Primary Image - else: - mptype = 0x000000 # Undefined - mpentries += struct.pack(" None: - self.fp.seek(0) # prep the fp in order to pass the JPEG test - JpegImagePlugin.JpegImageFile._open(self) - self._after_jpeg_open() - - def _after_jpeg_open(self, mpheader=None): - self.mpinfo = mpheader if mpheader is not None else self._getmp() - self.n_frames = 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.n_frames == len(self.__mpoffsets) - del self.info["mpoffset"] # no longer needed - self.is_animated = self.n_frames > 1 - 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: int) -> None: - self._fp.seek(pos) - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - self.fp = self._fp - self.offset = self.__mpoffsets[frame] - - original_exif = self.info.get("exif") - if "exif" in self.info: - del self.info["exif"] - - self.fp.seek(self.offset + 2) # skip SOI marker - if not self.fp.read(2): - msg = "No data found for frame" - raise ValueError(msg) - self.fp.seek(self.offset) - JpegImagePlugin.JpegImageFile._open(self) - if self.info.get("exif") != original_exif: - self._reload_exif() - - self.tile = [("jpeg", (0, 0) + self.size, self.offset, self.tile[0][-1])] - self.__frame = frame - - def tell(self) -> int: - return self.__frame - - @staticmethod - def adopt(jpeg_instance, mpheader=None): - """ - Transform the instance of JpegImageFile into - an instance of MpoImageFile. - After the call, the JpegImageFile is extended - to be an MpoImageFile. - - This is essentially useful when opening a JPEG - file that reveals itself as an MPO, to avoid - double call to _open. - """ - jpeg_instance.__class__ = MpoImageFile - jpeg_instance._after_jpeg_open(mpheader) - return jpeg_instance - - -# --------------------------------------------------------------------- -# 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_save_all(MpoImageFile.format, _save_all) - -Image.register_extension(MpoImageFile.format, ".mpo") - -Image.register_mime(MpoImageFile.format, "image/mpo") diff --git a/.venv/Lib/site-packages/PIL/MspImagePlugin.py b/.venv/Lib/site-packages/PIL/MspImagePlugin.py deleted file mode 100644 index 0a75c86..0000000 --- a/.venv/Lib/site-packages/PIL/MspImagePlugin.py +++ /dev/null @@ -1,200 +0,0 @@ -# -# 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: https://www.fileformat.info/format/mspaint/egff.htm -from __future__ import annotations - -import io -import struct -from typing import IO - -from . import Image, ImageFile -from ._binary import i16le as i16 -from ._binary import o16le as o16 - -# -# read MSP files - - -def _accept(prefix: bytes) -> bool: - 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) -> None: - # Header - assert self.fp is not None - - s = self.fp.read(32) - if not _accept(s): - msg = "not an MSP file" - raise SyntaxError(msg) - - # Header checksum - checksum = 0 - for i in range(0, 32, 2): - checksum = checksum ^ i16(s, i) - if checksum != 0: - msg = "bad MSP checksum" - raise SyntaxError(msg) - - 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 - # https://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: bytes) -> tuple[int, int]: - assert self.fd is not None - - img = io.BytesIO() - blank_line = bytearray((0xFF,) * ((self.state.xsize + 7) // 8)) - try: - self.fd.seek(32) - rowmap = struct.unpack_from( - f"<{self.state.ysize}H", self.fd.read(self.state.ysize * 2) - ) - except struct.error as e: - msg = "Truncated MSP file in row map" - raise OSError(msg) from e - - for x, rowlen in enumerate(rowmap): - try: - if rowlen == 0: - img.write(blank_line) - continue - row = self.fd.read(rowlen) - if len(row) != rowlen: - msg = f"Truncated MSP file, expected {rowlen} bytes on row {x}" - raise OSError(msg) - idx = 0 - while idx < rowlen: - runtype = row[idx] - idx += 1 - if runtype == 0: - (runcount, runval) = struct.unpack_from("Bc", row, idx) - img.write(runval * runcount) - idx += 2 - else: - runcount = runtype - img.write(row[idx : idx + runcount]) - idx += runcount - - except struct.error as e: - msg = f"Corrupted MSP file in row {x}" - raise OSError(msg) from e - - self.set_as_raw(img.getvalue(), ("1", 0, 1)) - - return -1, 0 - - -Image.register_decoder("MSP", MspDecoder) - - -# -# write MSP files (uncompressed only) - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode != "1": - msg = f"cannot write mode {im.mode} as MSP" - raise OSError(msg) - - # 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/.venv/Lib/site-packages/PIL/PSDraw.py b/.venv/Lib/site-packages/PIL/PSDraw.py deleted file mode 100644 index 673eae1..0000000 --- a/.venv/Lib/site-packages/PIL/PSDraw.py +++ /dev/null @@ -1,237 +0,0 @@ -# -# 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 __future__ import annotations - -import sys -from typing import TYPE_CHECKING - -from . import EpsImagePlugin - -## -# Simple PostScript graphics interface. - - -class PSDraw: - """ - Sets up printing to the given file. If ``fp`` is omitted, - ``sys.stdout.buffer`` or ``sys.stdout`` is assumed. - """ - - def __init__(self, fp=None): - if not fp: - try: - fp = sys.stdout.buffer - except AttributeError: - fp = sys.stdout - self.fp = fp - - def begin_document(self, id: str | None = None) -> None: - """Set up printing of a document. (Write PostScript DSC header.)""" - # FIXME: incomplete - self.fp.write( - b"%!PS-Adobe-3.0\n" - b"save\n" - b"/showpage { } def\n" - b"%%EndComments\n" - b"%%BeginDocument\n" - ) - # self.fp.write(ERROR_PS) # debugging! - self.fp.write(EDROFF_PS) - self.fp.write(VDI_PS) - self.fp.write(b"%%EndProlog\n") - self.isofont: dict[bytes, int] = {} - - def end_document(self) -> None: - """Ends printing. (Write PostScript DSC footer.)""" - self.fp.write(b"%%EndDocument\nrestore showpage\n%%End\n") - if hasattr(self.fp, "flush"): - self.fp.flush() - - def setfont(self, font: str, size: int) -> None: - """ - Selects which font to use. - - :param font: A PostScript font name - :param size: Size in points. - """ - font_bytes = bytes(font, "UTF-8") - if font_bytes not in self.isofont: - # reencode font - self.fp.write( - b"/PSDraw-%s ISOLatin1Encoding /%s E\n" % (font_bytes, font_bytes) - ) - self.isofont[font_bytes] = 1 - # rough - self.fp.write(b"/F0 %d /PSDraw-%s F\n" % (size, font_bytes)) - - def line(self, xy0: tuple[int, int], xy1: tuple[int, int]) -> None: - """ - 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). - """ - self.fp.write(b"%d %d %d %d Vl\n" % (*xy0, *xy1)) - - def rectangle(self, box: tuple[int, int, int, int]) -> None: - """ - Draws a rectangle. - - :param box: A tuple of four integers, specifying left, bottom, width and - height. - """ - self.fp.write(b"%d %d M 0 %d %d Vr\n" % box) - - def text(self, xy: tuple[int, int], text: str) -> None: - """ - Draws text at the given position. You must use - :py:meth:`~PIL.PSDraw.PSDraw.setfont` before calling this method. - """ - text_bytes = bytes(text, "UTF-8") - text_bytes = b"\\(".join(text_bytes.split(b"(")) - text_bytes = b"\\)".join(text_bytes.split(b")")) - self.fp.write(b"%d %d M (%s) S\n" % (xy + (text_bytes,))) - - if TYPE_CHECKING: - from . import Image - - def image( - self, box: tuple[int, int, int, int], im: Image.Image, dpi: int | None = None - ) -> 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 # grayscale - # image size (on paper) - x = im.size[0] * 72 / dpi - y = 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(b"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(b"%f %f scale\n" % (sx, sy)) - EpsImagePlugin._save(im, self.fp, "", 0) - self.fp.write(b"\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 = b"""\ -/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 = b"""\ -/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 0 exch rlineto - exch neg 0 rlineto - 0 exch neg rlineto - setgray fill } 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 = b"""\ -/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/.venv/Lib/site-packages/PIL/PaletteFile.py b/.venv/Lib/site-packages/PIL/PaletteFile.py deleted file mode 100644 index 81652e5..0000000 --- a/.venv/Lib/site-packages/PIL/PaletteFile.py +++ /dev/null @@ -1,54 +0,0 @@ -# -# 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 __future__ import annotations - -from typing import IO - -from ._binary import o8 - - -class PaletteFile: - """File handler for Teragon-style palette files.""" - - rawmode = "RGB" - - def __init__(self, fp: IO[bytes]) -> None: - palette = [o8(i) * 3 for i in range(256)] - - while True: - s = fp.readline() - - if not s: - break - if s[:1] == b"#": - continue - if len(s) > 100: - msg = "bad palette file" - raise SyntaxError(msg) - - 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: - palette[i] = o8(r) + o8(g) + o8(b) - - self.palette = b"".join(palette) - - def getpalette(self) -> tuple[bytes, str]: - return self.palette, self.rawmode diff --git a/.venv/Lib/site-packages/PIL/PalmImagePlugin.py b/.venv/Lib/site-packages/PIL/PalmImagePlugin.py deleted file mode 100644 index 1735070..0000000 --- a/.venv/Lib/site-packages/PIL/PalmImagePlugin.py +++ /dev/null @@ -1,229 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# - -## -# Image plugin for Palm pixmap images (output only). -## -from __future__ import annotations - -from typing import IO - -from . import Image, ImageFile -from ._binary import o8 -from ._binary import o16be as o16b - -# fmt: off -_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)) -# fmt: on - - -# so build a prototype image to be used for palette resampling -def build_prototype_image() -> Image.Image: - image = Image.new("L", (1, len(_Palm8BitColormapValues))) - image.putdata(list(range(len(_Palm8BitColormapValues)))) - palettedata: tuple[int, ...] = () - 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: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - 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": - if im.encoderinfo.get("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 grayscale from white (0) to black (1) - bpp = im.encoderinfo["bpp"] - maxval = (1 << bpp) - 1 - shift = 8 - bpp - im = im.point(lambda x: maxval - (x >> shift)) - elif im.info.get("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"] - maxval = (1 << bpp) - 1 - im = im.point(lambda x: maxval - (x & maxval)) - else: - msg = f"cannot write mode {im.mode} as Palm" - raise OSError(msg) - - # we ignore the palette here - im._mode = "P" - rawmode = f"P;{bpp}" - version = 1 - - elif im.mode == "1": - # monochrome -- write it inverted, as is the Palm standard - rawmode = "1;I" - bpp = 1 - version = 0 - - else: - msg = f"cannot write mode {im.mode} as Palm" - raise OSError(msg) - - # - # 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/.venv/Lib/site-packages/PIL/PcdImagePlugin.py b/.venv/Lib/site-packages/PIL/PcdImagePlugin.py deleted file mode 100644 index 1cd5c4a..0000000 --- a/.venv/Lib/site-packages/PIL/PcdImagePlugin.py +++ /dev/null @@ -1,66 +0,0 @@ -# -# 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 __future__ import annotations - -from . import Image, ImageFile - -## -# 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) -> None: - # rough - assert self.fp is not None - - self.fp.seek(2048) - s = self.fp.read(2048) - - if s[:4] != b"PCD_": - msg = "not a PCD file" - raise SyntaxError(msg) - - orientation = 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) -> None: - if self.tile_post_rotate: - # Handle rotated PCDs - assert self.im is not None - - 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/.venv/Lib/site-packages/PIL/PcfFontFile.py b/.venv/Lib/site-packages/PIL/PcfFontFile.py deleted file mode 100644 index 0d1968b..0000000 --- a/.venv/Lib/site-packages/PIL/PcfFontFile.py +++ /dev/null @@ -1,254 +0,0 @@ -# -# 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 __future__ import annotations - -import io -from typing import BinaryIO, Callable - -from . import FontFile, Image -from ._binary import i8 -from ._binary import i16be as b16 -from ._binary import i16le as l16 -from ._binary import i32be as b32 -from ._binary import i32le as l32 - -# -------------------------------------------------------------------- -# 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: list[Callable[[int], int]] = [ - 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: bytes, o: int) -> bytes: - return s[o : s.index(b"\0", o)] - - -class PcfFontFile(FontFile.FontFile): - """Font file plugin for the X11 PCF format.""" - - name = "name" - - def __init__(self, fp: BinaryIO, charset_encoding: str = "iso8859-1"): - self.charset_encoding = charset_encoding - - magic = l32(fp.read(4)) - if magic != PCF_MAGIC: - msg = "not a PCF file" - raise SyntaxError(msg) - - super().__init__() - - 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, ix in enumerate(encoding): - if ix is not None: - ( - xsize, - ysize, - left, - right, - width, - ascent, - descent, - attributes, - ) = metrics[ix] - self.glyph[ch] = ( - (width, 0), - (left, descent - ysize, xsize + left, descent), - (0, 0, xsize, ysize), - bitmaps[ix], - ) - - def _getformat( - self, tag: int - ) -> tuple[BinaryIO, int, Callable[[bytes], int], Callable[[bytes], int]]: - 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) -> dict[bytes, bytes | int]: - # - # font properties - - properties = {} - - fp, format, i16, i32 = self._getformat(PCF_PROPERTIES) - - nprops = i32(fp.read(4)) - - # read property description - p = [(i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4))) for _ in range(nprops)] - - if nprops & 3: - fp.seek(4 - (nprops & 3), io.SEEK_CUR) # pad - - data = fp.read(i32(fp.read(4))) - - for k, s, v in p: - property_value: bytes | int = sz(data, v) if s else v - properties[sz(data, k)] = property_value - - return properties - - def _load_metrics(self) -> list[tuple[int, int, int, int, int, int, int, int]]: - # - # font metrics - - metrics: list[tuple[int, int, int, int, int, int, int, int]] = [] - - 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: list[tuple[int, int, int, int, int, int, int, int]] - ) -> list[Image.Image]: - # - # bitmap data - - fp, format, i16, i32 = self._getformat(PCF_BITMAPS) - - nbitmaps = i32(fp.read(4)) - - if nbitmaps != len(metrics): - msg = "Wrong number of bitmaps" - raise OSError(msg) - - offsets = [i32(fp.read(4)) for _ in range(nbitmaps)] - - bitmap_sizes = [i32(fp.read(4)) for _ in range(4)] - - # byteorder = format & 4 # non-zero => MSB - bitorder = format & 8 # non-zero => MSB - padindex = format & 3 - - bitmapsize = bitmap_sizes[padindex] - offsets.append(bitmapsize) - - data = fp.read(bitmapsize) - - pad = BYTES_PER_ROW[padindex] - mode = "1;R" - if bitorder: - mode = "1" - - bitmaps = [] - for i in range(nbitmaps): - xsize, ysize = metrics[i][:2] - b, e = offsets[i : i + 2] - bitmaps.append( - Image.frombytes("1", (xsize, ysize), data[b:e], "raw", mode, pad(xsize)) - ) - - return bitmaps - - def _load_encoding(self) -> list[int | None]: - fp, format, i16, i32 = self._getformat(PCF_BDF_ENCODINGS) - - first_col, last_col = i16(fp.read(2)), i16(fp.read(2)) - first_row, last_row = i16(fp.read(2)), i16(fp.read(2)) - - i16(fp.read(2)) # default - - nencoding = (last_col - first_col + 1) * (last_row - first_row + 1) - - # map character code to bitmap index - encoding: list[int | None] = [None] * min(256, nencoding) - - encoding_offsets = [i16(fp.read(2)) for _ in range(nencoding)] - - for i in range(first_col, len(encoding)): - try: - encoding_offset = encoding_offsets[ - ord(bytearray([i]).decode(self.charset_encoding)) - ] - if encoding_offset != 0xFFFF: - encoding[i] = encoding_offset - except UnicodeDecodeError: - # character is not supported in selected encoding - pass - - return encoding diff --git a/.venv/Lib/site-packages/PIL/PcxImagePlugin.py b/.venv/Lib/site-packages/PIL/PcxImagePlugin.py deleted file mode 100644 index dd42003..0000000 --- a/.venv/Lib/site-packages/PIL/PcxImagePlugin.py +++ /dev/null @@ -1,227 +0,0 @@ -# -# 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. -# -from __future__ import annotations - -import io -import logging -from typing import IO - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import o8 -from ._binary import o16le as o16 - -logger = logging.getLogger(__name__) - - -def _accept(prefix: bytes) -> bool: - return prefix[0] == 10 and prefix[1] in [0, 2, 3, 5] - - -## -# Image plugin for Paintbrush images. - - -class PcxImageFile(ImageFile.ImageFile): - format = "PCX" - format_description = "Paintbrush" - - def _open(self) -> None: - # header - assert self.fp is not None - - s = self.fp.read(128) - if not _accept(s): - msg = "not a PCX file" - raise SyntaxError(msg) - - # 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]: - msg = "bad PCX image size" - raise SyntaxError(msg) - logger.debug("BBox: %s %s %s %s", *bbox) - - # format - version = s[1] - bits = s[3] - planes = s[65] - provided_stride = i16(s, 66) - logger.debug( - "PCX version %s, bits %s, planes %s, stride %s", - version, - bits, - planes, - provided_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, io.SEEK_END) - s = self.fp.read(769) - if len(s) == 769 and s[0] == 12: - # check if the palette is linear grayscale - 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: - msg = "unknown PCX mode" - raise OSError(msg) - - self._mode = mode - self._size = bbox[2] - bbox[0], bbox[3] - bbox[1] - - # Don't trust the passed in stride. - # Calculate the approximate position for ourselves. - # CVE-2020-35653 - stride = (self._size[0] * bits + 7) // 8 - - # While the specification states that this must be even, - # not all images follow this - if provided_stride != stride: - stride += stride % 2 - - 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: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - try: - version, bits, planes, rawmode = SAVE[im.mode] - except KeyError as e: - msg = f"Cannot save {im.mode} images as PCX" - raise ValueError(msg) from e - - # 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 - assert im.im is not None - - fp.write(o8(12)) - palette = im.im.getpalette("RGB", "RGB") - palette += b"\x00" * (768 - len(palette)) - fp.write(palette) # 768 bytes - elif im.mode == "L": - # grayscale 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") - -Image.register_mime(PcxImageFile.format, "image/x-pcx") diff --git a/.venv/Lib/site-packages/PIL/PdfImagePlugin.py b/.venv/Lib/site-packages/PIL/PdfImagePlugin.py deleted file mode 100644 index f0da1e0..0000000 --- a/.venv/Lib/site-packages/PIL/PdfImagePlugin.py +++ /dev/null @@ -1,304 +0,0 @@ -# -# 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 __future__ import annotations - -import io -import math -import os -import time -from typing import IO - -from . import Image, ImageFile, ImageSequence, PdfParser, __version__, features - -# -# -------------------------------------------------------------------- - -# object ids: -# 1. catalogue -# 2. pages -# 3. image -# 4. page -# 5. page contents - - -def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - _save(im, fp, filename, save_all=True) - - -## -# (Internal) Image save plugin for the PDF format. - - -def _write_image(im, filename, existing_pdf, image_refs): - # FIXME: Should replace ASCIIHexDecode with RunLengthDecode - # (packbits) or LZWDecode (tiff/lzw compression). Note that - # PDF 1.2 also supports Flatedecode (zip compression). - - params = None - decode = None - - # - # Get image characteristics - - width, height = im.size - - dict_obj = {"BitsPerComponent": 8} - if im.mode == "1": - if features.check("libtiff"): - filter = "CCITTFaxDecode" - dict_obj["BitsPerComponent"] = 1 - params = PdfParser.PdfArray( - [ - PdfParser.PdfDict( - { - "K": -1, - "BlackIs1": True, - "Columns": width, - "Rows": height, - } - ) - ] - ) - else: - filter = "DCTDecode" - dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceGray") - procset = "ImageB" # grayscale - elif im.mode == "L": - filter = "DCTDecode" - # params = f"<< /Predictor 15 /Columns {width-2} >>" - dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceGray") - procset = "ImageB" # grayscale - elif im.mode == "LA": - filter = "JPXDecode" - # params = f"<< /Predictor 15 /Columns {width-2} >>" - procset = "ImageB" # grayscale - dict_obj["SMaskInData"] = 1 - elif im.mode == "P": - filter = "ASCIIHexDecode" - palette = im.getpalette() - dict_obj["ColorSpace"] = [ - PdfParser.PdfName("Indexed"), - PdfParser.PdfName("DeviceRGB"), - len(palette) // 3 - 1, - PdfParser.PdfBinary(palette), - ] - procset = "ImageI" # indexed color - - if "transparency" in im.info: - smask = im.convert("LA").getchannel("A") - smask.encoderinfo = {} - - image_ref = _write_image(smask, filename, existing_pdf, image_refs)[0] - dict_obj["SMask"] = image_ref - elif im.mode == "RGB": - filter = "DCTDecode" - dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceRGB") - procset = "ImageC" # color images - elif im.mode == "RGBA": - filter = "JPXDecode" - procset = "ImageC" # color images - dict_obj["SMaskInData"] = 1 - elif im.mode == "CMYK": - filter = "DCTDecode" - dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceCMYK") - procset = "ImageC" # color images - decode = [1, 0, 1, 0, 1, 0, 1, 0] - else: - msg = f"cannot save mode {im.mode}" - raise ValueError(msg) - - # - # image - - op = io.BytesIO() - - if filter == "ASCIIHexDecode": - ImageFile._save(im, op, [("hex", (0, 0) + im.size, 0, im.mode)]) - elif filter == "CCITTFaxDecode": - im.save( - op, - "TIFF", - compression="group4", - # use a single strip - strip_size=math.ceil(width / 8) * height, - ) - elif filter == "DCTDecode": - Image.SAVE["JPEG"](im, op, filename) - elif filter == "JPXDecode": - del dict_obj["BitsPerComponent"] - Image.SAVE["JPEG2000"](im, op, filename) - else: - msg = f"unsupported PDF filter ({filter})" - raise ValueError(msg) - - stream = op.getvalue() - if filter == "CCITTFaxDecode": - stream = stream[8:] - filter = PdfParser.PdfArray([PdfParser.PdfName(filter)]) - else: - filter = PdfParser.PdfName(filter) - - image_ref = image_refs.pop(0) - existing_pdf.write_obj( - image_ref, - stream=stream, - Type=PdfParser.PdfName("XObject"), - Subtype=PdfParser.PdfName("Image"), - Width=width, # * 72.0 / x_resolution, - Height=height, # * 72.0 / y_resolution, - Filter=filter, - Decode=decode, - DecodeParms=params, - **dict_obj, - ) - - return image_ref, procset - - -def _save(im, fp, filename, save_all=False): - is_appending = im.encoderinfo.get("append", False) - if is_appending: - existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="r+b") - else: - existing_pdf = PdfParser.PdfParser(f=fp, filename=filename, mode="w+b") - - dpi = im.encoderinfo.get("dpi") - if dpi: - x_resolution = dpi[0] - y_resolution = dpi[1] - else: - x_resolution = y_resolution = im.encoderinfo.get("resolution", 72.0) - - info = { - "title": ( - None if is_appending else os.path.splitext(os.path.basename(filename))[0] - ), - "author": None, - "subject": None, - "keywords": None, - "creator": None, - "producer": None, - "creationDate": None if is_appending else time.gmtime(), - "modDate": None if is_appending else time.gmtime(), - } - for k, default in info.items(): - v = im.encoderinfo.get(k) if k in im.encoderinfo else default - if v: - existing_pdf.info[k[0].upper() + k[1:]] = v - - # - # make sure image data is available - im.load() - - existing_pdf.start_writing() - existing_pdf.write_header() - existing_pdf.write_comment(f"created by Pillow {__version__} PDF driver") - - # - # pages - ims = [im] - if save_all: - append_images = im.encoderinfo.get("append_images", []) - for append_im in append_images: - append_im.encoderinfo = im.encoderinfo.copy() - ims.append(append_im) - number_of_pages = 0 - image_refs = [] - page_refs = [] - contents_refs = [] - for im in ims: - im_number_of_pages = 1 - if save_all: - try: - im_number_of_pages = im.n_frames - except AttributeError: - # Image format does not have n_frames. - # It is a single frame image - pass - number_of_pages += im_number_of_pages - for i in range(im_number_of_pages): - image_refs.append(existing_pdf.next_object_id(0)) - if im.mode == "P" and "transparency" in im.info: - image_refs.append(existing_pdf.next_object_id(0)) - - page_refs.append(existing_pdf.next_object_id(0)) - contents_refs.append(existing_pdf.next_object_id(0)) - existing_pdf.pages.append(page_refs[-1]) - - # - # catalog and list of pages - existing_pdf.write_catalog() - - page_number = 0 - for im_sequence in ims: - im_pages = ImageSequence.Iterator(im_sequence) if save_all else [im_sequence] - for im in im_pages: - image_ref, procset = _write_image(im, filename, existing_pdf, image_refs) - - # - # page - - existing_pdf.write_page( - page_refs[page_number], - Resources=PdfParser.PdfDict( - ProcSet=[PdfParser.PdfName("PDF"), PdfParser.PdfName(procset)], - XObject=PdfParser.PdfDict(image=image_ref), - ), - MediaBox=[ - 0, - 0, - im.width * 72.0 / x_resolution, - im.height * 72.0 / y_resolution, - ], - Contents=contents_refs[page_number], - ) - - # - # page contents - - page_contents = b"q %f 0 0 %f 0 0 cm /image Do Q\n" % ( - im.width * 72.0 / x_resolution, - im.height * 72.0 / y_resolution, - ) - - existing_pdf.write_obj(contents_refs[page_number], stream=page_contents) - - page_number += 1 - - # - # trailer - existing_pdf.write_xref_and_trailer() - if hasattr(fp, "flush"): - fp.flush() - existing_pdf.close() - - -# -# -------------------------------------------------------------------- - - -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/.venv/Lib/site-packages/PIL/PdfParser.py b/.venv/Lib/site-packages/PIL/PdfParser.py deleted file mode 100644 index 9e22313..0000000 --- a/.venv/Lib/site-packages/PIL/PdfParser.py +++ /dev/null @@ -1,1003 +0,0 @@ -from __future__ import annotations - -import calendar -import codecs -import collections -import mmap -import os -import re -import time -import zlib -from typing import TYPE_CHECKING, Any, List, NamedTuple, Union - - -# see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set -# on page 656 -def encode_text(s: str) -> bytes: - return codecs.BOM_UTF16_BE + s.encode("utf_16_be") - - -PDFDocEncoding = { - 0x16: "\u0017", - 0x18: "\u02D8", - 0x19: "\u02C7", - 0x1A: "\u02C6", - 0x1B: "\u02D9", - 0x1C: "\u02DD", - 0x1D: "\u02DB", - 0x1E: "\u02DA", - 0x1F: "\u02DC", - 0x80: "\u2022", - 0x81: "\u2020", - 0x82: "\u2021", - 0x83: "\u2026", - 0x84: "\u2014", - 0x85: "\u2013", - 0x86: "\u0192", - 0x87: "\u2044", - 0x88: "\u2039", - 0x89: "\u203A", - 0x8A: "\u2212", - 0x8B: "\u2030", - 0x8C: "\u201E", - 0x8D: "\u201C", - 0x8E: "\u201D", - 0x8F: "\u2018", - 0x90: "\u2019", - 0x91: "\u201A", - 0x92: "\u2122", - 0x93: "\uFB01", - 0x94: "\uFB02", - 0x95: "\u0141", - 0x96: "\u0152", - 0x97: "\u0160", - 0x98: "\u0178", - 0x99: "\u017D", - 0x9A: "\u0131", - 0x9B: "\u0142", - 0x9C: "\u0153", - 0x9D: "\u0161", - 0x9E: "\u017E", - 0xA0: "\u20AC", -} - - -def decode_text(b): - if b[: len(codecs.BOM_UTF16_BE)] == codecs.BOM_UTF16_BE: - return b[len(codecs.BOM_UTF16_BE) :].decode("utf_16_be") - else: - return "".join(PDFDocEncoding.get(byte, chr(byte)) for byte in b) - - -class PdfFormatError(RuntimeError): - """An error that probably indicates a syntactic or semantic error in the - PDF file structure""" - - pass - - -def check_format_condition(condition: bool, error_message: str) -> None: - if not condition: - raise PdfFormatError(error_message) - - -class IndirectReferenceTuple(NamedTuple): - object_id: int - generation: int - - -class IndirectReference(IndirectReferenceTuple): - def __str__(self) -> str: - return f"{self.object_id} {self.generation} R" - - def __bytes__(self) -> bytes: - return self.__str__().encode("us-ascii") - - def __eq__(self, other: object) -> bool: - if self.__class__ is not other.__class__: - return False - assert isinstance(other, IndirectReference) - return other.object_id == self.object_id and other.generation == self.generation - - def __ne__(self, other): - return not (self == other) - - def __hash__(self) -> int: - return hash((self.object_id, self.generation)) - - -class IndirectObjectDef(IndirectReference): - def __str__(self) -> str: - return f"{self.object_id} {self.generation} obj" - - -class XrefTable: - def __init__(self): - self.existing_entries = {} # object ID => (offset, generation) - self.new_entries = {} # object ID => (offset, generation) - self.deleted_entries = {0: 65536} # object ID => generation - self.reading_finished = False - - def __setitem__(self, key, value): - if self.reading_finished: - self.new_entries[key] = value - else: - self.existing_entries[key] = value - if key in self.deleted_entries: - del self.deleted_entries[key] - - def __getitem__(self, key): - try: - return self.new_entries[key] - except KeyError: - return self.existing_entries[key] - - def __delitem__(self, key): - if key in self.new_entries: - generation = self.new_entries[key][1] + 1 - del self.new_entries[key] - self.deleted_entries[key] = generation - elif key in self.existing_entries: - generation = self.existing_entries[key][1] + 1 - self.deleted_entries[key] = generation - elif key in self.deleted_entries: - generation = self.deleted_entries[key] - else: - msg = f"object ID {key} cannot be deleted because it doesn't exist" - raise IndexError(msg) - - def __contains__(self, key): - return key in self.existing_entries or key in self.new_entries - - def __len__(self) -> int: - return len( - set(self.existing_entries.keys()) - | set(self.new_entries.keys()) - | set(self.deleted_entries.keys()) - ) - - def keys(self): - return ( - set(self.existing_entries.keys()) - set(self.deleted_entries.keys()) - ) | set(self.new_entries.keys()) - - def write(self, f): - keys = sorted(set(self.new_entries.keys()) | set(self.deleted_entries.keys())) - deleted_keys = sorted(set(self.deleted_entries.keys())) - startxref = f.tell() - f.write(b"xref\n") - while keys: - # find a contiguous sequence of object IDs - prev = None - for index, key in enumerate(keys): - if prev is None or prev + 1 == key: - prev = key - else: - contiguous_keys = keys[:index] - keys = keys[index:] - break - else: - contiguous_keys = keys - keys = None - f.write(b"%d %d\n" % (contiguous_keys[0], len(contiguous_keys))) - for object_id in contiguous_keys: - if object_id in self.new_entries: - f.write(b"%010d %05d n \n" % self.new_entries[object_id]) - else: - this_deleted_object_id = deleted_keys.pop(0) - check_format_condition( - object_id == this_deleted_object_id, - f"expected the next deleted object ID to be {object_id}, " - f"instead found {this_deleted_object_id}", - ) - try: - next_in_linked_list = deleted_keys[0] - except IndexError: - next_in_linked_list = 0 - f.write( - b"%010d %05d f \n" - % (next_in_linked_list, self.deleted_entries[object_id]) - ) - return startxref - - -class PdfName: - def __init__(self, name): - if isinstance(name, PdfName): - self.name = name.name - elif isinstance(name, bytes): - self.name = name - else: - self.name = name.encode("us-ascii") - - def name_as_str(self) -> str: - return self.name.decode("us-ascii") - - def __eq__(self, other): - return ( - isinstance(other, PdfName) and other.name == self.name - ) or other == self.name - - def __hash__(self) -> int: - return hash(self.name) - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({repr(self.name)})" - - @classmethod - def from_pdf_stream(cls, data): - return cls(PdfParser.interpret_name(data)) - - allowed_chars = set(range(33, 127)) - {ord(c) for c in "#%/()<>[]{}"} - - def __bytes__(self) -> bytes: - result = bytearray(b"/") - for b in self.name: - if b in self.allowed_chars: - result.append(b) - else: - result.extend(b"#%02X" % b) - return bytes(result) - - -class PdfArray(List[Any]): - def __bytes__(self) -> bytes: - return b"[ " + b" ".join(pdf_repr(x) for x in self) + b" ]" - - -if TYPE_CHECKING: - _DictBase = collections.UserDict[Union[str, bytes], Any] -else: - _DictBase = collections.UserDict - - -class PdfDict(_DictBase): - def __setattr__(self, key, value): - if key == "data": - collections.UserDict.__setattr__(self, key, value) - else: - self[key.encode("us-ascii")] = value - - def __getattr__(self, key): - try: - value = self[key.encode("us-ascii")] - except KeyError as e: - raise AttributeError(key) from e - if isinstance(value, bytes): - value = decode_text(value) - if key.endswith("Date"): - if value.startswith("D:"): - value = value[2:] - - relationship = "Z" - if len(value) > 17: - relationship = value[14] - offset = int(value[15:17]) * 60 - if len(value) > 20: - offset += int(value[18:20]) - - format = "%Y%m%d%H%M%S"[: len(value) - 2] - value = time.strptime(value[: len(format) + 2], format) - if relationship in ["+", "-"]: - offset *= 60 - if relationship == "+": - offset *= -1 - value = time.gmtime(calendar.timegm(value) + offset) - return value - - def __bytes__(self) -> bytes: - out = bytearray(b"<<") - for key, value in self.items(): - if value is None: - continue - value = pdf_repr(value) - out.extend(b"\n") - out.extend(bytes(PdfName(key))) - out.extend(b" ") - out.extend(value) - out.extend(b"\n>>") - return bytes(out) - - -class PdfBinary: - def __init__(self, data): - self.data = data - - def __bytes__(self) -> bytes: - return b"<%s>" % b"".join(b"%02X" % b for b in self.data) - - -class PdfStream: - def __init__(self, dictionary, buf): - self.dictionary = dictionary - self.buf = buf - - def decode(self): - try: - filter = self.dictionary.Filter - except AttributeError: - return self.buf - if filter == b"FlateDecode": - try: - expected_length = self.dictionary.DL - except AttributeError: - expected_length = self.dictionary.Length - return zlib.decompress(self.buf, bufsize=int(expected_length)) - else: - msg = f"stream filter {repr(self.dictionary.Filter)} unknown/unsupported" - raise NotImplementedError(msg) - - -def pdf_repr(x): - if x is True: - return b"true" - elif x is False: - return b"false" - elif x is None: - return b"null" - elif isinstance(x, (PdfName, PdfDict, PdfArray, PdfBinary)): - return bytes(x) - elif isinstance(x, (int, float)): - return str(x).encode("us-ascii") - elif isinstance(x, time.struct_time): - return b"(D:" + time.strftime("%Y%m%d%H%M%SZ", x).encode("us-ascii") + b")" - elif isinstance(x, dict): - return bytes(PdfDict(x)) - elif isinstance(x, list): - return bytes(PdfArray(x)) - elif isinstance(x, str): - return pdf_repr(encode_text(x)) - elif isinstance(x, bytes): - # XXX escape more chars? handle binary garbage - x = x.replace(b"\\", b"\\\\") - x = x.replace(b"(", b"\\(") - x = x.replace(b")", b"\\)") - return b"(" + x + b")" - else: - return bytes(x) - - -class PdfParser: - """Based on - https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf - Supports PDF up to 1.4 - """ - - def __init__(self, filename=None, f=None, buf=None, start_offset=0, mode="rb"): - if buf and f: - msg = "specify buf or f or filename, but not both buf and f" - raise RuntimeError(msg) - self.filename = filename - self.buf = buf - self.f = f - self.start_offset = start_offset - self.should_close_buf = False - self.should_close_file = False - if filename is not None and f is None: - self.f = f = open(filename, mode) - self.should_close_file = True - if f is not None: - self.buf = buf = self.get_buf_from_file(f) - self.should_close_buf = True - if not filename and hasattr(f, "name"): - self.filename = f.name - self.cached_objects = {} - if buf: - self.read_pdf_info() - else: - self.file_size_total = self.file_size_this = 0 - self.root = PdfDict() - self.root_ref = None - self.info = PdfDict() - self.info_ref = None - self.page_tree_root = {} - self.pages = [] - self.orig_pages = [] - self.pages_ref = None - self.last_xref_section_offset = None - self.trailer_dict = {} - self.xref_table = XrefTable() - self.xref_table.reading_finished = True - if f: - self.seek_end() - - def __enter__(self) -> PdfParser: - return self - - def __exit__(self, *args: object) -> None: - self.close() - - def start_writing(self) -> None: - self.close_buf() - self.seek_end() - - def close_buf(self) -> None: - try: - self.buf.close() - except AttributeError: - pass - self.buf = None - - def close(self) -> None: - if self.should_close_buf: - self.close_buf() - if self.f is not None and self.should_close_file: - self.f.close() - self.f = None - - def seek_end(self) -> None: - self.f.seek(0, os.SEEK_END) - - def write_header(self) -> None: - self.f.write(b"%PDF-1.4\n") - - def write_comment(self, s): - self.f.write(f"% {s}\n".encode()) - - def write_catalog(self) -> IndirectReference: - self.del_root() - self.root_ref = self.next_object_id(self.f.tell()) - self.pages_ref = self.next_object_id(0) - self.rewrite_pages() - self.write_obj(self.root_ref, Type=PdfName(b"Catalog"), Pages=self.pages_ref) - self.write_obj( - self.pages_ref, - Type=PdfName(b"Pages"), - Count=len(self.pages), - Kids=self.pages, - ) - return self.root_ref - - def rewrite_pages(self) -> None: - pages_tree_nodes_to_delete = [] - for i, page_ref in enumerate(self.orig_pages): - page_info = self.cached_objects[page_ref] - del self.xref_table[page_ref.object_id] - pages_tree_nodes_to_delete.append(page_info[PdfName(b"Parent")]) - if page_ref not in self.pages: - # the page has been deleted - continue - # make dict keys into strings for passing to write_page - stringified_page_info = {} - for key, value in page_info.items(): - # key should be a PdfName - stringified_page_info[key.name_as_str()] = value - stringified_page_info["Parent"] = self.pages_ref - new_page_ref = self.write_page(None, **stringified_page_info) - for j, cur_page_ref in enumerate(self.pages): - if cur_page_ref == page_ref: - # replace the page reference with the new one - self.pages[j] = new_page_ref - # delete redundant Pages tree nodes from xref table - for pages_tree_node_ref in pages_tree_nodes_to_delete: - while pages_tree_node_ref: - pages_tree_node = self.cached_objects[pages_tree_node_ref] - if pages_tree_node_ref.object_id in self.xref_table: - del self.xref_table[pages_tree_node_ref.object_id] - pages_tree_node_ref = pages_tree_node.get(b"Parent", None) - self.orig_pages = [] - - def write_xref_and_trailer(self, new_root_ref=None): - if new_root_ref: - self.del_root() - self.root_ref = new_root_ref - if self.info: - self.info_ref = self.write_obj(None, self.info) - start_xref = self.xref_table.write(self.f) - num_entries = len(self.xref_table) - trailer_dict = {b"Root": self.root_ref, b"Size": num_entries} - if self.last_xref_section_offset is not None: - trailer_dict[b"Prev"] = self.last_xref_section_offset - if self.info: - trailer_dict[b"Info"] = self.info_ref - self.last_xref_section_offset = start_xref - self.f.write( - b"trailer\n" - + bytes(PdfDict(trailer_dict)) - + b"\nstartxref\n%d\n%%%%EOF" % start_xref - ) - - def write_page(self, ref, *objs, **dict_obj): - if isinstance(ref, int): - ref = self.pages[ref] - if "Type" not in dict_obj: - dict_obj["Type"] = PdfName(b"Page") - if "Parent" not in dict_obj: - dict_obj["Parent"] = self.pages_ref - return self.write_obj(ref, *objs, **dict_obj) - - def write_obj(self, ref, *objs, **dict_obj): - f = self.f - if ref is None: - ref = self.next_object_id(f.tell()) - else: - self.xref_table[ref.object_id] = (f.tell(), ref.generation) - f.write(bytes(IndirectObjectDef(*ref))) - stream = dict_obj.pop("stream", None) - if stream is not None: - dict_obj["Length"] = len(stream) - if dict_obj: - f.write(pdf_repr(dict_obj)) - for obj in objs: - f.write(pdf_repr(obj)) - if stream is not None: - f.write(b"stream\n") - f.write(stream) - f.write(b"\nendstream\n") - f.write(b"endobj\n") - return ref - - def del_root(self) -> None: - if self.root_ref is None: - return - del self.xref_table[self.root_ref.object_id] - del self.xref_table[self.root[b"Pages"].object_id] - - @staticmethod - def get_buf_from_file(f): - if hasattr(f, "getbuffer"): - return f.getbuffer() - elif hasattr(f, "getvalue"): - return f.getvalue() - else: - try: - return mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) - except ValueError: # cannot mmap an empty file - return b"" - - def read_pdf_info(self) -> None: - self.file_size_total = len(self.buf) - self.file_size_this = self.file_size_total - self.start_offset - self.read_trailer() - self.root_ref = self.trailer_dict[b"Root"] - self.info_ref = self.trailer_dict.get(b"Info", None) - self.root = PdfDict(self.read_indirect(self.root_ref)) - if self.info_ref is None: - self.info = PdfDict() - else: - self.info = PdfDict(self.read_indirect(self.info_ref)) - check_format_condition(b"Type" in self.root, "/Type missing in Root") - check_format_condition( - self.root[b"Type"] == b"Catalog", "/Type in Root is not /Catalog" - ) - check_format_condition(b"Pages" in self.root, "/Pages missing in Root") - check_format_condition( - isinstance(self.root[b"Pages"], IndirectReference), - "/Pages in Root is not an indirect reference", - ) - self.pages_ref = self.root[b"Pages"] - self.page_tree_root = self.read_indirect(self.pages_ref) - self.pages = self.linearize_page_tree(self.page_tree_root) - # save the original list of page references - # in case the user modifies, adds or deletes some pages - # and we need to rewrite the pages and their list - self.orig_pages = self.pages[:] - - def next_object_id(self, offset=None): - try: - # TODO: support reuse of deleted objects - reference = IndirectReference(max(self.xref_table.keys()) + 1, 0) - except ValueError: - reference = IndirectReference(1, 0) - if offset is not None: - self.xref_table[reference.object_id] = (offset, 0) - return reference - - delimiter = rb"[][()<>{}/%]" - delimiter_or_ws = rb"[][()<>{}/%\000\011\012\014\015\040]" - whitespace = rb"[\000\011\012\014\015\040]" - whitespace_or_hex = rb"[\000\011\012\014\015\0400-9a-fA-F]" - whitespace_optional = whitespace + b"*" - whitespace_mandatory = whitespace + b"+" - # No "\012" aka "\n" or "\015" aka "\r": - whitespace_optional_no_nl = rb"[\000\011\014\040]*" - newline_only = rb"[\r\n]+" - newline = whitespace_optional_no_nl + newline_only + whitespace_optional_no_nl - re_trailer_end = re.compile( - whitespace_mandatory - + rb"trailer" - + whitespace_optional - + rb"<<(.*>>)" - + newline - + rb"startxref" - + newline - + rb"([0-9]+)" - + newline - + rb"%%EOF" - + whitespace_optional - + rb"$", - re.DOTALL, - ) - re_trailer_prev = re.compile( - whitespace_optional - + rb"trailer" - + whitespace_optional - + rb"<<(.*?>>)" - + newline - + rb"startxref" - + newline - + rb"([0-9]+)" - + newline - + rb"%%EOF" - + whitespace_optional, - re.DOTALL, - ) - - def read_trailer(self): - search_start_offset = len(self.buf) - 16384 - if search_start_offset < self.start_offset: - search_start_offset = self.start_offset - m = self.re_trailer_end.search(self.buf, search_start_offset) - check_format_condition(m, "trailer end not found") - # make sure we found the LAST trailer - last_match = m - while m: - last_match = m - m = self.re_trailer_end.search(self.buf, m.start() + 16) - if not m: - m = last_match - trailer_data = m.group(1) - self.last_xref_section_offset = int(m.group(2)) - self.trailer_dict = self.interpret_trailer(trailer_data) - self.xref_table = XrefTable() - self.read_xref_table(xref_section_offset=self.last_xref_section_offset) - if b"Prev" in self.trailer_dict: - self.read_prev_trailer(self.trailer_dict[b"Prev"]) - - def read_prev_trailer(self, xref_section_offset): - trailer_offset = self.read_xref_table(xref_section_offset=xref_section_offset) - m = self.re_trailer_prev.search( - self.buf[trailer_offset : trailer_offset + 16384] - ) - check_format_condition(m, "previous trailer not found") - trailer_data = m.group(1) - check_format_condition( - int(m.group(2)) == xref_section_offset, - "xref section offset in previous trailer doesn't match what was expected", - ) - trailer_dict = self.interpret_trailer(trailer_data) - if b"Prev" in trailer_dict: - self.read_prev_trailer(trailer_dict[b"Prev"]) - - re_whitespace_optional = re.compile(whitespace_optional) - re_name = re.compile( - whitespace_optional - + rb"/([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=" - + delimiter_or_ws - + rb")" - ) - re_dict_start = re.compile(whitespace_optional + rb"<<") - re_dict_end = re.compile(whitespace_optional + rb">>" + whitespace_optional) - - @classmethod - def interpret_trailer(cls, trailer_data): - trailer = {} - offset = 0 - while True: - m = cls.re_name.match(trailer_data, offset) - if not m: - m = cls.re_dict_end.match(trailer_data, offset) - check_format_condition( - m and m.end() == len(trailer_data), - "name not found in trailer, remaining data: " - + repr(trailer_data[offset:]), - ) - break - key = cls.interpret_name(m.group(1)) - value, offset = cls.get_value(trailer_data, m.end()) - trailer[key] = value - check_format_condition( - b"Size" in trailer and isinstance(trailer[b"Size"], int), - "/Size not in trailer or not an integer", - ) - check_format_condition( - b"Root" in trailer and isinstance(trailer[b"Root"], IndirectReference), - "/Root not in trailer or not an indirect reference", - ) - return trailer - - re_hashes_in_name = re.compile(rb"([^#]*)(#([0-9a-fA-F]{2}))?") - - @classmethod - def interpret_name(cls, raw, as_text=False): - name = b"" - for m in cls.re_hashes_in_name.finditer(raw): - if m.group(3): - name += m.group(1) + bytearray.fromhex(m.group(3).decode("us-ascii")) - else: - name += m.group(1) - if as_text: - return name.decode("utf-8") - else: - return bytes(name) - - re_null = re.compile(whitespace_optional + rb"null(?=" + delimiter_or_ws + rb")") - re_true = re.compile(whitespace_optional + rb"true(?=" + delimiter_or_ws + rb")") - re_false = re.compile(whitespace_optional + rb"false(?=" + delimiter_or_ws + rb")") - re_int = re.compile( - whitespace_optional + rb"([-+]?[0-9]+)(?=" + delimiter_or_ws + rb")" - ) - re_real = re.compile( - whitespace_optional - + rb"([-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+))(?=" - + delimiter_or_ws - + rb")" - ) - re_array_start = re.compile(whitespace_optional + rb"\[") - re_array_end = re.compile(whitespace_optional + rb"]") - re_string_hex = re.compile( - whitespace_optional + rb"<(" + whitespace_or_hex + rb"*)>" - ) - re_string_lit = re.compile(whitespace_optional + rb"\(") - re_indirect_reference = re.compile( - whitespace_optional - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"R(?=" - + delimiter_or_ws - + rb")" - ) - re_indirect_def_start = re.compile( - whitespace_optional - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"([-+]?[0-9]+)" - + whitespace_mandatory - + rb"obj(?=" - + delimiter_or_ws - + rb")" - ) - re_indirect_def_end = re.compile( - whitespace_optional + rb"endobj(?=" + delimiter_or_ws + rb")" - ) - re_comment = re.compile( - rb"(" + whitespace_optional + rb"%[^\r\n]*" + newline + rb")*" - ) - re_stream_start = re.compile(whitespace_optional + rb"stream\r?\n") - re_stream_end = re.compile( - whitespace_optional + rb"endstream(?=" + delimiter_or_ws + rb")" - ) - - @classmethod - def get_value(cls, data, offset, expect_indirect=None, max_nesting=-1): - if max_nesting == 0: - return None, None - m = cls.re_comment.match(data, offset) - if m: - offset = m.end() - m = cls.re_indirect_def_start.match(data, offset) - if m: - check_format_condition( - int(m.group(1)) > 0, - "indirect object definition: object ID must be greater than 0", - ) - check_format_condition( - int(m.group(2)) >= 0, - "indirect object definition: generation must be non-negative", - ) - check_format_condition( - expect_indirect is None - or expect_indirect - == IndirectReference(int(m.group(1)), int(m.group(2))), - "indirect object definition different than expected", - ) - object, offset = cls.get_value(data, m.end(), max_nesting=max_nesting - 1) - if offset is None: - return object, None - m = cls.re_indirect_def_end.match(data, offset) - check_format_condition(m, "indirect object definition end not found") - return object, m.end() - check_format_condition( - not expect_indirect, "indirect object definition not found" - ) - m = cls.re_indirect_reference.match(data, offset) - if m: - check_format_condition( - int(m.group(1)) > 0, - "indirect object reference: object ID must be greater than 0", - ) - check_format_condition( - int(m.group(2)) >= 0, - "indirect object reference: generation must be non-negative", - ) - return IndirectReference(int(m.group(1)), int(m.group(2))), m.end() - m = cls.re_dict_start.match(data, offset) - if m: - offset = m.end() - result = {} - m = cls.re_dict_end.match(data, offset) - while not m: - key, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) - if offset is None: - return result, None - value, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) - result[key] = value - if offset is None: - return result, None - m = cls.re_dict_end.match(data, offset) - offset = m.end() - m = cls.re_stream_start.match(data, offset) - if m: - try: - stream_len_str = result.get(b"Length") - stream_len = int(stream_len_str) - except (TypeError, ValueError) as e: - msg = f"bad or missing Length in stream dict ({stream_len_str})" - raise PdfFormatError(msg) from e - stream_data = data[m.end() : m.end() + stream_len] - m = cls.re_stream_end.match(data, m.end() + stream_len) - check_format_condition(m, "stream end not found") - offset = m.end() - result = PdfStream(PdfDict(result), stream_data) - else: - result = PdfDict(result) - return result, offset - m = cls.re_array_start.match(data, offset) - if m: - offset = m.end() - result = [] - m = cls.re_array_end.match(data, offset) - while not m: - value, offset = cls.get_value(data, offset, max_nesting=max_nesting - 1) - result.append(value) - if offset is None: - return result, None - m = cls.re_array_end.match(data, offset) - return result, m.end() - m = cls.re_null.match(data, offset) - if m: - return None, m.end() - m = cls.re_true.match(data, offset) - if m: - return True, m.end() - m = cls.re_false.match(data, offset) - if m: - return False, m.end() - m = cls.re_name.match(data, offset) - if m: - return PdfName(cls.interpret_name(m.group(1))), m.end() - m = cls.re_int.match(data, offset) - if m: - return int(m.group(1)), m.end() - m = cls.re_real.match(data, offset) - if m: - # XXX Decimal instead of float??? - return float(m.group(1)), m.end() - m = cls.re_string_hex.match(data, offset) - if m: - # filter out whitespace - hex_string = bytearray( - b for b in m.group(1) if b in b"0123456789abcdefABCDEF" - ) - if len(hex_string) % 2 == 1: - # append a 0 if the length is not even - yes, at the end - hex_string.append(ord(b"0")) - return bytearray.fromhex(hex_string.decode("us-ascii")), m.end() - m = cls.re_string_lit.match(data, offset) - if m: - return cls.get_literal_string(data, m.end()) - # return None, offset # fallback (only for debugging) - msg = f"unrecognized object: {repr(data[offset : offset + 32])}" - raise PdfFormatError(msg) - - re_lit_str_token = re.compile( - rb"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))" - ) - escaped_chars = { - b"n": b"\n", - b"r": b"\r", - b"t": b"\t", - b"b": b"\b", - b"f": b"\f", - b"(": b"(", - b")": b")", - b"\\": b"\\", - ord(b"n"): b"\n", - ord(b"r"): b"\r", - ord(b"t"): b"\t", - ord(b"b"): b"\b", - ord(b"f"): b"\f", - ord(b"("): b"(", - ord(b")"): b")", - ord(b"\\"): b"\\", - } - - @classmethod - def get_literal_string(cls, data, offset): - nesting_depth = 0 - result = bytearray() - for m in cls.re_lit_str_token.finditer(data, offset): - result.extend(data[offset : m.start()]) - if m.group(1): - result.extend(cls.escaped_chars[m.group(1)[1]]) - elif m.group(2): - result.append(int(m.group(2)[1:], 8)) - elif m.group(3): - pass - elif m.group(5): - result.extend(b"\n") - elif m.group(6): - result.extend(b"(") - nesting_depth += 1 - elif m.group(7): - if nesting_depth == 0: - return bytes(result), m.end() - result.extend(b")") - nesting_depth -= 1 - offset = m.end() - msg = "unfinished literal string" - raise PdfFormatError(msg) - - re_xref_section_start = re.compile(whitespace_optional + rb"xref" + newline) - re_xref_subsection_start = re.compile( - whitespace_optional - + rb"([0-9]+)" - + whitespace_mandatory - + rb"([0-9]+)" - + whitespace_optional - + newline_only - ) - re_xref_entry = re.compile(rb"([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)") - - def read_xref_table(self, xref_section_offset): - subsection_found = False - m = self.re_xref_section_start.match( - self.buf, xref_section_offset + self.start_offset - ) - check_format_condition(m, "xref section start not found") - offset = m.end() - while True: - m = self.re_xref_subsection_start.match(self.buf, offset) - if not m: - check_format_condition( - subsection_found, "xref subsection start not found" - ) - break - subsection_found = True - offset = m.end() - first_object = int(m.group(1)) - num_objects = int(m.group(2)) - for i in range(first_object, first_object + num_objects): - m = self.re_xref_entry.match(self.buf, offset) - check_format_condition(m, "xref entry not found") - offset = m.end() - is_free = m.group(3) == b"f" - if not is_free: - generation = int(m.group(2)) - new_entry = (int(m.group(1)), generation) - if i not in self.xref_table: - self.xref_table[i] = new_entry - return offset - - def read_indirect(self, ref, max_nesting=-1): - offset, generation = self.xref_table[ref[0]] - check_format_condition( - generation == ref[1], - f"expected to find generation {ref[1]} for object ID {ref[0]} in xref " - f"table, instead found generation {generation} at offset {offset}", - ) - value = self.get_value( - self.buf, - offset + self.start_offset, - expect_indirect=IndirectReference(*ref), - max_nesting=max_nesting, - )[0] - self.cached_objects[ref] = value - return value - - def linearize_page_tree(self, node=None): - if node is None: - node = self.page_tree_root - check_format_condition( - node[b"Type"] == b"Pages", "/Type of page tree node is not /Pages" - ) - pages = [] - for kid in node[b"Kids"]: - kid_object = self.read_indirect(kid) - if kid_object[b"Type"] == b"Page": - pages.append(kid) - else: - pages.extend(self.linearize_page_tree(node=kid_object)) - return pages diff --git a/.venv/Lib/site-packages/PIL/PixarImagePlugin.py b/.venv/Lib/site-packages/PIL/PixarImagePlugin.py deleted file mode 100644 index 887b656..0000000 --- a/.venv/Lib/site-packages/PIL/PixarImagePlugin.py +++ /dev/null @@ -1,72 +0,0 @@ -# -# 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 __future__ import annotations - -from . import Image, ImageFile -from ._binary import i16le as i16 - -# -# helpers - - -def _accept(prefix: bytes) -> bool: - 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) -> None: - # assuming a 4-byte magic label - assert self.fp is not None - - s = self.fp.read(4) - if not _accept(s): - msg = "not a PIXAR file" - raise SyntaxError(msg) - - # read rest of header - s = s + self.fp.read(508) - - self._size = i16(s, 418), i16(s, 416) - - # get channel/depth descriptions - mode = i16(s, 424), i16(s, 426) - - 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/.venv/Lib/site-packages/PIL/PngImagePlugin.py b/.venv/Lib/site-packages/PIL/PngImagePlugin.py deleted file mode 100644 index d283492..0000000 --- a/.venv/Lib/site-packages/PIL/PngImagePlugin.py +++ /dev/null @@ -1,1489 +0,0 @@ -# -# 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. -# -from __future__ import annotations - -import itertools -import logging -import re -import struct -import warnings -import zlib -from enum import IntEnum -from typing import IO, TYPE_CHECKING, Any, NoReturn - -from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 -from ._binary import o16be as o16 -from ._binary import o32be as o32 - -if TYPE_CHECKING: - from . import _imaging - -logger = logging.getLogger(__name__) - -is_cid = re.compile(rb"\w\w\w\w").match - - -_MAGIC = b"\211PNG\r\n\032\n" - - -_MODES = { - # supported bits/color combinations, and corresponding modes/rawmodes - # Grayscale - (1, 0): ("1", "1"), - (2, 0): ("L", "L;2"), - (4, 0): ("L", "L;4"), - (8, 0): ("L", "L"), - (16, 0): ("I;16", "I;16B"), - # Truecolour - (8, 2): ("RGB", "RGB"), - (16, 2): ("RGB", "RGB;16B"), - # Indexed-colour - (1, 3): ("P", "P;1"), - (2, 3): ("P", "P;2"), - (4, 3): ("P", "P;4"), - (8, 3): ("P", "P"), - # Grayscale with alpha - (8, 4): ("LA", "LA"), - (16, 4): ("RGBA", "LA;16B"), # LA;16B->LA not yet available - # Truecolour with alpha - (8, 6): ("RGBA", "RGBA"), - (16, 6): ("RGBA", "RGBA;16B"), -} - - -_simple_palette = re.compile(b"^\xff*\x00\xff*$") - -MAX_TEXT_CHUNK = ImageFile.SAFEBLOCK -""" -Maximum decompressed size for a iTXt or zTXt chunk. -Eliminates decompression bombs where compressed chunks can expand 1000x. -See :ref:`Text in PNG File Format`. -""" -MAX_TEXT_MEMORY = 64 * MAX_TEXT_CHUNK -""" -Set the maximum total text chunk size. -See :ref:`Text in PNG File Format`. -""" - - -# APNG frame disposal modes -class Disposal(IntEnum): - OP_NONE = 0 - """ - No disposal is done on this frame before rendering the next frame. - See :ref:`Saving APNG sequences`. - """ - OP_BACKGROUND = 1 - """ - This frame’s modified region is cleared to fully transparent black before rendering - the next frame. - See :ref:`Saving APNG sequences`. - """ - OP_PREVIOUS = 2 - """ - This frame’s modified region is reverted to the previous frame’s contents before - rendering the next frame. - See :ref:`Saving APNG sequences`. - """ - - -# APNG frame blend modes -class Blend(IntEnum): - OP_SOURCE = 0 - """ - All color components of this frame, including alpha, overwrite the previous output - image contents. - See :ref:`Saving APNG sequences`. - """ - OP_OVER = 1 - """ - This frame should be alpha composited with the previous output image contents. - See :ref:`Saving APNG sequences`. - """ - - -def _safe_zlib_decompress(s): - dobj = zlib.decompressobj() - plaintext = dobj.decompress(s, MAX_TEXT_CHUNK) - if dobj.unconsumed_tail: - msg = "Decompressed Data Too Large" - raise ValueError(msg) - return plaintext - - -def _crc32(data, seed=0): - return zlib.crc32(data, seed) & 0xFFFFFFFF - - -# -------------------------------------------------------------------- -# Support classes. Suitable for PNG and related formats like MNG etc. - - -class ChunkStream: - def __init__(self, fp: IO[bytes]) -> None: - self.fp: IO[bytes] | None = fp - self.queue: list[tuple[bytes, int, int]] | None = [] - - def read(self) -> tuple[bytes, int, int]: - """Fetch a new chunk. Returns header information.""" - cid = None - - assert self.fp is not 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: - msg = f"broken PNG file (chunk {repr(cid)})" - raise SyntaxError(msg) - - return cid, pos, length - - def __enter__(self) -> ChunkStream: - return self - - def __exit__(self, *args: object) -> None: - self.close() - - def close(self) -> None: - self.queue = self.fp = None - - def push(self, cid: bytes, pos: int, length: int) -> None: - assert self.queue is not None - 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, f"chunk_{cid.decode('ascii')}")(pos, length) - - def crc(self, cid: bytes, data: bytes) -> None: - """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 (cid[0] >> 5 & 1): - self.crc_skip(cid, data) - return - - assert self.fp is not None - try: - crc1 = _crc32(data, _crc32(cid)) - crc2 = i32(self.fp.read(4)) - if crc1 != crc2: - msg = f"broken PNG file (bad header checksum in {repr(cid)})" - raise SyntaxError(msg) - except struct.error as e: - msg = f"broken PNG file (incomplete checksum in {repr(cid)})" - raise SyntaxError(msg) from e - - def crc_skip(self, cid: bytes, data: bytes) -> None: - """Read checksum""" - - assert self.fp is not None - self.fp.read(4) - - def verify(self, endchunk: bytes = b"IEND") -> list[bytes]: - # 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 as e: - msg = "truncated PNG file" - raise OSError(msg) from e - - 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 - - """ - - lang: str | bytes | None - tkey: str | bytes | None - - @staticmethod - def __new__(cls, text, lang=None, tkey=None): - """ - :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: - """ - PNG chunk container (for use with save(pnginfo=)) - - """ - - def __init__(self) -> None: - self.chunks: list[tuple[bytes, bytes, bool]] = [] - - def add(self, cid: bytes, data: bytes, after_idat: bool = False) -> None: - """Appends an arbitrary chunk. Use with caution. - - :param cid: a byte string, 4 bytes long. - :param data: a byte string of the encoded data - :param after_idat: for use with private chunks. Whether the chunk - should be written after IDAT - - """ - - self.chunks.append((cid, data, after_idat)) - - def add_itxt( - self, - key: str | bytes, - value: str | bytes, - lang: str | bytes = "", - tkey: str | bytes = "", - zip: bool = False, - ) -> None: - """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: str | bytes, value: str | bytes | iTXt, zip: bool = False - ) -> None: - """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 if value.lang is not None else b"", - value.tkey if value.tkey is not None else b"", - zip=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=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): - super().__init__(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.im_custom_mimetype = None - self.im_n_frames = None - self._seq_num = None - self.rewind_state = None - - self.text_memory = 0 - - def check_text_memory(self, chunklen: int) -> None: - self.text_memory += chunklen - if self.text_memory > MAX_TEXT_MEMORY: - msg = ( - "Too much memory used in text chunks: " - f"{self.text_memory}>MAX_TEXT_MEMORY" - ) - raise ValueError(msg) - - def save_rewind(self) -> None: - self.rewind_state = { - "info": self.im_info.copy(), - "tile": self.im_tile, - "seq_num": self._seq_num, - } - - def rewind(self) -> None: - self.im_info = self.rewind_state["info"].copy() - self.im_tile = self.rewind_state["tile"] - self._seq_num = self.rewind_state["seq_num"] - - def chunk_iCCP(self, pos: int, length: int) -> bytes: - # 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]) - comp_method = s[i + 1] - logger.debug("Compression method %s", comp_method) - if comp_method != 0: - msg = f"Unknown compression method {comp_method} in iCCP chunk" - raise SyntaxError(msg) - 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: int, length: int) -> bytes: - # image header - s = ImageFile._safe_read(self.fp, length) - if length < 13: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "Truncated IHDR chunk" - raise ValueError(msg) - self.im_size = i32(s, 0), i32(s, 4) - try: - self.im_mode, self.im_rawmode = _MODES[(s[8], s[9])] - except Exception: - pass - if s[12]: - self.im_info["interlace"] = 1 - if s[11]: - msg = "unknown filter category" - raise SyntaxError(msg) - return s - - def chunk_IDAT(self, pos: int, length: int) -> NoReturn: - # image data - if "bbox" in self.im_info: - tile = [("zip", self.im_info["bbox"], pos, self.im_rawmode)] - else: - if self.im_n_frames is not None: - self.im_info["default_image"] = True - tile = [("zip", (0, 0) + self.im_size, pos, self.im_rawmode)] - self.im_tile = tile - self.im_idat = length - msg = "image data found" - raise EOFError(msg) - - def chunk_IEND(self, pos: int, length: int) -> NoReturn: - msg = "end of PNG image" - raise EOFError(msg) - - def chunk_PLTE(self, pos: int, length: int) -> bytes: - # 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: int, length: int) -> bytes: - # 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 in ("1", "L", "I;16"): - 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: int, length: int) -> bytes: - # gamma setting - s = ImageFile._safe_read(self.fp, length) - self.im_info["gamma"] = i32(s) / 100000.0 - return s - - def chunk_cHRM(self, pos: int, length: int) -> bytes: - # chromaticity, 8 unsigned ints, actual value is scaled by 100,000 - # WP x,y, Red x,y, Green x,y Blue x,y - - s = ImageFile._safe_read(self.fp, length) - raw_vals = struct.unpack(">%dI" % (len(s) // 4), s) - self.im_info["chromaticity"] = tuple(elt / 100000.0 for elt in raw_vals) - return s - - def chunk_sRGB(self, pos: int, length: int) -> bytes: - # srgb rendering intent, 1 byte - # 0 perceptual - # 1 relative colorimetric - # 2 saturation - # 3 absolute colorimetric - - s = ImageFile._safe_read(self.fp, length) - if length < 1: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "Truncated sRGB chunk" - raise ValueError(msg) - self.im_info["srgb"] = s[0] - return s - - def chunk_pHYs(self, pos: int, length: int) -> bytes: - # pixels per unit - s = ImageFile._safe_read(self.fp, length) - if length < 9: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "Truncated pHYs chunk" - raise ValueError(msg) - px, py = i32(s, 0), i32(s, 4) - unit = s[8] - if unit == 1: # meter - dpi = px * 0.0254, py * 0.0254 - self.im_info["dpi"] = dpi - elif unit == 0: - self.im_info["aspect"] = px, py - return s - - def chunk_tEXt(self, pos: int, length: int) -> bytes: - # 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: - k = k.decode("latin-1", "strict") - v_str = v.decode("latin-1", "replace") - - self.im_info[k] = v if k == "exif" else v_str - self.im_text[k] = v_str - self.check_text_memory(len(v_str)) - - return s - - def chunk_zTXt(self, pos: int, length: int) -> bytes: - # 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 = v[0] - else: - comp_method = 0 - if comp_method != 0: - msg = f"Unknown compression method {comp_method} in zTXt chunk" - raise SyntaxError(msg) - 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: - 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: int, length: int) -> bytes: - # 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 = r[0], 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 k == b"XML:com.adobe.xmp": - self.im_info["xmp"] = v - 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 - - def chunk_eXIf(self, pos: int, length: int) -> bytes: - s = ImageFile._safe_read(self.fp, length) - self.im_info["exif"] = b"Exif\x00\x00" + s - return s - - # APNG chunks - def chunk_acTL(self, pos: int, length: int) -> bytes: - s = ImageFile._safe_read(self.fp, length) - if length < 8: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "APNG contains truncated acTL chunk" - raise ValueError(msg) - if self.im_n_frames is not None: - self.im_n_frames = None - warnings.warn("Invalid APNG, will use default PNG image if possible") - return s - n_frames = i32(s) - if n_frames == 0 or n_frames > 0x80000000: - warnings.warn("Invalid APNG, will use default PNG image if possible") - return s - self.im_n_frames = n_frames - self.im_info["loop"] = i32(s, 4) - self.im_custom_mimetype = "image/apng" - return s - - def chunk_fcTL(self, pos: int, length: int) -> bytes: - s = ImageFile._safe_read(self.fp, length) - if length < 26: - if ImageFile.LOAD_TRUNCATED_IMAGES: - return s - msg = "APNG contains truncated fcTL chunk" - raise ValueError(msg) - seq = i32(s) - if (self._seq_num is None and seq != 0) or ( - self._seq_num is not None and self._seq_num != seq - 1 - ): - msg = "APNG contains frame sequence errors" - raise SyntaxError(msg) - self._seq_num = seq - width, height = i32(s, 4), i32(s, 8) - px, py = i32(s, 12), i32(s, 16) - im_w, im_h = self.im_size - if px + width > im_w or py + height > im_h: - msg = "APNG contains invalid frames" - raise SyntaxError(msg) - self.im_info["bbox"] = (px, py, px + width, py + height) - delay_num, delay_den = i16(s, 20), i16(s, 22) - if delay_den == 0: - delay_den = 100 - self.im_info["duration"] = float(delay_num) / float(delay_den) * 1000 - self.im_info["disposal"] = s[24] - self.im_info["blend"] = s[25] - return s - - def chunk_fdAT(self, pos: int, length: int) -> bytes: - if length < 4: - if ImageFile.LOAD_TRUNCATED_IMAGES: - s = ImageFile._safe_read(self.fp, length) - return s - msg = "APNG contains truncated fDAT chunk" - raise ValueError(msg) - s = ImageFile._safe_read(self.fp, 4) - seq = i32(s) - if self._seq_num != seq - 1: - msg = "APNG contains frame sequence errors" - raise SyntaxError(msg) - self._seq_num = seq - return self.chunk_IDAT(pos + 4, length - 4) - - -# -------------------------------------------------------------------- -# PNG reader - - -def _accept(prefix: bytes) -> bool: - return prefix[:8] == _MAGIC - - -## -# Image plugin for PNG images. - - -class PngImageFile(ImageFile.ImageFile): - format = "PNG" - format_description = "Portable network graphics" - - def _open(self) -> None: - if not _accept(self.fp.read(8)): - msg = "not a PNG file" - raise SyntaxError(msg) - self._fp = self.fp - self.__frame = 0 - - # - # Parse headers up to the first IDAT or fDAT chunk - - self.private_chunks: list[tuple[bytes, bytes] | tuple[bytes, bytes, bool]] = [] - self.png: PngStream | None = 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) - if cid[1:2].islower(): - self.private_chunks.append((cid, s)) - - 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 = None - self.tile = self.png.im_tile - self.custom_mimetype = self.png.im_custom_mimetype - self.n_frames = self.png.im_n_frames or 1 - self.default_image = self.info.get("default_image", False) - - if self.png.im_palette: - rawmode, data = self.png.im_palette - self.palette = ImagePalette.raw(rawmode, data) - - if cid == b"fdAT": - self.__prepare_idat = length - 4 - else: - self.__prepare_idat = length # used by load_prepare() - - if self.png.im_n_frames is not None: - self._close_exclusive_fp_after_loading = False - self.png.save_rewind() - self.__rewind_idat = self.__prepare_idat - self.__rewind = self._fp.tell() - if self.default_image: - # IDAT chunk contains default image and not first animation frame - self.n_frames += 1 - self._seek(0) - self.is_animated = self.n_frames > 1 - - @property - def text(self): - # experimental - if self._text is None: - # iTxt, tEXt and zTXt chunks may appear at the end of the file - # So load the file to ensure that they are read - if self.is_animated: - frame = self.__frame - # for APNG, seek to the final frame before loading - self.seek(self.n_frames - 1) - self.load() - if self.is_animated: - self.seek(frame) - return self._text - - def verify(self) -> None: - """Verify PNG file""" - - if self.fp is None: - msg = "verify must be called directly after open" - raise RuntimeError(msg) - - # back up to beginning of IDAT block - self.fp.seek(self.tile[0][2] - 8) - - assert self.png is not None - self.png.verify() - self.png.close() - - if self._exclusive_fp: - self.fp.close() - self.fp = None - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - if frame < self.__frame: - self._seek(0, True) - - last_frame = self.__frame - for f in range(self.__frame + 1, frame + 1): - try: - self._seek(f) - except EOFError as e: - self.seek(last_frame) - msg = "no more images in APNG file" - raise EOFError(msg) from e - - def _seek(self, frame: int, rewind: bool = False) -> None: - assert self.png is not None - - self.dispose: _imaging.ImagingCore | None - if frame == 0: - if rewind: - self._fp.seek(self.__rewind) - self.png.rewind() - self.__prepare_idat = self.__rewind_idat - self.im = None - if self.pyaccess: - self.pyaccess = None - self.info = self.png.im_info - self.tile = self.png.im_tile - self.fp = self._fp - self._prev_im = None - self.dispose = None - self.default_image = self.info.get("default_image", False) - self.dispose_op = self.info.get("disposal") - self.blend_op = self.info.get("blend") - self.dispose_extent = self.info.get("bbox") - self.__frame = 0 - else: - if frame != self.__frame + 1: - msg = f"cannot seek to frame {frame}" - raise ValueError(msg) - - # ensure previous frame was loaded - self.load() - - if self.dispose: - self.im.paste(self.dispose, self.dispose_extent) - self._prev_im = self.im.copy() - - self.fp = self._fp - - # advance to the next frame - if self.__prepare_idat: - ImageFile._safe_read(self.fp, self.__prepare_idat) - self.__prepare_idat = 0 - frame_start = False - while True: - self.fp.read(4) # CRC - - try: - cid, pos, length = self.png.read() - except (struct.error, SyntaxError): - break - - if cid == b"IEND": - msg = "No more images in APNG file" - raise EOFError(msg) - if cid == b"fcTL": - if frame_start: - # there must be at least one fdAT chunk between fcTL chunks - msg = "APNG missing frame data" - raise SyntaxError(msg) - frame_start = True - - try: - self.png.call(cid, pos, length) - except UnicodeDecodeError: - break - except EOFError: - if cid == b"fdAT": - length -= 4 - if frame_start: - self.__prepare_idat = length - break - ImageFile._safe_read(self.fp, length) - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - ImageFile._safe_read(self.fp, length) - - self.__frame = frame - self.tile = self.png.im_tile - self.dispose_op = self.info.get("disposal") - self.blend_op = self.info.get("blend") - self.dispose_extent = self.info.get("bbox") - - if not self.tile: - msg = "image not found in APNG frame" - raise EOFError(msg) - - # setup frame disposal (actual disposal done when needed in the next _seek()) - if self._prev_im is None and self.dispose_op == Disposal.OP_PREVIOUS: - self.dispose_op = Disposal.OP_BACKGROUND - - self.dispose = None - if self.dispose_op == Disposal.OP_PREVIOUS: - if self._prev_im: - self.dispose = self._prev_im.copy() - self.dispose = self._crop(self.dispose, self.dispose_extent) - elif self.dispose_op == Disposal.OP_BACKGROUND: - self.dispose = Image.core.fill(self.mode, self.size) - self.dispose = self._crop(self.dispose, self.dispose_extent) - - def tell(self) -> int: - return self.__frame - - def load_prepare(self) -> None: - """internal: prepare to read PNG file""" - - if self.info.get("interlace"): - self.decoderconfig = self.decoderconfig + (1,) - - self.__idat = self.__prepare_idat # used by load_read() - ImageFile.ImageFile.load_prepare(self) - - def load_read(self, read_bytes: int) -> bytes: - """internal: read more image data""" - - assert self.png is not None - 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", b"fdAT"]: - self.png.push(cid, pos, length) - return b"" - - if cid == b"fdAT": - try: - self.png.call(cid, pos, length) - except EOFError: - pass - self.__idat = length - 4 # sequence_num has already been read - else: - 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) -> None: - """internal: finished reading image data""" - assert self.png is not None - if self.__idat != 0: - self.fp.read(self.__idat) - while True: - self.fp.read(4) # CRC - - try: - cid, pos, length = self.png.read() - except (struct.error, SyntaxError): - break - - if cid == b"IEND": - break - elif cid == b"fcTL" and self.is_animated: - # start of the next frame, stop reading - self.__prepare_idat = 0 - self.png.push(cid, pos, length) - break - - try: - self.png.call(cid, pos, length) - except UnicodeDecodeError: - break - except EOFError: - if cid == b"fdAT": - length -= 4 - try: - ImageFile._safe_read(self.fp, length) - except OSError as e: - if ImageFile.LOAD_TRUNCATED_IMAGES: - break - else: - raise e - except AttributeError: - logger.debug("%r %s %s (unknown)", cid, pos, length) - s = ImageFile._safe_read(self.fp, length) - if cid[1:2].islower(): - self.private_chunks.append((cid, s, True)) - self._text = self.png.im_text - if not self.is_animated: - self.png.close() - self.png = None - else: - if self._prev_im and self.blend_op == Blend.OP_OVER: - updated = self._crop(self.im, self.dispose_extent) - if self.im.mode == "RGB" and "transparency" in self.info: - mask = updated.convert_transparent( - "RGBA", self.info["transparency"] - ) - else: - mask = updated.convert("RGBA") - self._prev_im.paste(updated, self.dispose_extent, mask) - self.im = self._prev_im - if self.pyaccess: - self.pyaccess = None - - def _getexif(self) -> dict[str, Any] | None: - if "exif" not in self.info: - self.load() - if "exif" not in self.info and "Raw profile type exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - def getexif(self) -> Image.Exif: - if "exif" not in self.info: - self.load() - - return super().getexif() - - -# -------------------------------------------------------------------- -# PNG writer - -_OUTMODES = { - # supported PIL modes, and corresponding rawmode, bit depth and color type - "1": ("1", b"\x01", b"\x00"), - "L;1": ("L;1", b"\x01", b"\x00"), - "L;2": ("L;2", b"\x02", b"\x00"), - "L;4": ("L;4", b"\x04", b"\x00"), - "L": ("L", b"\x08", b"\x00"), - "LA": ("LA", b"\x08", b"\x04"), - "I": ("I;16B", b"\x10", b"\x00"), - "I;16": ("I;16B", b"\x10", b"\x00"), - "I;16B": ("I;16B", b"\x10", b"\x00"), - "P;1": ("P;1", b"\x01", b"\x03"), - "P;2": ("P;2", b"\x02", b"\x03"), - "P;4": ("P;4", b"\x04", b"\x03"), - "P": ("P", b"\x08", b"\x03"), - "RGB": ("RGB", b"\x08", b"\x02"), - "RGBA": ("RGBA", b"\x08", b"\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) - crc = _crc32(data, _crc32(cid)) - fp.write(o32(crc)) - - -class _idat: - # wrap output from the encoder in IDAT chunks - - def __init__(self, fp, chunk): - self.fp = fp - self.chunk = chunk - - def write(self, data: bytes) -> None: - self.chunk(self.fp, b"IDAT", data) - - -class _fdat: - # wrap encoder output in fdAT chunks - - def __init__(self, fp, chunk, seq_num): - self.fp = fp - self.chunk = chunk - self.seq_num = seq_num - - def write(self, data: bytes) -> None: - self.chunk(self.fp, b"fdAT", o32(self.seq_num), data) - self.seq_num += 1 - - -def _write_multiple_frames(im, fp, chunk, mode, rawmode, default_image, append_images): - duration = im.encoderinfo.get("duration") - loop = im.encoderinfo.get("loop", im.info.get("loop", 0)) - disposal = im.encoderinfo.get("disposal", im.info.get("disposal", Disposal.OP_NONE)) - blend = im.encoderinfo.get("blend", im.info.get("blend", Blend.OP_SOURCE)) - - if default_image: - chain = itertools.chain(append_images) - else: - chain = itertools.chain([im], append_images) - - im_frames = [] - frame_count = 0 - for im_seq in chain: - for im_frame in ImageSequence.Iterator(im_seq): - if im_frame.mode == mode: - im_frame = im_frame.copy() - else: - im_frame = im_frame.convert(mode) - encoderinfo = im.encoderinfo.copy() - if isinstance(duration, (list, tuple)): - encoderinfo["duration"] = duration[frame_count] - elif duration is None and "duration" in im_frame.info: - encoderinfo["duration"] = im_frame.info["duration"] - if isinstance(disposal, (list, tuple)): - encoderinfo["disposal"] = disposal[frame_count] - if isinstance(blend, (list, tuple)): - encoderinfo["blend"] = blend[frame_count] - frame_count += 1 - - if im_frames: - previous = im_frames[-1] - prev_disposal = previous["encoderinfo"].get("disposal") - prev_blend = previous["encoderinfo"].get("blend") - if prev_disposal == Disposal.OP_PREVIOUS and len(im_frames) < 2: - prev_disposal = Disposal.OP_BACKGROUND - - if prev_disposal == Disposal.OP_BACKGROUND: - base_im = previous["im"].copy() - dispose = Image.core.fill("RGBA", im.size, (0, 0, 0, 0)) - bbox = previous["bbox"] - if bbox: - dispose = dispose.crop(bbox) - else: - bbox = (0, 0) + im.size - base_im.paste(dispose, bbox) - elif prev_disposal == Disposal.OP_PREVIOUS: - base_im = im_frames[-2]["im"] - else: - base_im = previous["im"] - delta = ImageChops.subtract_modulo( - im_frame.convert("RGBA"), base_im.convert("RGBA") - ) - bbox = delta.getbbox(alpha_only=False) - if ( - not bbox - and prev_disposal == encoderinfo.get("disposal") - and prev_blend == encoderinfo.get("blend") - and "duration" in encoderinfo - ): - previous["encoderinfo"]["duration"] += encoderinfo["duration"] - continue - else: - bbox = None - im_frames.append({"im": im_frame, "bbox": bbox, "encoderinfo": encoderinfo}) - - if len(im_frames) == 1 and not default_image: - return im_frames[0]["im"] - - # animation control - chunk( - fp, - b"acTL", - o32(len(im_frames)), # 0: num_frames - o32(loop), # 4: num_plays - ) - - # default image IDAT (if it exists) - if default_image: - if im.mode != mode: - im = im.convert(mode) - ImageFile._save(im, _idat(fp, chunk), [("zip", (0, 0) + im.size, 0, rawmode)]) - - seq_num = 0 - for frame, frame_data in enumerate(im_frames): - im_frame = frame_data["im"] - if not frame_data["bbox"]: - bbox = (0, 0) + im_frame.size - else: - bbox = frame_data["bbox"] - im_frame = im_frame.crop(bbox) - size = im_frame.size - encoderinfo = frame_data["encoderinfo"] - frame_duration = int(round(encoderinfo.get("duration", 0))) - frame_disposal = encoderinfo.get("disposal", disposal) - frame_blend = encoderinfo.get("blend", blend) - # frame control - chunk( - fp, - b"fcTL", - o32(seq_num), # sequence_number - o32(size[0]), # width - o32(size[1]), # height - o32(bbox[0]), # x_offset - o32(bbox[1]), # y_offset - o16(frame_duration), # delay_numerator - o16(1000), # delay_denominator - o8(frame_disposal), # dispose_op - o8(frame_blend), # blend_op - ) - seq_num += 1 - # frame data - if frame == 0 and not default_image: - # first frame must be in IDAT chunks for backwards compatibility - ImageFile._save( - im_frame, - _idat(fp, chunk), - [("zip", (0, 0) + im_frame.size, 0, rawmode)], - ) - else: - fdat_chunks = _fdat(fp, chunk, seq_num) - ImageFile._save( - im_frame, - fdat_chunks, - [("zip", (0, 0) + im_frame.size, 0, rawmode)], - ) - seq_num = fdat_chunks.seq_num - - -def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - _save(im, fp, filename, save_all=True) - - -def _save(im, fp, filename, chunk=putchunk, save_all=False): - # save an image to disk (called by the save method) - - if save_all: - default_image = im.encoderinfo.get( - "default_image", im.info.get("default_image") - ) - modes = set() - sizes = set() - append_images = im.encoderinfo.get("append_images", []) - for im_seq in itertools.chain([im], append_images): - for im_frame in ImageSequence.Iterator(im_seq): - modes.add(im_frame.mode) - sizes.add(im_frame.size) - for mode in ("RGBA", "RGB", "P"): - if mode in modes: - break - else: - mode = modes.pop() - size = tuple(max(frame_size[i] for frame_size in sizes) for i in range(2)) - else: - size = im.size - mode = im.mode - - outmode = mode - if mode == "P": - # - # attempt to minimize storage requirements for palette images - if "bits" in im.encoderinfo: - # number of bits specified by user - colors = min(1 << im.encoderinfo["bits"], 256) - else: - # check palette contents - if im.palette: - colors = max(min(len(im.palette.getdata()[1]) // 3, 256), 1) - else: - colors = 256 - - if colors <= 16: - if colors <= 2: - bits = 1 - elif colors <= 4: - bits = 2 - else: - bits = 4 - outmode += f";{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, bit_depth, color_type = _OUTMODES[outmode] - except KeyError as e: - msg = f"cannot write mode {mode} as PNG" - raise OSError(msg) from e - - # - # write minimal PNG file - - fp.write(_MAGIC) - - chunk( - fp, - b"IHDR", - o32(size[0]), # 0: size - o32(size[1]), - bit_depth, - color_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) - - # You must either have sRGB or iCCP. - # Disallow sRGB chunks when an iCCP-chunk has been emitted. - chunks.remove(b"sRGB") - - info = im.encoderinfo.get("pnginfo") - if info: - chunks_multiple_allowed = [b"sPLT", b"iTXt", b"tEXt", b"zTXt"] - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid in chunks: - chunks.remove(cid) - chunk(fp, cid, data) - elif cid in chunks_multiple_allowed: - chunk(fp, cid, data) - elif cid[1:2].islower(): - # Private chunk - after_idat = len(info_chunk) == 3 and info_chunk[2] - if not after_idat: - chunk(fp, cid, data) - - if im.mode == "P": - palette_byte_number = colors * 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 = colors - 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 in ("1", "L", "I", "I;16"): - 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. - msg = "cannot use transparency for this mode" - raise OSError(msg) - else: - if im.mode == "P" and im.im.getpalettemode() == "RGBA": - alpha = im.im.getpalette("RGBA", "A") - alpha_bytes = colors - 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", - ) - - if info: - chunks = [b"bKGD", b"hIST"] - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid in chunks: - chunks.remove(cid) - chunk(fp, cid, data) - - exif = im.encoderinfo.get("exif") - if exif: - if isinstance(exif, Image.Exif): - exif = exif.tobytes(8) - if exif.startswith(b"Exif\x00\x00"): - exif = exif[6:] - chunk(fp, b"eXIf", exif) - - if save_all: - im = _write_multiple_frames( - im, fp, chunk, mode, rawmode, default_image, append_images - ) - if im: - ImageFile._save(im, _idat(fp, chunk), [("zip", (0, 0) + im.size, 0, rawmode)]) - - if info: - for info_chunk in info.chunks: - cid, data = info_chunk[:2] - if cid[1:2].islower(): - # Private chunk - after_idat = len(info_chunk) == 3 and info_chunk[2] - if after_idat: - chunk(fp, cid, data) - - 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: - data = [] - - def write(self, data: bytes) -> None: - pass - - def append(self, chunk: bytes) -> None: - self.data.append(chunk) - - def append(fp, cid, *data): - data = b"".join(data) - crc = o32(_crc32(data, _crc32(cid))) - 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_save_all(PngImageFile.format, _save_all) - -Image.register_extensions(PngImageFile.format, [".png", ".apng"]) - -Image.register_mime(PngImageFile.format, "image/png") diff --git a/.venv/Lib/site-packages/PIL/PpmImagePlugin.py b/.venv/Lib/site-packages/PIL/PpmImagePlugin.py deleted file mode 100644 index 16c9ccb..0000000 --- a/.venv/Lib/site-packages/PIL/PpmImagePlugin.py +++ /dev/null @@ -1,371 +0,0 @@ -# -# 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. -# -from __future__ import annotations - -import math -from typing import IO - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import o8 -from ._binary import o32le as o32 - -# -# -------------------------------------------------------------------- - -b_whitespace = b"\x20\x09\x0a\x0b\x0c\x0d" - -MODES = { - # standard - b"P1": "1", - b"P2": "L", - b"P3": "RGB", - b"P4": "1", - b"P5": "L", - b"P6": "RGB", - # extensions - b"P0CMYK": "CMYK", - b"Pf": "F", - # PIL extensions (for test purposes only) - b"PyP": "P", - b"PyRGBA": "RGBA", - b"PyCMYK": "CMYK", -} - - -def _accept(prefix: bytes) -> bool: - return prefix[0:1] == b"P" and prefix[1] in b"0123456fy" - - -## -# Image plugin for PBM, PGM, and PPM images. - - -class PpmImageFile(ImageFile.ImageFile): - format = "PPM" - format_description = "Pbmplus image" - - def _read_magic(self) -> bytes: - assert self.fp is not None - - magic = b"" - # read until whitespace or longest available magic number - for _ in range(6): - c = self.fp.read(1) - if not c or c in b_whitespace: - break - magic += c - return magic - - def _read_token(self) -> bytes: - assert self.fp is not None - - token = b"" - while len(token) <= 10: # read until next whitespace or limit of 10 characters - c = self.fp.read(1) - if not c: - break - elif c in b_whitespace: # token ended - if not token: - # skip whitespace at start - continue - break - elif c == b"#": - # ignores rest of the line; stops at CR, LF or EOF - while self.fp.read(1) not in b"\r\n": - pass - continue - token += c - if not token: - # Token was not even 1 byte - msg = "Reached EOF while reading header" - raise ValueError(msg) - elif len(token) > 10: - msg = f"Token too long in file header: {token.decode()}" - raise ValueError(msg) - return token - - def _open(self) -> None: - assert self.fp is not None - - magic_number = self._read_magic() - try: - mode = MODES[magic_number] - except KeyError: - msg = "not a PPM file" - raise SyntaxError(msg) - self._mode = mode - - if magic_number in (b"P1", b"P4"): - self.custom_mimetype = "image/x-portable-bitmap" - elif magic_number in (b"P2", b"P5"): - self.custom_mimetype = "image/x-portable-graymap" - elif magic_number in (b"P3", b"P6"): - self.custom_mimetype = "image/x-portable-pixmap" - - self._size = int(self._read_token()), int(self._read_token()) - - decoder_name = "raw" - if magic_number in (b"P1", b"P2", b"P3"): - decoder_name = "ppm_plain" - - args: str | tuple[str | int, ...] - if mode == "1": - args = "1;I" - elif mode == "F": - scale = float(self._read_token()) - if scale == 0.0 or not math.isfinite(scale): - msg = "scale must be finite and non-zero" - raise ValueError(msg) - self.info["scale"] = abs(scale) - - rawmode = "F;32F" if scale < 0 else "F;32BF" - args = (rawmode, 0, -1) - else: - maxval = int(self._read_token()) - if not 0 < maxval < 65536: - msg = "maxval must be greater than 0 and less than 65536" - raise ValueError(msg) - if maxval > 255 and mode == "L": - self._mode = "I" - - rawmode = mode - if decoder_name != "ppm_plain": - # If maxval matches a bit depth, use the raw decoder directly - if maxval == 65535 and mode == "L": - rawmode = "I;16B" - elif maxval != 255: - decoder_name = "ppm" - - args = rawmode if decoder_name == "raw" else (rawmode, maxval) - self.tile = [(decoder_name, (0, 0) + self.size, self.fp.tell(), args)] - - -# -# -------------------------------------------------------------------- - - -class PpmPlainDecoder(ImageFile.PyDecoder): - _pulls_fd = True - _comment_spans: bool - - def _read_block(self) -> bytes: - assert self.fd is not None - - return self.fd.read(ImageFile.SAFEBLOCK) - - def _find_comment_end(self, block: bytes, start: int = 0) -> int: - a = block.find(b"\n", start) - b = block.find(b"\r", start) - return min(a, b) if a * b > 0 else max(a, b) # lowest nonnegative index (or -1) - - def _ignore_comments(self, block: bytes) -> bytes: - if self._comment_spans: - # Finish current comment - while block: - comment_end = self._find_comment_end(block) - if comment_end != -1: - # Comment ends in this block - # Delete tail of comment - block = block[comment_end + 1 :] - break - else: - # Comment spans whole block - # So read the next block, looking for the end - block = self._read_block() - - # Search for any further comments - self._comment_spans = False - while True: - comment_start = block.find(b"#") - if comment_start == -1: - # No comment found - break - comment_end = self._find_comment_end(block, comment_start) - if comment_end != -1: - # Comment ends in this block - # Delete comment - block = block[:comment_start] + block[comment_end + 1 :] - else: - # Comment continues to next block(s) - block = block[:comment_start] - self._comment_spans = True - break - return block - - def _decode_bitonal(self) -> bytearray: - """ - This is a separate method because in the plain PBM format, all data tokens are - exactly one byte, so the inter-token whitespace is optional. - """ - data = bytearray() - total_bytes = self.state.xsize * self.state.ysize - - while len(data) != total_bytes: - block = self._read_block() # read next block - if not block: - # eof - break - - block = self._ignore_comments(block) - - tokens = b"".join(block.split()) - for token in tokens: - if token not in (48, 49): - msg = b"Invalid token for this mode: %s" % bytes([token]) - raise ValueError(msg) - data = (data + tokens)[:total_bytes] - invert = bytes.maketrans(b"01", b"\xFF\x00") - return data.translate(invert) - - def _decode_blocks(self, maxval: int) -> bytearray: - data = bytearray() - max_len = 10 - out_byte_count = 4 if self.mode == "I" else 1 - out_max = 65535 if self.mode == "I" else 255 - bands = Image.getmodebands(self.mode) - total_bytes = self.state.xsize * self.state.ysize * bands * out_byte_count - - half_token = b"" - while len(data) != total_bytes: - block = self._read_block() # read next block - if not block: - if half_token: - block = bytearray(b" ") # flush half_token - else: - # eof - break - - block = self._ignore_comments(block) - - if half_token: - block = half_token + block # stitch half_token to new block - half_token = b"" - - tokens = block.split() - - if block and not block[-1:].isspace(): # block might split token - half_token = tokens.pop() # save half token for later - if len(half_token) > max_len: # prevent buildup of half_token - msg = ( - b"Token too long found in data: %s" % half_token[: max_len + 1] - ) - raise ValueError(msg) - - for token in tokens: - if len(token) > max_len: - msg = b"Token too long found in data: %s" % token[: max_len + 1] - raise ValueError(msg) - value = int(token) - if value < 0: - msg_str = f"Channel value is negative: {value}" - raise ValueError(msg_str) - if value > maxval: - msg_str = f"Channel value too large for this mode: {value}" - raise ValueError(msg_str) - value = round(value / maxval * out_max) - data += o32(value) if self.mode == "I" else o8(value) - if len(data) == total_bytes: # finished! - break - return data - - def decode(self, buffer: bytes) -> tuple[int, int]: - self._comment_spans = False - if self.mode == "1": - data = self._decode_bitonal() - rawmode = "1;8" - else: - maxval = self.args[-1] - data = self._decode_blocks(maxval) - rawmode = "I;32" if self.mode == "I" else self.mode - self.set_as_raw(bytes(data), rawmode) - return -1, 0 - - -class PpmDecoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer: bytes) -> tuple[int, int]: - assert self.fd is not None - - data = bytearray() - maxval = self.args[-1] - in_byte_count = 1 if maxval < 256 else 2 - out_byte_count = 4 if self.mode == "I" else 1 - out_max = 65535 if self.mode == "I" else 255 - bands = Image.getmodebands(self.mode) - dest_length = self.state.xsize * self.state.ysize * bands * out_byte_count - while len(data) < dest_length: - pixels = self.fd.read(in_byte_count * bands) - if len(pixels) < in_byte_count * bands: - # eof - break - for b in range(bands): - value = ( - pixels[b] if in_byte_count == 1 else i16(pixels, b * in_byte_count) - ) - value = min(out_max, round(value / maxval * out_max)) - data += o32(value) if self.mode == "I" else o8(value) - rawmode = "I;32" if self.mode == "I" else self.mode - self.set_as_raw(bytes(data), rawmode) - return -1, 0 - - -# -# -------------------------------------------------------------------- - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode == "1": - rawmode, head = "1;I", b"P4" - elif im.mode == "L": - rawmode, head = "L", b"P5" - elif im.mode == "I": - rawmode, head = "I;16B", b"P5" - elif im.mode in ("RGB", "RGBA"): - rawmode, head = "RGB", b"P6" - elif im.mode == "F": - rawmode, head = "F;32F", b"Pf" - else: - msg = f"cannot write mode {im.mode} as PPM" - raise OSError(msg) - fp.write(head + b"\n%d %d\n" % im.size) - if head == b"P6": - fp.write(b"255\n") - elif head == b"P5": - if rawmode == "L": - fp.write(b"255\n") - else: - fp.write(b"65535\n") - elif head == b"Pf": - fp.write(b"-1.0\n") - row_order = -1 if im.mode == "F" else 1 - ImageFile._save(im, fp, [("raw", (0, 0) + im.size, 0, (rawmode, 0, row_order))]) - - -# -# -------------------------------------------------------------------- - - -Image.register_open(PpmImageFile.format, PpmImageFile, _accept) -Image.register_save(PpmImageFile.format, _save) - -Image.register_decoder("ppm", PpmDecoder) -Image.register_decoder("ppm_plain", PpmPlainDecoder) - -Image.register_extensions(PpmImageFile.format, [".pbm", ".pgm", ".ppm", ".pnm", ".pfm"]) - -Image.register_mime(PpmImageFile.format, "image/x-portable-anymap") diff --git a/.venv/Lib/site-packages/PIL/PsdImagePlugin.py b/.venv/Lib/site-packages/PIL/PsdImagePlugin.py deleted file mode 100644 index edf698b..0000000 --- a/.venv/Lib/site-packages/PIL/PsdImagePlugin.py +++ /dev/null @@ -1,326 +0,0 @@ -# -# 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. -# -from __future__ import annotations - -import io -from functools import cached_property - -from . import Image, ImageFile, ImagePalette -from ._binary import i8 -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import si16be as si16 -from ._binary import si32be as si32 - -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: bytes) -> bool: - return prefix[:4] == b"8BPS" - - -## -# Image plugin for Photoshop images. - - -class PsdImageFile(ImageFile.ImageFile): - format = "PSD" - format_description = "Adobe Photoshop" - _close_exclusive_fp_after_loading = False - - def _open(self) -> None: - read = self.fp.read - - # - # header - - s = read(26) - if not _accept(s) or i16(s, 4) != 1: - msg = "not a PSD file" - raise SyntaxError(msg) - - 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: - msg = "not enough channels" - raise OSError(msg) - if mode == "RGB" and psd_channels == 4: - mode = "RGBA" - channels = 4 - - 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: - read(4) # signature - 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_position = None - - size = i32(read(4)) - if size: - end = self.fp.tell() + size - size = i32(read(4)) - if size: - self._layers_position = self.fp.tell() - self._layers_size = size - self.fp.seek(end) - self._n_frames: int | None = None - - # - # 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 - - @cached_property - def layers(self): - layers = [] - if self._layers_position is not None: - self._fp.seek(self._layers_position) - _layer_data = io.BytesIO(ImageFile._safe_read(self._fp, self._layers_size)) - layers = _layerinfo(_layer_data, self._layers_size) - self._n_frames = len(layers) - return layers - - @property - def n_frames(self) -> int: - if self._n_frames is None: - self._n_frames = len(self.layers) - return self._n_frames - - @property - def is_animated(self) -> bool: - return len(self.layers) > 1 - - def seek(self, layer: int) -> None: - if not self._seek_check(layer): - return - - # seek to given layer (1..max) - try: - _, mode, _, tile = self.layers[layer - 1] - self._mode = mode - self.tile = tile - self.frame = layer - self.fp = self._fp - except IndexError as e: - msg = "no such layer" - raise EOFError(msg) from e - - def tell(self) -> int: - # return layer number (0=image, 1..max=layers) - return self.frame - - -def _layerinfo(fp, ct_bytes): - # read layerinfo block - layers = [] - - def read(size): - return ImageFile._safe_read(fp, size) - - ct = si16(read(2)) - - # sanity check - if ct_bytes < (abs(ct) * 20): - msg = "Layer block too short for number of layers requested" - raise SyntaxError(msg) - - for _ in range(abs(ct)): - # bounding box - y0 = si32(read(4)) - x0 = si32(read(4)) - y1 = si32(read(4)) - x1 = si32(read(4)) - - # image info - mode = [] - ct_types = i16(read(2)) - if ct_types > 4: - fp.seek(ct_types * 6 + 12, io.SEEK_CUR) - size = i32(read(4)) - fp.seek(size, io.SEEK_CUR) - continue - - for _ in range(ct_types): - type = i16(read(2)) - - if type == 65535: - m = "A" - else: - m = "RGBA"[type] - - mode.append(m) - read(4) # 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 - read(12) # filler - name = "" - size = i32(read(4)) # length of the extra data field - if size: - data_end = fp.tell() + size - - length = i32(read(4)) - if length: - fp.seek(length - 16, io.SEEK_CUR) - - length = i32(read(4)) - if length: - fp.seek(length, io.SEEK_CUR) - - 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") - - fp.seek(data_end) - layers.append((name, mode, (x0, y0, x1, y1))) - - # get tiles - for i, (name, mode, bbox) in enumerate(layers): - tile = [] - for m in mode: - t = _maketile(fp, m, bbox, 1) - if t: - tile.extend(t) - layers[i] = name, mode, bbox, tile - - 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 - - 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") - -Image.register_mime(PsdImageFile.format, "image/vnd.adobe.photoshop") diff --git a/.venv/Lib/site-packages/PIL/PyAccess.py b/.venv/Lib/site-packages/PIL/PyAccess.py deleted file mode 100644 index 3be1cca..0000000 --- a/.venv/Lib/site-packages/PIL/PyAccess.py +++ /dev/null @@ -1,381 +0,0 @@ -# -# 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.c -# * 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. -# -from __future__ import annotations - -import logging -import sys -from typing import TYPE_CHECKING - -from ._deprecate import deprecate - -FFI: type -try: - from cffi import FFI - - defs = """ - struct Pixel_RGBA { - unsigned char r,g,b,a; - }; - struct Pixel_I16 { - unsigned char l,r; - }; - """ - ffi = FFI() - ffi.cdef(defs) -except ImportError as ex: - # Allow error import for doc purposes, but error out when accessing - # anything in core. - from ._util import DeferredError - - FFI = ffi = DeferredError.new(ex) - -logger = logging.getLogger(__name__) - -if TYPE_CHECKING: - from . import Image - - -class PyAccess: - def __init__(self, img: Image.Image, readonly: bool = False) -> None: - deprecate("PyAccess", 11) - 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 - self._img = img - - # Keep pointer to im object to prevent dereferencing. - self._im = img.im - if self._im.mode in ("P", "PA"): - self._palette = img.palette - - # Debugging is polluting test traces, only useful here - # when hacking on PyAccess - # logger.debug("%s", vals) - self._post_init() - - def _post_init(self) -> None: - pass - - def __setitem__( - self, - xy: tuple[int, int] | list[int], - color: float | tuple[int, ...] | list[int], - ) -> None: - """ - 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. In addition to this, RGB and RGBA tuples - are accepted for P and PA images. - - :param xy: The pixel coordinate, given as (x, y). See - :ref:`coordinate-system`. - :param color: The pixel value. - """ - if self.readonly: - msg = "Attempt to putpixel a read only image" - raise ValueError(msg) - (x, y) = xy - if x < 0: - x = self.xsize + x - if y < 0: - y = self.ysize + y - (x, y) = self.check_xy((x, y)) - - if ( - self._im.mode in ("P", "PA") - and isinstance(color, (list, tuple)) - and len(color) in [3, 4] - ): - # RGB or RGBA value for a P or PA image - if self._im.mode == "PA": - alpha = color[3] if len(color) == 4 else 255 - color = color[:3] - palette_index = self._palette.getcolor(color, self._img) - color = (palette_index, alpha) if self._im.mode == "PA" else palette_index - - return self.set_pixel(x, y, color) - - def __getitem__(self, xy: tuple[int, int] | list[int]) -> float | tuple[int, ...]: - """ - 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). See - :ref:`coordinate-system`. - :returns: a pixel value for single band images, a tuple of - pixel values for multiband images. - """ - (x, y) = xy - if x < 0: - x = self.xsize + x - if y < 0: - y = self.ysize + y - (x, y) = self.check_xy((x, y)) - return self.get_pixel(x, y) - - putpixel = __setitem__ - getpixel = __getitem__ - - def check_xy(self, xy: tuple[int, int]) -> tuple[int, int]: - (x, y) = xy - if not (0 <= x < self.xsize and 0 <= y < self.ysize): - msg = "pixel location out of range" - raise ValueError(msg) - return xy - - def get_pixel(self, x: int, y: int) -> float | tuple[int, ...]: - raise NotImplementedError() - - def set_pixel( - self, x: int, y: int, color: float | tuple[int, ...] | list[int] - ) -> None: - raise NotImplementedError() - - -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: int, y: int) -> tuple[int, int]: - 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: int, y: int) -> tuple[int, int, int]: - 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: int, y: int) -> tuple[int, int, int, int]: - 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: int, y: int) -> int: - 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: int, y: int) -> int: - 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: int, y: int) -> int: - 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: int, y: int) -> int: - 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 Exception: - 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: int, y: int) -> int: - 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: int, y: int) -> int: - 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: int, y: int) -> float: - 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, - "I;16N": _PyAccessI16_N, - "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: Image.Image, readonly: bool = False) -> PyAccess | None: - 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/.venv/Lib/site-packages/PIL/QoiImagePlugin.py b/.venv/Lib/site-packages/PIL/QoiImagePlugin.py deleted file mode 100644 index 202ef52..0000000 --- a/.venv/Lib/site-packages/PIL/QoiImagePlugin.py +++ /dev/null @@ -1,115 +0,0 @@ -# -# The Python Imaging Library. -# -# QOI support for PIL -# -# See the README file for information on usage and redistribution. -# -from __future__ import annotations - -import os - -from . import Image, ImageFile -from ._binary import i32be as i32 - - -def _accept(prefix: bytes) -> bool: - return prefix[:4] == b"qoif" - - -class QoiImageFile(ImageFile.ImageFile): - format = "QOI" - format_description = "Quite OK Image" - - def _open(self) -> None: - if not _accept(self.fp.read(4)): - msg = "not a QOI file" - raise SyntaxError(msg) - - self._size = tuple(i32(self.fp.read(4)) for i in range(2)) - - channels = self.fp.read(1)[0] - self._mode = "RGB" if channels == 3 else "RGBA" - - self.fp.seek(1, os.SEEK_CUR) # colorspace - self.tile = [("qoi", (0, 0) + self._size, self.fp.tell(), None)] - - -class QoiDecoder(ImageFile.PyDecoder): - _pulls_fd = True - _previous_pixel: bytes | bytearray | None = None - _previously_seen_pixels: dict[int, bytes | bytearray] = {} - - def _add_to_previous_pixels(self, value: bytes | bytearray) -> None: - self._previous_pixel = value - - r, g, b, a = value - hash_value = (r * 3 + g * 5 + b * 7 + a * 11) % 64 - self._previously_seen_pixels[hash_value] = value - - def decode(self, buffer: bytes) -> tuple[int, int]: - assert self.fd is not None - - self._previously_seen_pixels = {} - self._add_to_previous_pixels(bytearray((0, 0, 0, 255))) - - data = bytearray() - bands = Image.getmodebands(self.mode) - dest_length = self.state.xsize * self.state.ysize * bands - while len(data) < dest_length: - byte = self.fd.read(1)[0] - value: bytes | bytearray - if byte == 0b11111110 and self._previous_pixel: # QOI_OP_RGB - value = bytearray(self.fd.read(3)) + self._previous_pixel[3:] - elif byte == 0b11111111: # QOI_OP_RGBA - value = self.fd.read(4) - else: - op = byte >> 6 - if op == 0: # QOI_OP_INDEX - op_index = byte & 0b00111111 - value = self._previously_seen_pixels.get( - op_index, bytearray((0, 0, 0, 0)) - ) - elif op == 1 and self._previous_pixel: # QOI_OP_DIFF - value = bytearray( - ( - (self._previous_pixel[0] + ((byte & 0b00110000) >> 4) - 2) - % 256, - (self._previous_pixel[1] + ((byte & 0b00001100) >> 2) - 2) - % 256, - (self._previous_pixel[2] + (byte & 0b00000011) - 2) % 256, - self._previous_pixel[3], - ) - ) - elif op == 2 and self._previous_pixel: # QOI_OP_LUMA - second_byte = self.fd.read(1)[0] - diff_green = (byte & 0b00111111) - 32 - diff_red = ((second_byte & 0b11110000) >> 4) - 8 - diff_blue = (second_byte & 0b00001111) - 8 - - value = bytearray( - tuple( - (self._previous_pixel[i] + diff_green + diff) % 256 - for i, diff in enumerate((diff_red, 0, diff_blue)) - ) - ) - value += self._previous_pixel[3:] - elif op == 3 and self._previous_pixel: # QOI_OP_RUN - run_length = (byte & 0b00111111) + 1 - value = self._previous_pixel - if bands == 3: - value = value[:3] - data += value * run_length - continue - self._add_to_previous_pixels(value) - - if bands == 3: - value = value[:3] - data += value - self.set_as_raw(data) - return -1, 0 - - -Image.register_open(QoiImageFile.format, QoiImageFile, _accept) -Image.register_decoder("qoi", QoiDecoder) -Image.register_extension(QoiImageFile.format, ".qoi") diff --git a/.venv/Lib/site-packages/PIL/SgiImagePlugin.py b/.venv/Lib/site-packages/PIL/SgiImagePlugin.py deleted file mode 100644 index 50d9791..0000000 --- a/.venv/Lib/site-packages/PIL/SgiImagePlugin.py +++ /dev/null @@ -1,238 +0,0 @@ -# -# 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 __future__ import annotations - -import os -import struct -from typing import IO - -from . import Image, ImageFile -from ._binary import i16be as i16 -from ._binary import o8 - - -def _accept(prefix: bytes) -> bool: - 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) -> None: - # HEAD - assert self.fp is not None - - headlen = 512 - s = self.fp.read(headlen) - - if not _accept(s): - msg = "Not an SGI image file" - raise ValueError(msg) - - # compression : verbatim or RLE - compression = s[2] - - # bpc : 1 or 2 bytes (8bits or 16bits) - bpc = 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 == "": - msg = "Unsupported SGI image mode" - raise ValueError(msg) - - self._size = xsize, ysize - self._mode = rawmode.split(";")[0] - if self.mode == "RGB": - self.custom_mimetype = "image/rgb" - - # 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: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode not in {"RGB", "RGBA", "L"}: - msg = "Unsupported SGI image mode" - raise ValueError(msg) - - # 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): - msg = "Unsupported number of bytes per pixel" - raise ValueError(msg) - - # Flip the image, since the origin of SGI file is the bottom-left corner - orientation = -1 - # Define the file as SGI File Format - magic_number = 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 in {1, 2}: - z = 1 - - # assert we've got the right number of bands. - if len(im.getbands()) != z: - msg = f"incorrect number of bands in SGI write: {z} vs {len(im.getbands())}" - raise ValueError(msg) - - # Minimum Byte value - pinmin = 0 - # Maximum Byte value (255 = 8bits per pixel) - pinmax = 255 - # Image name (79 characters max, truncated below in write) - img_name = os.path.splitext(os.path.basename(filename))[0] - if isinstance(img_name, str): - img_name = img_name.encode("ascii", "ignore") - # Standard representation of pixel in the file - colormap = 0 - fp.write(struct.pack(">h", magic_number)) - 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", img_name)) # truncates to 79 chars - fp.write(struct.pack("s", b"")) # force null byte after img_name - 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)) - - if hasattr(fp, "flush"): - fp.flush() - - -class SGI16Decoder(ImageFile.PyDecoder): - _pulls_fd = True - - def decode(self, buffer: bytes) -> tuple[int, int]: - assert self.fd is not None - assert self.im is not None - - 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_extensions(SgiImageFile.format, [".bw", ".rgb", ".rgba", ".sgi"]) - -# End of file diff --git a/.venv/Lib/site-packages/PIL/SpiderImagePlugin.py b/.venv/Lib/site-packages/PIL/SpiderImagePlugin.py deleted file mode 100644 index f5a09c3..0000000 --- a/.venv/Lib/site-packages/PIL/SpiderImagePlugin.py +++ /dev/null @@ -1,325 +0,0 @@ -# -# 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 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 annotations - -import os -import struct -import sys -from typing import IO, TYPE_CHECKING, Any, Tuple, cast - -from . import Image, ImageFile - - -def isInt(f: Any) -> int: - try: - i = int(f) - if f - i == 0: - return 1 - else: - return 0 - except (ValueError, 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: tuple[float, ...]) -> int: - 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 - if labbyt != (labrec * lenbyt): - return 0 - # looks like a valid header - return labbyt - - -def isSpiderImage(filename: str) -> int: - 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) -> None: - # 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: - msg = "not a valid Spider file" - raise SyntaxError(msg) - except struct.error as e: - msg = "not a valid Spider file" - raise SyntaxError(msg) from e - - h = (99,) + t # add 1 value : spider header index starts at 1 - iform = int(h[5]) - if iform != 1: - msg = "not a Spider 2D image" - raise SyntaxError(msg) - - 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: - msg = "inconsistent stack header values" - raise SyntaxError(msg) - - 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) -> int: - return self._nimages - - @property - def is_animated(self) -> bool: - return self._nimages > 1 - - # 1st image index is zero (although SPIDER imgnumber starts at 1) - def tell(self) -> int: - if self.imgnumber < 1: - return 0 - else: - return self.imgnumber - 1 - - def seek(self, frame: int) -> None: - if self.istack == 0: - msg = "attempt to seek in a non-stack file" - raise EOFError(msg) - 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: int = 255) -> Image.Image: - extrema = self.getextrema() - assert isinstance(extrema[0], float) - minimum, maximum = cast(Tuple[float, float], extrema) - m: float = 1 - if maximum != minimum: - m = depth / (maximum - minimum) - b = -m * minimum - return self.point(lambda i: i * m + b).convert("L") - - if TYPE_CHECKING: - from . import ImageTk - - # returns a ImageTk.PhotoImage object, after rescaling to 0..255 - def tkPhotoImage(self) -> ImageTk.PhotoImage: - from . import ImageTk - - return ImageTk.PhotoImage(self.convert2byte(), palette=256) - - -# -------------------------------------------------------------------- -# Image series - - -# given a list of filenames, return a list of images -def loadImageSeries(filelist: list[str] | None = None) -> list[SpiderImageFile] | None: - """create a list of :py:class:`~PIL.Image.Image` objects for use in a montage""" - if filelist is None or len(filelist) < 1: - return None - - imglist = [] - for img in filelist: - if not os.path.exists(img): - print(f"unable to find {img}") - continue - try: - with Image.open(img) as im: - im = im.convert2byte() - except Exception: - if not isSpiderImage(img): - print(f"{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: Image.Image) -> list[bytes]: - nsam, nrow = im.size - lenbyt = nsam * 4 # There are labrec records in the header - labrec = int(1024 / lenbyt) - if 1024 % lenbyt != 0: - labrec += 1 - labbyt = labrec * lenbyt - nvalues = int(labbyt / 4) - if nvalues < 23: - return [] - - hdr = [0.0] * nvalues - - # NB these are Fortran indices - hdr[1] = 1.0 # nslice (=1 for an image) - hdr[2] = float(nrow) # number of rows per slice - hdr[3] = float(nrow) # number of records in the image - 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 - return [struct.pack("f", v) for v in hdr] - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode[0] != "F": - im = im.convert("F") - - hdr = makeSpiderHeader(im) - if len(hdr) < 256: - msg = "Error creating Spider header" - raise OSError(msg) - - # 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: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - # get the filename extension and register it with Image - filename_ext = os.path.splitext(filename)[1] - ext = filename_ext.decode() if isinstance(filename_ext, bytes) else filename_ext - 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 len(sys.argv) < 2: - print("Syntax: python3 SpiderImagePlugin.py [infile] [outfile]") - sys.exit() - - filename = sys.argv[1] - if not isSpiderImage(filename): - print("input image must be in Spider format") - sys.exit() - - with Image.open(filename) as im: - print(f"image: {im}") - print(f"format: {im.format}") - print(f"size: {im.size}") - print(f"mode: {im.mode}") - print("max, min: ", end=" ") - print(im.getextrema()) - - if len(sys.argv) > 2: - outfile = sys.argv[2] - - # perform some image operation - im = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - print( - f"saving a flipped version of {os.path.basename(filename)} " - f"as {outfile} " - ) - im.save(outfile, SpiderImageFile.format) diff --git a/.venv/Lib/site-packages/PIL/SunImagePlugin.py b/.venv/Lib/site-packages/PIL/SunImagePlugin.py deleted file mode 100644 index 4e09847..0000000 --- a/.venv/Lib/site-packages/PIL/SunImagePlugin.py +++ /dev/null @@ -1,141 +0,0 @@ -# -# 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 __future__ import annotations - -from . import Image, ImageFile, ImagePalette -from ._binary import i32be as i32 - - -def _accept(prefix: bytes) -> bool: - 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) -> None: - # 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; - - assert self.fp is not None - - # HEAD - s = self.fp.read(32) - if not _accept(s): - msg = "not an SUN raster file" - raise SyntaxError(msg) - - offset = 32 - - self._size = i32(s, 4), i32(s, 8) - - depth = i32(s, 12) - # data_length = i32(s, 16) # unreliable, ignore. - file_type = i32(s, 20) - palette_type = i32(s, 24) # 0: None, 1: RGB, 2: Raw/arbitrary - palette_length = i32(s, 28) - - 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: - msg = "Unsupported Mode/Bit Depth" - raise SyntaxError(msg) - - if palette_length: - if palette_length > 1024: - msg = "Unsupported Color Palette Length" - raise SyntaxError(msg) - - if palette_type != 1: - msg = "Unsupported Palette Type" - raise SyntaxError(msg) - - 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: - msg = "Unsupported Sun Raster file type" - raise SyntaxError(msg) - - -# -# registry - - -Image.register_open(SunImageFile.format, SunImageFile, _accept) - -Image.register_extension(SunImageFile.format, ".ras") diff --git a/.venv/Lib/site-packages/PIL/TarIO.py b/.venv/Lib/site-packages/PIL/TarIO.py deleted file mode 100644 index cba26d4..0000000 --- a/.venv/Lib/site-packages/PIL/TarIO.py +++ /dev/null @@ -1,67 +0,0 @@ -# -# 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 __future__ import annotations - -import io - -from . import ContainerIO - - -class TarIO(ContainerIO.ContainerIO[bytes]): - """A file object that provides read access to a given member of a TAR file.""" - - def __init__(self, tarfile: str, file: str) -> None: - """ - Create file object. - - :param tarfile: Name of TAR file. - :param file: Name of member file. - """ - self.fh = open(tarfile, "rb") - - while True: - s = self.fh.read(512) - if len(s) != 512: - msg = "unexpected end of tar file" - raise OSError(msg) - - name = s[:100].decode("utf-8") - i = name.find("\0") - if i == 0: - msg = "cannot find subfile" - raise OSError(msg) - if i > 0: - name = name[:i] - - size = int(s[124:135], 8) - - if file == name: - break - - self.fh.seek((size + 511) & (~511), io.SEEK_CUR) - - # Open region - super().__init__(self.fh, self.fh.tell(), size) - - # Context manager support - def __enter__(self) -> TarIO: - return self - - def __exit__(self, *args: object) -> None: - self.close() - - def close(self) -> None: - self.fh.close() diff --git a/.venv/Lib/site-packages/PIL/TgaImagePlugin.py b/.venv/Lib/site-packages/PIL/TgaImagePlugin.py deleted file mode 100644 index 39104ae..0000000 --- a/.venv/Lib/site-packages/PIL/TgaImagePlugin.py +++ /dev/null @@ -1,262 +0,0 @@ -# -# 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 __future__ import annotations - -import warnings -from typing import IO - -from . import Image, ImageFile, ImagePalette -from ._binary import i16le as i16 -from ._binary import o8 -from ._binary import o16le as o16 - -# -# -------------------------------------------------------------------- -# Read RGA file - - -MODES = { - # map imagetype/depth to rawmode - (1, 8): "P", - (3, 1): "1", - (3, 8): "L", - (3, 16): "LA", - (2, 16): "BGRA;15Z", - (2, 24): "BGR", - (2, 32): "BGRA", -} - - -## -# Image plugin for Targa files. - - -class TgaImageFile(ImageFile.ImageFile): - format = "TGA" - format_description = "Targa" - - def _open(self) -> None: - # process header - assert self.fp is not None - - s = self.fp.read(18) - - id_len = s[0] - - colormaptype = s[1] - imagetype = s[2] - - depth = s[16] - - flags = 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) - ): - msg = "not a TGA file" - raise SyntaxError(msg) - - # image mode - if imagetype in (3, 11): - self._mode = "L" - if depth == 1: - self._mode = "1" # ??? - elif depth == 16: - self._mode = "LA" - elif imagetype in (1, 9): - self._mode = "P" if colormaptype else "L" - elif imagetype in (2, 10): - self._mode = "RGB" if depth == 24 else "RGBA" - else: - msg = "unknown TGA mode" - raise SyntaxError(msg) - - # orientation - orientation = flags & 0x30 - self._flip_horizontally = orientation in [0x10, 0x30] - if orientation in [0x20, 0x30]: - orientation = 1 - elif orientation in [0, 0x10]: - orientation = -1 - else: - msg = "unknown TGA orientation" - raise SyntaxError(msg) - - self.info["orientation"] = orientation - - if imagetype & 8: - self.info["compression"] = "tga_rle" - - if id_len: - self.info["id_section"] = self.fp.read(id_len) - - if colormaptype: - # read palette - start, size, mapdepth = i16(s, 3), i16(s, 5), s[7] - if mapdepth == 16: - self.palette = ImagePalette.raw( - "BGRA;15Z", bytes(2 * start) + self.fp.read(2 * size) - ) - self.palette.mode = "RGBA" - elif mapdepth == 24: - self.palette = ImagePalette.raw( - "BGR", bytes(3 * start) + self.fp.read(3 * size) - ) - elif mapdepth == 32: - self.palette = ImagePalette.raw( - "BGRA", bytes(4 * start) + self.fp.read(4 * size) - ) - else: - msg = "unknown TGA map depth" - raise SyntaxError(msg) - - # 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 - - def load_end(self) -> None: - if self._flip_horizontally: - assert self.im is not None - self.im = self.im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) - - -# -# -------------------------------------------------------------------- -# Write TGA file - - -SAVE = { - "1": ("1", 1, 0, 3), - "L": ("L", 8, 0, 3), - "LA": ("LA", 16, 0, 3), - "P": ("P", 8, 1, 1), - "RGB": ("BGR", 24, 0, 2), - "RGBA": ("BGRA", 32, 0, 2), -} - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - try: - rawmode, bits, colormaptype, imagetype = SAVE[im.mode] - except KeyError as e: - msg = f"cannot write mode {im.mode} as TGA" - raise OSError(msg) from e - - if "rle" in im.encoderinfo: - rle = im.encoderinfo["rle"] - else: - compression = im.encoderinfo.get("compression", im.info.get("compression")) - rle = compression == "tga_rle" - if rle: - imagetype += 8 - - id_section = im.encoderinfo.get("id_section", im.info.get("id_section", "")) - id_len = len(id_section) - if id_len > 255: - id_len = 255 - id_section = id_section[:255] - warnings.warn("id_section has been trimmed to 255 characters") - - if colormaptype: - assert im.im is not None - palette = im.im.getpalette("RGB", "BGR") - colormaplength, colormapentry = len(palette) // 3, 24 - else: - colormaplength, colormapentry = 0, 0 - - if im.mode in ("LA", "RGBA"): - flags = 8 - else: - flags = 0 - - orientation = im.encoderinfo.get("orientation", im.info.get("orientation", -1)) - if orientation > 0: - flags = flags | 0x20 - - fp.write( - o8(id_len) - + o8(colormaptype) - + o8(imagetype) - + o16(0) # colormapfirst - + o16(colormaplength) - + o8(colormapentry) - + o16(0) - + o16(0) - + o16(im.size[0]) - + o16(im.size[1]) - + o8(bits) - + o8(flags) - ) - - if id_section: - fp.write(id_section) - - if colormaptype: - fp.write(palette) - - if rle: - ImageFile._save( - im, fp, [("tga_rle", (0, 0) + im.size, 0, (rawmode, orientation))] - ) - else: - 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_extensions(TgaImageFile.format, [".tga", ".icb", ".vda", ".vst"]) - -Image.register_mime(TgaImageFile.format, "image/x-tga") diff --git a/.venv/Lib/site-packages/PIL/TiffImagePlugin.py b/.venv/Lib/site-packages/PIL/TiffImagePlugin.py deleted file mode 100644 index ac5b63c..0000000 --- a/.venv/Lib/site-packages/PIL/TiffImagePlugin.py +++ /dev/null @@ -1,2200 +0,0 @@ -# -# 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 annotations - -import io -import itertools -import logging -import math -import os -import struct -import warnings -from collections.abc import MutableMapping -from fractions import Fraction -from numbers import Number, Rational -from typing import IO, TYPE_CHECKING, Any, Callable, NoReturn - -from . import ExifTags, Image, ImageFile, ImageOps, ImagePalette, TiffTags -from ._binary import i16be as i16 -from ._binary import i32be as i32 -from ._binary import o8 -from ._deprecate import deprecate -from .TiffTags import TYPES - -logger = logging.getLogger(__name__) - -# Set these to true to force use of libtiff for reading or writing. -READ_LIBTIFF = False -WRITE_LIBTIFF = False -IFD_LEGACY_API = True -STRIP_SIZE = 65536 - -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 -OSUBFILETYPE = 255 -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 -TRANSFERFUNCTION = 301 -SOFTWARE = 305 -DATE_TIME = 306 -ARTIST = 315 -PREDICTOR = 317 -COLORMAP = 320 -TILEWIDTH = 322 -TILELENGTH = 323 -TILEOFFSETS = 324 -TILEBYTECOUNTS = 325 -SUBIFD = 330 -EXTRASAMPLES = 338 -SAMPLEFORMAT = 339 -JPEGTABLES = 347 -YCBCRSUBSAMPLING = 530 -REFERENCEBLACKWHITE = 532 -COPYRIGHT = 33432 -IPTC_NAA_CHUNK = 33723 # newsphoto properties -PHOTOSHOP_CHUNK = 34377 # photoshop properties -ICCPROFILE = 34675 -EXIFIFD = 34665 -XMP = 700 -JPEGQUALITY = 65537 # pseudo-tag by libtiff - -# 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", - 34925: "lzma", - 50000: "zstd", - 50001: "webp", -} - -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, (2,), 1, (8,), ()): ("L", "L"), - (MM, 1, (2,), 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, 0, (1,), 1, (16,), ()): ("I;16", "I;16"), - (II, 1, (1,), 1, (16,), ()): ("I;16", "I;16"), - (MM, 1, (1,), 1, (16,), ()): ("I;16B", "I;16B"), - (II, 1, (1,), 2, (16,), ()): ("I;16", "I;16R"), - (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,)): ("RGB", "RGBX"), - (MM, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGBX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGBXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGBXX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGBXXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGBXXX"), - (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, 8), (1, 0)): ("RGBA", "RGBaX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), - (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, 8), (2, 0)): ("RGBA", "RGBAX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), - (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), - (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), - (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,)): ("RGB", "RGBX;16L"), - (MM, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGB", "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), (0,)): ("P", "PX"), - (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, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), - (MM, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), - (II, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), - (MM, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), - (II, 5, (1,), 1, (16, 16, 16, 16), ()): ("CMYK", "CMYK;16L"), - (II, 6, (1,), 1, (8,), ()): ("L", "L"), - (MM, 6, (1,), 1, (8,), ()): ("L", "L"), - # JPEG compressed images handled by LibTiff and auto-converted to RGBX - # Minimal Baseline TIFF requires YCbCr images to have 3 SamplesPerPixel - (II, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), - (MM, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), - (II, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), - (MM, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), -} - -MAX_SAMPLESPERPIXEL = max(len(key_tp[4]) for key_tp in OPEN_INFO) - -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 - b"MM\x00\x2B", # BigTIFF with big-endian byte order - b"II\x2B\x00", # BigTIFF with little-endian byte order -] - -if not getattr(Image.core, "libtiff_support_custom_tags", True): - deprecate("Support for LibTIFF earlier than version 4", 12) - - -def _accept(prefix: bytes) -> bool: - 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 - - -def _limit_signed_rational(val, max_val, min_val): - frac = Fraction(val) - n_d = frac.numerator, frac.denominator - - if min(n_d) < min_val: - n_d = _limit_rational(val, abs(min_val)) - - if max(n_d) > max_val: - val = Fraction(*n_d) - n_d = _limit_rational(val, max_val) - - return n_d - - -## -# Wrapper for TIFF IFDs. - -_load_dispatch = {} -_write_dispatch = {} - - -def _delegate(op): - def delegate(self, *args): - return getattr(self._val, op)(*args) - - return delegate - - -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 - """ - if isinstance(value, IFDRational): - self._numerator = value.numerator - self._denominator = value.denominator - self._val = value._val - return - - if isinstance(value, Fraction): - self._numerator = value.numerator - self._denominator = value.denominator - else: - self._numerator = value - self._denominator = denominator - - if denominator == 0: - self._val = float("nan") - elif denominator == 1: - self._val = Fraction(value) - else: - self._val = Fraction(value, denominator) - - @property - def numerator(self): - return self._numerator - - @property - def denominator(self): - return self._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) -> str: - return str(float(self._val)) - - def __hash__(self) -> int: - return self._val.__hash__() - - def __eq__(self, other: object) -> bool: - val = self._val - if isinstance(other, IFDRational): - other = other._val - if isinstance(other, float): - val = float(val) - return val == other - - def __getstate__(self): - return [self._val, self._numerator, self._denominator] - - def __setstate__(self, state): - IFDRational.__init__(self, 0) - _val, _numerator, _denominator = state - self._val = _val - self._numerator = _numerator - self._denominator = _denominator - - """ a = ['add','radd', 'sub', 'rsub', 'mul', 'rmul', - 'truediv', 'rtruediv', 'floordiv', 'rfloordiv', - 'mod','rmod', 'pow','rpow', 'pos', 'neg', - 'abs', 'trunc', 'lt', 'gt', 'le', 'ge', 'bool', - '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__") - __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__") - __bool__ = _delegate("__bool__") - __ceil__ = _delegate("__ceil__") - __floor__ = _delegate("__floor__") - __round__ = _delegate("__round__") - # Python >= 3.11 - if hasattr(Fraction, "__int__"): - __int__ = _delegate("__int__") - - -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 # noqa: F821 - return func - - return decorator - - -def _register_writer(idx): - def decorator(func): - _write_dispatch[idx] = func # noqa: F821 - 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(f"={fmt}") - _load_dispatch[idx] = ( # noqa: F821 - size, - lambda self, data, legacy_api=True: ( - self._unpack(f"{len(data) // size}{fmt}", data) - ), - ) - _write_dispatch[idx] = lambda self, *values: ( # noqa: F821 - b"".join(self._pack(fmt, value) for value in values) - ) - - -if TYPE_CHECKING: - _IFDv2Base = MutableMapping[int, Any] -else: - _IFDv2Base = MutableMapping - - -class ImageFileDirectory_v2(_IFDv2Base): - """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] = TiffTags.ASCII - 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 - :attr:`~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 - :py:data:`.TiffTags.TYPES` - - .. versionadded:: 3.0.0 - - '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 - :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, 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``. - - """ - - _load_dispatch: dict[int, Callable[[ImageFileDirectory_v2, bytes, bool], Any]] = {} - _write_dispatch: dict[int, Callable[..., Any]] = {} - - def __init__( - self, - ifh: bytes = b"II\052\0\0\0\0\0", - prefix: bytes | None = None, - group: int | None = None, - ) -> 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 not _accept(ifh): - msg = f"not a TIFF file (header {repr(ifh)} not valid)" - raise SyntaxError(msg) - self._prefix = prefix if prefix is not None else ifh[:2] - if self._prefix == MM: - self._endian = ">" - elif self._prefix == II: - self._endian = "<" - else: - msg = "not a TIFF IFD" - raise SyntaxError(msg) - self._bigtiff = ifh[2] == 43 - self.group = group - self.tagtype: dict[int, int] = {} - """ Dictionary of tag types """ - self.reset() - (self.next,) = ( - self._unpack("Q", ifh[8:]) if self._bigtiff else self._unpack("L", ifh[4:]) - ) - self._legacy_api = False - - prefix = property(lambda self: self._prefix) - offset = property(lambda self: self._offset) - - @property - def legacy_api(self) -> bool: - return self._legacy_api - - @legacy_api.setter - def legacy_api(self, value: bool) -> NoReturn: - msg = "Not allowing setting of legacy api" - raise Exception(msg) - - def reset(self) -> None: - self._tags_v1: dict[int, Any] = {} # will remain empty if legacy_api is false - self._tags_v2: dict[int, Any] = {} # main tag storage - self._tagdata: dict[int, bytes] = {} - self.tagtype = {} # added 2008-06-05 by Florian Hoech - self._next = None - self._offset = None - - def __str__(self) -> str: - return str(dict(self)) - - def named(self): - """ - :returns: dict of name|key: value - - Returns the complete tag dictionary, with named tags where possible. - """ - return { - TiffTags.lookup(code, self.group).name: value - for code, value in self.items() - } - - def __len__(self) -> int: - 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 - - def __setitem__(self, tag, value): - self._setitem(tag, value, self.legacy_api) - - def _setitem(self, tag, value, legacy_api): - basetypes = (Number, bytes, str) - - info = TiffTags.lookup(tag, self.group) - 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] = TiffTags.UNDEFINED - if all(isinstance(v, IFDRational) for v in values): - self.tagtype[tag] = ( - TiffTags.RATIONAL - if all(v >= 0 for v in values) - else TiffTags.SIGNED_RATIONAL - ) - elif all(isinstance(v, int) for v in values): - if all(0 <= v < 2**16 for v in values): - self.tagtype[tag] = TiffTags.SHORT - elif all(-(2**15) < v < 2**15 for v in values): - self.tagtype[tag] = TiffTags.SIGNED_SHORT - else: - self.tagtype[tag] = ( - TiffTags.LONG - if all(v >= 0 for v in values) - else TiffTags.SIGNED_LONG - ) - elif all(isinstance(v, float) for v in values): - self.tagtype[tag] = TiffTags.DOUBLE - elif all(isinstance(v, str) for v in values): - self.tagtype[tag] = TiffTags.ASCII - elif all(isinstance(v, bytes) for v in values): - self.tagtype[tag] = TiffTags.BYTE - - if self.tagtype[tag] == TiffTags.UNDEFINED: - values = [ - v.encode("ascii", "replace") if isinstance(v, str) else v - for v in values - ] - elif self.tagtype[tag] == TiffTags.RATIONAL: - values = [float(v) if isinstance(v, int) else v for v in values] - - is_ifd = self.tagtype[tag] == TiffTags.LONG and isinstance(values, dict) - if not is_ifd: - 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 not is_ifd and ( - (info.length == 1) - or self.tagtype[tag] == TiffTags.BYTE - 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 [ - TiffTags.RATIONAL, - TiffTags.SIGNED_RATIONAL, - ]: # rationals - values = (values,) - try: - (dest[tag],) = values - except ValueError: - # We've got a builtin tag with 1 expected entry - warnings.warn( - f"Metadata Warning, tag {tag} had too many entries: " - f"{len(values)}, expected 1" - ) - dest[tag] = values[0] - - else: - # Spec'd length > 1 or undefined - # Unspec'd, and length > 1 - dest[tag] = values - - def __delitem__(self, tag: int) -> None: - 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) - - list( - map( - _register_basic, - [ - (TiffTags.SHORT, "H", "short"), - (TiffTags.LONG, "L", "long"), - (TiffTags.SIGNED_BYTE, "b", "signed byte"), - (TiffTags.SIGNED_SHORT, "h", "signed short"), - (TiffTags.SIGNED_LONG, "l", "signed long"), - (TiffTags.FLOAT, "f", "float"), - (TiffTags.DOUBLE, "d", "double"), - (TiffTags.IFD, "L", "long"), - (TiffTags.LONG8, "Q", "long8"), - ], - ) - ) - - @_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): - if isinstance(data, IFDRational): - data = int(data) - if isinstance(data, int): - data = bytes((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 isinstance(value, int): - value = str(value) - if not isinstance(value, bytes): - value = value.encode("ascii", "replace") - return value + b"\0" - - @_register_loader(5, 8) - def load_rational(self, data, legacy_api=True): - vals = self._unpack(f"{len(data) // 4}L", 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**32 - 1)) 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): - if isinstance(value, IFDRational): - value = int(value) - if isinstance(value, int): - value = str(value).encode("ascii", "replace") - return value - - @_register_loader(10, 8) - def load_signed_rational(self, data, legacy_api=True): - vals = self._unpack(f"{len(data) // 4}l", 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_signed_rational(frac, 2**31 - 1, -(2**31))) - for frac in values - ) - - def _ensure_read(self, fp, size): - ret = fp.read(size) - if len(ret) != size: - msg = ( - "Corrupt EXIF data. " - f"Expecting to read {size} bytes but only got {len(ret)}. " - ) - raise OSError(msg) - return ret - - def load(self, fp): - self.reset() - self._offset = fp.tell() - - try: - tag_count = ( - self._unpack("Q", self._ensure_read(fp, 8)) - if self._bigtiff - else self._unpack("H", self._ensure_read(fp, 2)) - )[0] - for i in range(tag_count): - tag, typ, count, data = ( - self._unpack("HHQ8s", self._ensure_read(fp, 20)) - if self._bigtiff - else self._unpack("HHL4s", self._ensure_read(fp, 12)) - ) - - tagname = TiffTags.lookup(tag, self.group).name - typname = TYPES.get(typ, "unknown") - msg = f"tag: {tagname} ({tag}) - type: {typname} ({typ})" - - try: - unit_size, handler = self._load_dispatch[typ] - except KeyError: - logger.debug("%s - unsupported type %s", msg, typ) - continue # ignore unsupported type - size = count * unit_size - if size > (8 if self._bigtiff else 4): - here = fp.tell() - (offset,) = self._unpack("Q" if self._bigtiff else "L", data) - msg += f" Tag Location: {here} - Data Location: {offset}" - 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. " - f"Expecting to read {size} bytes but only got {len(data)}." - f" Skipping tag {tag}" - ) - logger.debug(msg) - continue - - if not data: - logger.debug(msg) - continue - - self._tagdata[tag] = data - self.tagtype[tag] = typ - - msg += " - value: " + ( - "" % size if size > 32 else repr(data) - ) - logger.debug(msg) - - (self.next,) = ( - self._unpack("Q", self._ensure_read(fp, 8)) - if self._bigtiff - else self._unpack("L", self._ensure_read(fp, 4)) - ) - except OSError as msg: - warnings.warn(str(msg)) - return - - def tobytes(self, offset=0): - # FIXME What about tagdata? - result = self._pack("H", len(self._tags_v2)) - - entries = [] - offset = offset + len(result) + 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) - logger.debug("Tag %s, Type: %s, Value: %s", tag, typ, repr(value)) - is_ifd = typ == TiffTags.LONG and isinstance(value, dict) - if is_ifd: - if self._endian == "<": - ifh = b"II\x2A\x00\x08\x00\x00\x00" - else: - ifh = b"MM\x00\x2A\x00\x00\x00\x08" - ifd = ImageFileDirectory_v2(ifh, group=tag) - values = self._tags_v2[tag] - for ifd_tag, ifd_value in values.items(): - ifd[ifd_tag] = ifd_value - data = ifd.tobytes(offset) - else: - values = value if isinstance(value, tuple) else (value,) - data = self._write_dispatch[typ](self, *values) - - tagname = TiffTags.lookup(tag, self.group).name - typname = "ifd" if is_ifd else TYPES.get(typ, "unknown") - msg = f"save: {tagname} ({tag}) - type: {typname} ({typ})" - msg += " - value: " + ( - "" % len(data) if len(data) >= 16 else str(values) - ) - logger.debug(msg) - - # count is sum of lengths for string and arbitrary data - if is_ifd: - count = 1 - elif typ in [TiffTags.BYTE, TiffTags.ASCII, TiffTags.UNDEFINED]: - count = len(data) - else: - count = 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: - msg = "multistrip support not yet implemented" - raise NotImplementedError(msg) - 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: - logger.debug("%s %s %s %s %s", tag, typ, count, repr(value), repr(data)) - result += self._pack("HHL4s", tag, typ, count, value) - - # -- overwrite here for multi-page -- - result += b"\0\0\0\0" # end of entries - - # pass 3: write auxiliary data to file - for tag, typ, count, value, data in entries: - result += data - if len(data) & 1: - result += b"\0" - - return result - - 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)) - - offset = fp.tell() - result = self.tobytes(offset) - fp.write(result) - return offset + len(result) - - -ImageFileDirectory_v2._load_dispatch = _load_dispatch -ImageFileDirectory_v2._write_dispatch = _write_dispatch -for idx, name in TYPES.items(): - name = name.replace(" ", "_") - setattr(ImageFileDirectory_v2, f"load_{name}", _load_dispatch[idx][1]) - setattr(ImageFileDirectory_v2, f"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] = TiffTags.ASCII - print(ifd[key]) - ('Some Data',) - - Also contains a dictionary of tag types as read from the tiff image file, - :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`. - - Values are returned as a tuple. - - .. deprecated:: 3.0.0 - """ - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self._legacy_api = True - - tags = property(lambda self: self._tags_v1) - tagdata = property(lambda self: self._tagdata) - - # defined in ImageFileDirectory_v2 - tagtype: dict[int, int] - """Dictionary of tag types""" - - @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) -> ImageFileDirectory_v2: - """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) -> int: - 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 __init__(self, fp=None, filename=None): - self.tag_v2 = None - """ Image file directory (tag dictionary) """ - - self.tag = None - """ Legacy tag entries """ - - super().__init__(fp, filename) - - def _open(self) -> None: - """Open the first image in a TIFF file""" - - # Header - ifh = self.fp.read(8) - if ifh[2] == 43: - ifh += self.fp.read(8) - - self.tag_v2 = ImageFileDirectory_v2(ifh) - - # legacy IFD entries will be filled in later - self.ifd = None - - # setup frame pointers - self.__first = self.__next = self.tag_v2.next - self.__frame = -1 - self._fp = self.fp - self._frame_pos: list[int] = [] - self._n_frames: int | None = None - - logger.debug("*** TiffImageFile._open ***") - logger.debug("- __first: %s", self.__first) - logger.debug("- ifh: %s", repr(ifh)) # Use repr to avoid str(bytes) - - # and load the first frame - self._seek(0) - - @property - def n_frames(self): - if self._n_frames is None: - current = self.tell() - self._seek(len(self._frame_pos)) - while self._n_frames is None: - self._seek(self.tell() + 1) - self.seek(current) - return self._n_frames - - def seek(self, frame: int) -> None: - """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: int) -> None: - self.fp = self._fp - - # reset buffered io handle in case fp - # was passed to libtiff, invalidating the buffer - self.fp.tell() - - while len(self._frame_pos) <= frame: - if not self.__next: - msg = "no more images in TIFF file" - raise EOFError(msg) - logger.debug( - "Seeking to frame %s, on frame %s, __next %s, location: %s", - frame, - self.__frame, - self.__next, - self.fp.tell(), - ) - if self.__next >= 2**63: - msg = "Unable to seek to frame" - raise ValueError(msg) - self.fp.seek(self.__next) - self._frame_pos.append(self.__next) - logger.debug("Loading tags, location: %s", self.fp.tell()) - self.tag_v2.load(self.fp) - if self.tag_v2.next in self._frame_pos: - # This IFD has already been processed - # Declare this to be the end of the image - self.__next = 0 - else: - self.__next = self.tag_v2.next - if self.__next == 0: - self._n_frames = frame + 1 - if len(self._frame_pos) == 1: - self.is_animated = self.__next != 0 - self.__frame += 1 - self.fp.seek(self._frame_pos[frame]) - self.tag_v2.load(self.fp) - if XMP in self.tag_v2: - self.info["xmp"] = self.tag_v2[XMP] - elif "xmp" in self.info: - del self.info["xmp"] - self._reload_exif() - # 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) -> int: - """Return the current frame number""" - return self.__frame - - def get_photoshop_blocks(self): - """ - Returns a dictionary of Photoshop "Image Resource Blocks". - The keys are the image resource ID. For more information, see - https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727 - - :returns: Photoshop "Image Resource Blocks" in a dictionary. - """ - blocks = {} - val = self.tag_v2.get(ExifTags.Base.ImageResources) - if val: - while val[:4] == b"8BIM": - id = i16(val[4:6]) - n = math.ceil((val[6] + 1) / 2) * 2 - size = i32(val[6 + n : 10 + n]) - data = val[10 + n : 10 + n + size] - blocks[id] = {"data": data} - - val = val[math.ceil((10 + n + size) / 2) * 2 :] - return blocks - - def load(self): - if self.tile and self.use_load_libtiff: - return self._load_libtiff() - return super().load() - - def load_end(self) -> None: - # allow closing if we're on the first frame, there's no next - # This is the ImageFile.load path only, libtiff specific below. - if not self.is_animated: - self._close_exclusive_fp_after_loading = True - - # reset buffered io handle in case fp - # was passed to libtiff, invalidating the buffer - self.fp.tell() - - # load IFD data from fp before it is closed - exif = self.getexif() - for key in TiffTags.TAGS_V2_GROUPS: - if key not in exif: - continue - exif.get_ifd(key) - - ImageOps.exif_transpose(self, in_place=True) - if ExifTags.Base.Orientation in self.tag_v2: - del self.tag_v2[ExifTags.Base.Orientation] - - def _load_libtiff(self): - """Overload method triggered when we detect a compressed tiff - Calls out to libtiff""" - - Image.Image.load(self) - - self.load_prepare() - - if not len(self.tile) == 1: - msg = "Not exactly one tile" - raise OSError(msg) - - # (self._compression, (extents tuple), - # 0, (rawmode, self._compression, fp)) - extents = self.tile[0][1] - args = list(self.tile[0][3]) - - # To be nice on memory footprint, if there's a - # file descriptor, use that instead of reading - # into a string in python. - try: - fp = hasattr(self.fp, "fileno") and self.fp.fileno() - # flush the file descriptor, prevents error on pypy 2.4+ - # should also eliminate the need for fp.tell - # in _seek - if hasattr(self.fp, "flush"): - self.fp.flush() - except OSError: - # io.BytesIO have a fileno, but returns an OSError 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 as e: - msg = "Couldn't set the image" - raise OSError(msg) from e - - close_self_fp = self._exclusive_fp and not self.is_animated - 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 OSError if there's no underlying fp. Easier to - # deal with here by reordering. - logger.debug("have getvalue. just sending in a string from getvalue") - n, err = decoder.decode(self.fp.getvalue()) - elif fp: - # we've got a actual file on disk, pass in the fp. - logger.debug("have fileno, calling fileno version of the decoder.") - if not close_self_fp: - self.fp.seek(0) - # 4 bytes, otherwise the trace might error out - n, err = decoder.decode(b"fpfp") - else: - # we have something else. - logger.debug("don't have fileno or getvalue. just reading") - self.fp.seek(0) - # UNDONE -- so much for that buffer size thing. - n, err = decoder.decode(self.fp.read()) - - self.tile = [] - self.readonly = 0 - - self.load_end() - - if close_self_fp: - self.fp.close() - self.fp = None # might be shared - - if err < 0: - raise OSError(err) - - return Image.Image.load(self) - - def _setup(self): - """Setup this image object based on current tags""" - - if 0xBC01 in self.tag_v2: - msg = "Windows Media Photo files not yet supported" - raise OSError(msg) - - # 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) - - # old style jpeg compression images most certainly are YCbCr - if self._compression == "tiff_jpeg": - photo = 6 - - fillorder = self.tag_v2.get(FILLORDER, 1) - - logger.debug("*** Summary ***") - logger.debug("- compression: %s", self._compression) - logger.debug("- photometric_interpretation: %s", photo) - logger.debug("- planar_configuration: %s", self._planar_configuration) - logger.debug("- fill_order: %s", fillorder) - logger.debug("- YCbCr subsampling: %s", self.tag.get(YCBCRSUBSAMPLING)) - - # size - xsize = int(self.tag_v2.get(IMAGEWIDTH)) - ysize = int(self.tag_v2.get(IMAGELENGTH)) - self._size = xsize, ysize - - logger.debug("- size: %s", self.size) - - sample_format = self.tag_v2.get(SAMPLEFORMAT, (1,)) - if len(sample_format) > 1 and max(sample_format) == min(sample_format) == 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. - sample_format = (1,) - - bps_tuple = self.tag_v2.get(BITSPERSAMPLE, (1,)) - extra_tuple = self.tag_v2.get(EXTRASAMPLES, ()) - if photo in (2, 6, 8): # RGB, YCbCr, LAB - bps_count = 3 - elif photo == 5: # CMYK - bps_count = 4 - else: - bps_count = 1 - bps_count += len(extra_tuple) - bps_actual_count = len(bps_tuple) - samples_per_pixel = self.tag_v2.get( - SAMPLESPERPIXEL, - 3 if self._compression == "tiff_jpeg" and photo in (2, 6) else 1, - ) - - if samples_per_pixel > MAX_SAMPLESPERPIXEL: - # DOS check, samples_per_pixel can be a Long, and we extend the tuple below - logger.error( - "More samples per pixel than can be decoded: %s", samples_per_pixel - ) - msg = "Invalid value for samples per pixel" - raise SyntaxError(msg) - - if samples_per_pixel < bps_actual_count: - # If a file has more values in bps_tuple than expected, - # remove the excess. - bps_tuple = bps_tuple[:samples_per_pixel] - elif samples_per_pixel > bps_actual_count and bps_actual_count == 1: - # If a file has only one value in bps_tuple, when it should have more, - # presume it is the same number of bits for all of the samples. - bps_tuple = bps_tuple * samples_per_pixel - - if len(bps_tuple) != samples_per_pixel: - msg = "unknown data organization" - raise SyntaxError(msg) - - # mode: check photometric interpretation and bits per pixel - key = ( - self.tag_v2.prefix, - photo, - sample_format, - fillorder, - bps_tuple, - extra_tuple, - ) - logger.debug("format key: %s", key) - try: - self._mode, rawmode = OPEN_INFO[key] - except KeyError as e: - logger.debug("- unsupported format") - msg = "unknown pixel mode" - raise SyntaxError(msg) from e - - logger.debug("- raw mode: %s", rawmode) - logger.debug("- pil mode: %s", 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 = layer = 0 - self.tile = [] - self.use_load_libtiff = READ_LIBTIFF or self._compression != "raw" - if self.use_load_libtiff: - # 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. - - # 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: - # Replace fillorder with fillorder=1 - key = key[:3] + (1,) + key[4:] - logger.debug("format key: %s", 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 rawmode == "I;16": - rawmode = "I;16N" - if ";16B" in rawmode: - rawmode = rawmode.replace(";16B", ";16N") - if ";16L" in rawmode: - rawmode = rawmode.replace(";16L", ";16N") - - # YCbCr images with new jpeg compression with pixels in one plane - # unpacked straight into RGB values - if ( - photo == 6 - and self._compression == "jpeg" - and self._planar_configuration == 1 - ): - rawmode = "RGB" - - # 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.tag_v2.offset) - self.tile.append(("libtiff", (0, 0, xsize, ysize), 0, a)) - - elif STRIPOFFSETS in self.tag_v2 or TILEOFFSETS in self.tag_v2: - # striped image - if STRIPOFFSETS in self.tag_v2: - offsets = self.tag_v2[STRIPOFFSETS] - h = self.tag_v2.get(ROWSPERSTRIP, ysize) - w = self.size[0] - else: - # tiled image - offsets = self.tag_v2[TILEOFFSETS] - w = self.tag_v2.get(TILEWIDTH) - h = self.tag_v2.get(TILELENGTH) - - for offset in offsets: - if x + w > xsize: - stride = w * sum(bps_tuple) / 8 # bytes per line - else: - stride = 0 - - tile_rawmode = rawmode - if self._planar_configuration == 2: - # each band on it's own layer - tile_rawmode = rawmode[layer] - # adjust stride width accordingly - stride /= bps_count - - a = (tile_rawmode, int(stride), 1) - self.tile.append( - ( - self._compression, - (x, y, min(x + w, xsize), min(y + h, ysize)), - offset, - a, - ) - ) - x = x + w - if x >= self.size[0]: - x, y = 0, y + h - if y >= self.size[1]: - x = y = 0 - layer += 1 - else: - logger.debug("- unsupported data organization") - msg = "unknown data organization" - raise SyntaxError(msg) - - # Fix up info. - if ICCPROFILE in self.tag_v2: - self.info["icc_profile"] = self.tag_v2[ICCPROFILE] - - # fixup palette descriptor - - if self.mode in ["P", "PA"]: - 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 as e: - msg = f"cannot write mode {im.mode} as TIFF" - raise OSError(msg) from e - - ifd = ImageFileDirectory_v2(prefix=prefix) - - encoderinfo = im.encoderinfo - encoderconfig = im.encoderconfig - try: - compression = encoderinfo["compression"] - except KeyError: - compression = im.info.get("compression") - if isinstance(compression, int): - # compression value may be from BMP. Ignore it - compression = None - if compression is None: - compression = "raw" - elif compression == "tiff_jpeg": - # OJPEG is obsolete, so use new-style JPEG compression instead - compression = "jpeg" - elif compression == "tiff_deflate": - compression = "tiff_adobe_deflate" - - libtiff = WRITE_LIBTIFF or compression != "raw" - - # required for color libtiff images - ifd[PLANAR_CONFIGURATION] = 1 - - ifd[IMAGEWIDTH] = im.size[0] - ifd[IMAGELENGTH] = im.size[1] - - # write any arbitrary tags passed in as an ImageFileDirectory - if "tiffinfo" in encoderinfo: - info = encoderinfo["tiffinfo"] - elif "exif" in encoderinfo: - info = encoderinfo["exif"] - if isinstance(info, bytes): - exif = Image.Exif() - exif.load(info) - info = exif - else: - info = {} - logger.debug("Tiffinfo Keys: %s", list(info)) - if isinstance(info, ImageFileDirectory_v1): - info = info.to_v2() - for key in info: - if isinstance(info, Image.Exif) and key in TiffTags.TAGS_V2_GROUPS: - ifd[key] = info.get_ifd(key) - else: - ifd[key] = info.get(key) - try: - ifd.tagtype[key] = info.tagtype[key] - except Exception: - pass # might not be an IFD. Might not have populated type - - legacy_ifd = {} - if hasattr(im, "tag"): - legacy_ifd = im.tag.to_v2() - - supplied_tags = {**legacy_ifd, **getattr(im, "tag_v2", {})} - for tag in ( - # IFD offset that may not be correct in the saved image - EXIFIFD, - # Determined by the image format and should not be copied from legacy_ifd. - SAMPLEFORMAT, - ): - if tag in supplied_tags: - del supplied_tags[tag] - - # 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: - if key == IPTC_NAA_CHUNK and im.tag_v2.tagtype[key] not in ( - TiffTags.BYTE, - TiffTags.UNDEFINED, - ): - del supplied_tags[key] - else: - 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 - icc = encoderinfo.get("icc_profile", im.info.get("icc_profile")) - if icc: - ifd[ICCPROFILE] = icc - - 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 encoderinfo: - ifd[key] = encoderinfo[name] - - dpi = 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 - - if PHOTOMETRIC_INTERPRETATION not in ifd: - ifd[PHOTOMETRIC_INTERPRETATION] = photo - elif im.mode in ("1", "L") and ifd[PHOTOMETRIC_INTERPRETATION] == 0: - if im.mode == "1": - inverted_im = im.copy() - px = inverted_im.load() - for y in range(inverted_im.height): - for x in range(inverted_im.width): - px[x, y] = 0 if px[x, y] == 255 else 255 - im = inverted_im - else: - im = ImageOps.invert(im) - - if im.mode in ["P", "PA"]: - lut = im.im.getpalette("RGB", "RGB;L") - colormap = [] - colors = len(lut) // 3 - for i in range(3): - colormap += [v * 256 for v in lut[colors * i : colors * (i + 1)]] - colormap += [0] * (256 - colors) - ifd[COLORMAP] = colormap - # data orientation - w, h = ifd[IMAGEWIDTH], ifd[IMAGELENGTH] - stride = len(bits) * ((w * bits[0] + 7) // 8) - if ROWSPERSTRIP not in ifd: - # aim for given strip size (64 KB by default) when using libtiff writer - if libtiff: - im_strip_size = encoderinfo.get("strip_size", STRIP_SIZE) - rows_per_strip = 1 if stride == 0 else min(im_strip_size // stride, h) - # JPEG encoder expects multiple of 8 rows - if compression == "jpeg": - rows_per_strip = min(((rows_per_strip + 7) // 8) * 8, h) - else: - rows_per_strip = h - if rows_per_strip == 0: - rows_per_strip = 1 - ifd[ROWSPERSTRIP] = rows_per_strip - strip_byte_counts = 1 if stride == 0 else stride * ifd[ROWSPERSTRIP] - strips_per_image = (h + ifd[ROWSPERSTRIP] - 1) // ifd[ROWSPERSTRIP] - if strip_byte_counts >= 2**16: - ifd.tagtype[STRIPBYTECOUNTS] = TiffTags.LONG - ifd[STRIPBYTECOUNTS] = (strip_byte_counts,) * (strips_per_image - 1) + ( - stride * h - strip_byte_counts * (strips_per_image - 1), - ) - ifd[STRIPOFFSETS] = tuple( - range(0, strip_byte_counts * strips_per_image, strip_byte_counts) - ) # this is adjusted by IFD writer - # no compression by default: - ifd[COMPRESSION] = COMPRESSION_INFO_REV.get(compression, 1) - - if im.mode == "YCbCr": - for tag, value in { - YCBCRSUBSAMPLING: (1, 1), - REFERENCEBLACKWHITE: (0, 255, 128, 255, 128, 255), - }.items(): - ifd.setdefault(tag, value) - - blocklist = [TILEWIDTH, TILELENGTH, TILEOFFSETS, TILEBYTECOUNTS] - if libtiff: - if "quality" in encoderinfo: - quality = encoderinfo["quality"] - if not isinstance(quality, int) or quality < 0 or quality > 100: - msg = "Invalid quality setting" - raise ValueError(msg) - if compression != "jpeg": - msg = "quality setting only supported for 'jpeg' compression" - raise ValueError(msg) - ifd[JPEGQUALITY] = quality - - logger.debug("Saving using libtiff encoder") - logger.debug("Items: %s", sorted(ifd.items())) - _fp = 0 - if hasattr(fp, "fileno"): - try: - fp.seek(0) - _fp = os.dup(fp.fileno()) - except io.UnsupportedOperation: - pass - - # optional types for non core tags - types = {} - # STRIPOFFSETS and STRIPBYTECOUNTS are added by the library - # based on the data in the strip. - # OSUBFILETYPE is deprecated. - # The other tags expect arrays with a certain length (fixed or depending on - # BITSPERSAMPLE, etc), passing arrays with a different length will result in - # segfaults. Block these tags until we add extra validation. - # SUBIFD may also cause a segfault. - blocklist += [ - OSUBFILETYPE, - REFERENCEBLACKWHITE, - STRIPBYTECOUNTS, - STRIPOFFSETS, - TRANSFERFUNCTION, - SUBIFD, - ] - - # 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. - for tag, value in itertools.chain(ifd.items(), supplied_tags.items()): - # Libtiff can only process certain core items without adding - # them to the custom dictionary. - # Custom items are supported for int, float, unicode, string and byte - # values. Other types and tuples require a tagtype. - if tag not in TiffTags.LIBTIFF_CORE: - if not getattr(Image.core, "libtiff_support_custom_tags", False): - continue - - if tag in ifd.tagtype: - types[tag] = ifd.tagtype[tag] - elif not (isinstance(value, (int, float, str, bytes))): - continue - else: - type = TiffTags.lookup(tag).type - if type: - types[tag] = type - if tag not in atts and tag not in blocklist: - if isinstance(value, str): - atts[tag] = value.encode("ascii", "replace") + b"\0" - elif isinstance(value, IFDRational): - atts[tag] = float(value) - else: - atts[tag] = value - - if SAMPLEFORMAT in atts and len(atts[SAMPLEFORMAT]) == 1: - atts[SAMPLEFORMAT] = atts[SAMPLEFORMAT][0] - - logger.debug("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" - - # Pass tags as sorted list so that the tags are set in a fixed order. - # This is required by libtiff for some tags. For example, the JPEGQUALITY - # pseudo tag requires that the COMPRESS tag was already set. - tags = list(atts.items()) - tags.sort() - a = (rawmode, compression, _fp, filename, tags, types) - encoder = Image._getencoder(im.mode, "libtiff", a, encoderconfig) - encoder.setimage(im.im, (0, 0) + im.size) - while True: - # undone, change to self.decodermaxblock: - errcode, data = encoder.encode(16 * 1024)[1:] - if not _fp: - fp.write(data) - if errcode: - break - if _fp: - try: - os.close(_fp) - except OSError: - pass - if errcode < 0: - msg = f"encoder error {errcode} when writing image file" - raise OSError(msg) - - else: - for tag in blocklist: - del ifd[tag] - 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 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 - 4, # ifd - 2, # unicode - 4, # complex - 8, # long8 - ] - - Tags = { - 273, # StripOffsets - 288, # FreeOffsets - 324, # TileOffsets - 519, # JPEGQTables - 520, # JPEGDCTables - 521, # JPEGACTables - } - - 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 = open(fn, "w+b" if new else "r+b") - except OSError: - self.f = open(fn, "w+b") - self.beginning = self.f.tell() - self.setup() - - def setup(self) -> None: - # 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: - msg = "Invalid TIFF file header" - raise RuntimeError(msg) - - self.skipIFDs() - self.goToEnd() - - def finalize(self) -> None: - if self.isFirst: - return - - # fix offsets - self.f.seek(self.offsetOfNewPage) - - iimm = self.f.read(4) - if not iimm: - # Make it easy to finish a frame without committing to a new one. - return - - if iimm != self.IIMM: - msg = "IIMM of new page doesn't match IIMM of first page" - raise RuntimeError(msg) - - ifd_offset = self.readLong() - ifd_offset += self.offsetOfNewPage - self.f.seek(self.whereToWriteNewIFDOffset) - self.writeLong(ifd_offset) - self.f.seek(ifd_offset) - self.fixIFD() - - def newFrame(self) -> None: - # Call this to finish a frame. - self.finalize() - self.setup() - - def __enter__(self) -> AppendingTiffWriter: - return self - - def __exit__(self, *args: object) -> None: - if self.close_fp: - self.close() - - def tell(self) -> int: - return self.f.tell() - self.offsetOfNewPage - - def seek(self, offset, whence=io.SEEK_SET): - if whence == os.SEEK_SET: - offset += self.offsetOfNewPage - - self.f.seek(offset, whence) - return self.tell() - - def goToEnd(self) -> None: - self.f.seek(0, os.SEEK_END) - pos = self.f.tell() - - # pad to 16 byte boundary - pad_bytes = 16 - pos % 16 - if 0 < pad_bytes < 16: - self.f.write(bytes(pad_bytes)) - self.offsetOfNewPage = self.f.tell() - - def setEndian(self, endian: str) -> None: - self.endian = endian - self.longFmt = f"{self.endian}L" - self.shortFmt = f"{self.endian}H" - self.tagFormat = f"{self.endian}HHL" - - def skipIFDs(self) -> None: - while True: - ifd_offset = self.readLong() - if ifd_offset == 0: - self.whereToWriteNewIFDOffset = self.f.tell() - 4 - break - - self.f.seek(ifd_offset) - num_tags = self.readShort() - self.f.seek(num_tags * 12, os.SEEK_CUR) - - def write(self, data: bytes) -> int | None: - return self.f.write(data) - - def readShort(self) -> int: - (value,) = struct.unpack(self.shortFmt, self.f.read(2)) - return value - - def readLong(self) -> int: - (value,) = struct.unpack(self.longFmt, self.f.read(4)) - return value - - def rewriteLastShortToLong(self, value: int) -> None: - self.f.seek(-2, os.SEEK_CUR) - bytes_written = self.f.write(struct.pack(self.longFmt, value)) - if bytes_written is not None and bytes_written != 4: - msg = f"wrote only {bytes_written} bytes but wanted 4" - raise RuntimeError(msg) - - def rewriteLastShort(self, value: int) -> None: - self.f.seek(-2, os.SEEK_CUR) - bytes_written = self.f.write(struct.pack(self.shortFmt, value)) - if bytes_written is not None and bytes_written != 2: - msg = f"wrote only {bytes_written} bytes but wanted 2" - raise RuntimeError(msg) - - def rewriteLastLong(self, value: int) -> None: - self.f.seek(-4, os.SEEK_CUR) - bytes_written = self.f.write(struct.pack(self.longFmt, value)) - if bytes_written is not None and bytes_written != 4: - msg = f"wrote only {bytes_written} bytes but wanted 4" - raise RuntimeError(msg) - - def writeShort(self, value: int) -> None: - bytes_written = self.f.write(struct.pack(self.shortFmt, value)) - if bytes_written is not None and bytes_written != 2: - msg = f"wrote only {bytes_written} bytes but wanted 2" - raise RuntimeError(msg) - - def writeLong(self, value: int) -> None: - bytes_written = self.f.write(struct.pack(self.longFmt, value)) - if bytes_written is not None and bytes_written != 4: - msg = f"wrote only {bytes_written} bytes but wanted 4" - raise RuntimeError(msg) - - def close(self) -> None: - self.finalize() - self.f.close() - - def fixIFD(self) -> None: - num_tags = self.readShort() - - for i in range(num_tags): - tag, field_type, count = struct.unpack(self.tagFormat, self.f.read(8)) - - field_size = self.fieldSizes[field_type] - total_size = field_size * count - is_local = total_size <= 4 - offset: int | None - if not is_local: - offset = self.readLong() + self.offsetOfNewPage - self.rewriteLastLong(offset) - - if tag in self.Tags: - cur_pos = self.f.tell() - - if is_local: - self.fixOffsets( - count, isShort=(field_size == 2), isLong=(field_size == 4) - ) - self.f.seek(cur_pos + 4) - else: - self.f.seek(offset) - self.fixOffsets( - count, isShort=(field_size == 2), isLong=(field_size == 4) - ) - self.f.seek(cur_pos) - - offset = cur_pos = None - - elif is_local: - # skip the locally stored value that is not an offset - self.f.seek(4, os.SEEK_CUR) - - def fixOffsets( - self, count: int, isShort: bool = False, isLong: bool = False - ) -> None: - if not isShort and not isLong: - msg = "offset is neither short nor long" - raise RuntimeError(msg) - - 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: - msg = "not implemented" - raise RuntimeError(msg) # 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(TiffTags.LONG) # 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: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - encoderinfo = im.encoderinfo.copy() - encoderconfig = im.encoderconfig - append_images = list(encoderinfo.get("append_images", [])) - if not hasattr(im, "n_frames") and not 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/.venv/Lib/site-packages/PIL/TiffTags.py b/.venv/Lib/site-packages/PIL/TiffTags.py deleted file mode 100644 index e318c87..0000000 --- a/.venv/Lib/site-packages/PIL/TiffTags.py +++ /dev/null @@ -1,555 +0,0 @@ -# -# 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 __future__ import annotations - -from typing import NamedTuple - - -class _TagInfo(NamedTuple): - value: int | None - name: str - type: int | None - length: int | None - enum: dict[str, int] - - -class TagInfo(_TagInfo): - __slots__: list[str] = [] - - def __new__(cls, value=None, name="unknown", type=None, length=None, enum=None): - return super().__new__(cls, value, name, type, length, enum or {}) - - def cvt_enum(self, value): - # Using get will call hash(value), which can be expensive - # for some types (e.g. Fraction). Since self.enum is rarely - # used, it's usually better to test it first. - return self.enum.get(value, value) if self.enum else value - - -def lookup(tag, group=None): - """ - :param tag: Integer tag number - :param group: Which :py:data:`~PIL.TiffTags.TAGS_V2_GROUPS` to look in - - .. versionadded:: 8.3.0 - - :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 - - """ - - if group is not None: - info = TAGS_V2_GROUPS[group].get(tag) if group in TAGS_V2_GROUPS else None - else: - info = TAGS_V2.get(tag) - return info or 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 -SIGNED_BYTE = 6 -UNDEFINED = 7 -SIGNED_SHORT = 8 -SIGNED_LONG = 9 -SIGNED_RATIONAL = 10 -FLOAT = 11 -DOUBLE = 12 -IFD = 13 -LONG8 = 16 - -_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", SHORT, 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", RATIONAL, 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), - 330: ("SubIFDs", 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", RATIONAL, 6), - 700: ("XMP", BYTE, 0), - 33432: ("Copyright", ASCII, 1), - 33723: ("IptcNaaInfo", UNDEFINED, 1), - 34377: ("PhotoshopInfo", BYTE, 0), - # FIXME add more tags here - 34665: ("ExifIFD", LONG, 1), - 34675: ("ICCProfile", UNDEFINED, 1), - 34853: ("GPSInfoIFD", LONG, 1), - 36864: ("ExifVersion", UNDEFINED, 1), - 37724: ("ImageSourceData", UNDEFINED, 1), - 40965: ("InteroperabilityIFD", LONG, 1), - 41730: ("CFAPattern", UNDEFINED, 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), - 40960: ("FlashPixVersion", UNDEFINED, 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 -} -TAGS_V2_GROUPS = { - # ExifIFD - 34665: { - 36864: ("ExifVersion", UNDEFINED, 1), - 40960: ("FlashPixVersion", UNDEFINED, 1), - 40965: ("InteroperabilityIFD", LONG, 1), - 41730: ("CFAPattern", UNDEFINED, 1), - }, - # GPSInfoIFD - 34853: { - 0: ("GPSVersionID", BYTE, 4), - 1: ("GPSLatitudeRef", ASCII, 2), - 2: ("GPSLatitude", RATIONAL, 3), - 3: ("GPSLongitudeRef", ASCII, 2), - 4: ("GPSLongitude", RATIONAL, 3), - 5: ("GPSAltitudeRef", BYTE, 1), - 6: ("GPSAltitude", RATIONAL, 1), - 7: ("GPSTimeStamp", RATIONAL, 3), - 8: ("GPSSatellites", ASCII, 0), - 9: ("GPSStatus", ASCII, 2), - 10: ("GPSMeasureMode", ASCII, 2), - 11: ("GPSDOP", RATIONAL, 1), - 12: ("GPSSpeedRef", ASCII, 2), - 13: ("GPSSpeed", RATIONAL, 1), - 14: ("GPSTrackRef", ASCII, 2), - 15: ("GPSTrack", RATIONAL, 1), - 16: ("GPSImgDirectionRef", ASCII, 2), - 17: ("GPSImgDirection", RATIONAL, 1), - 18: ("GPSMapDatum", ASCII, 0), - 19: ("GPSDestLatitudeRef", ASCII, 2), - 20: ("GPSDestLatitude", RATIONAL, 3), - 21: ("GPSDestLongitudeRef", ASCII, 2), - 22: ("GPSDestLongitude", RATIONAL, 3), - 23: ("GPSDestBearingRef", ASCII, 2), - 24: ("GPSDestBearing", RATIONAL, 1), - 25: ("GPSDestDistanceRef", ASCII, 2), - 26: ("GPSDestDistance", RATIONAL, 1), - 27: ("GPSProcessingMethod", UNDEFINED, 0), - 28: ("GPSAreaInformation", UNDEFINED, 0), - 29: ("GPSDateStamp", ASCII, 11), - 30: ("GPSDifferential", SHORT, 1), - }, - # InteroperabilityIFD - 40965: {1: ("InteropIndex", ASCII, 1), 2: ("InteropVersion", UNDEFINED, 1)}, -} - -# 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", -} - -TAGS_V2: dict[int, TagInfo] = {} - - -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) - - for tags in TAGS_V2_GROUPS.values(): - for k, v in tags.items(): - tags[k] = TagInfo(k, *v) - - -_populate() -## -# Map type numbers to type names -- defined in ImageFileDirectory. - -TYPES: dict[int, str] = {} - -# -# 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: - -# Following pseudo-tags are also handled by default in libtiff: -# TIFFTAG_JPEGQUALITY 65537 - -# some of these are not in our TAGS_V2 dict and were included from tiff.h - -# This list also exists in encode.c -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 - 65537, -} - -LIBTIFF_CORE.remove(255) # We don't have support for subfiletypes -LIBTIFF_CORE.remove(322) # We don't have support for writing tiled images with 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/.venv/Lib/site-packages/PIL/WalImageFile.py b/.venv/Lib/site-packages/PIL/WalImageFile.py deleted file mode 100644 index fbd7be6..0000000 --- a/.venv/Lib/site-packages/PIL/WalImageFile.py +++ /dev/null @@ -1,124 +0,0 @@ -# -# 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. -# - -""" -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. - -.. note:: - This format cannot be automatically recognized, so the reader - is not registered for use with :py:func:`PIL.Image.open()`. - To open a WAL file, use the :py:func:`PIL.WalImageFile.open()` function instead. -""" -from __future__ import annotations - -from . import Image, ImageFile -from ._binary import i32le as i32 - - -class WalImageFile(ImageFile.ImageFile): - format = "WAL" - format_description = "Quake2 Texture" - - def _open(self) -> None: - self._mode = "P" - - # read header fields - header = self.fp.read(32 + 24 + 32 + 12) - self._size = i32(header, 32), i32(header, 36) - Image._decompression_bomb_check(self.size) - - # load pixel data - offset = i32(header, 40) - self.fp.seek(offset) - - # strings are null-terminated - self.info["name"] = header[:32].split(b"\0", 1)[0] - next_name = header[56 : 56 + 32].split(b"\0", 1)[0] - if next_name: - self.info["next_name"] = next_name - - def load(self): - if not self.im: - self.im = Image.core.new(self.mode, self.size) - self.frombytes(self.fp.read(self.size[0] * self.size[1])) - self.putpalette(quake2palette) - return Image.Image.load(self) - - -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 :py:func:`PIL.Image.Image.putpalette()` method. - - :param filename: WAL file name, or an opened file handle. - :returns: An image instance. - """ - return WalImageFile(filename) - - -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/.venv/Lib/site-packages/PIL/WebPImagePlugin.py b/.venv/Lib/site-packages/PIL/WebPImagePlugin.py deleted file mode 100644 index 59be5bf..0000000 --- a/.venv/Lib/site-packages/PIL/WebPImagePlugin.py +++ /dev/null @@ -1,363 +0,0 @@ -from __future__ import annotations - -from io import BytesIO -from typing import IO, Any - -from . import Image, ImageFile - -try: - from . import _webp - - SUPPORTED = True -except ImportError: - SUPPORTED = False - - -_VALID_WEBP_MODES = {"RGBX": True, "RGBA": True, "RGB": True} - -_VALID_WEBP_LEGACY_MODES = {"RGB": True, "RGBA": True} - -_VP8_MODES_BY_IDENTIFIER = { - b"VP8 ": "RGB", - b"VP8X": "RGBA", - b"VP8L": "RGBA", # lossless -} - - -def _accept(prefix: bytes) -> bool | str: - 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 - - if is_riff_file_format and is_webp_file and is_valid_vp8_mode: - if not SUPPORTED: - return ( - "image file could not be identified because WEBP support not installed" - ) - return True - return False - - -class WebPImageFile(ImageFile.ImageFile): - format = "WEBP" - format_description = "WebP image" - __loaded = 0 - __logical_frame = 0 - - def _open(self) -> None: - if not _webp.HAVE_WEBPANIM: - # Legacy mode - 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)] - self.n_frames = 1 - self.is_animated = False - return - - # Use the newer AnimDecoder API to parse the (possibly) animated file, - # and access muxed chunks like ICC/EXIF/XMP. - self._decoder = _webp.WebPAnimDecoder(self.fp.read()) - - # Get info from decoder - width, height, loop_count, bgcolor, frame_count, mode = self._decoder.get_info() - self._size = width, height - self.info["loop"] = loop_count - bg_a, bg_r, bg_g, bg_b = ( - (bgcolor >> 24) & 0xFF, - (bgcolor >> 16) & 0xFF, - (bgcolor >> 8) & 0xFF, - bgcolor & 0xFF, - ) - self.info["background"] = (bg_r, bg_g, bg_b, bg_a) - self.n_frames = frame_count - self.is_animated = self.n_frames > 1 - self._mode = "RGB" if mode == "RGBX" else mode - self.rawmode = mode - self.tile = [] - - # Attempt to read ICC / EXIF / XMP chunks from file - icc_profile = self._decoder.get_chunk("ICCP") - exif = self._decoder.get_chunk("EXIF") - xmp = self._decoder.get_chunk("XMP ") - if icc_profile: - self.info["icc_profile"] = icc_profile - if exif: - self.info["exif"] = exif - if xmp: - self.info["xmp"] = xmp - - # Initialize seek state - self._reset(reset=False) - - def _getexif(self) -> dict[str, Any] | None: - if "exif" not in self.info: - return None - return self.getexif()._get_merged_dict() - - def seek(self, frame: int) -> None: - if not self._seek_check(frame): - return - - # Set logical frame to requested position - self.__logical_frame = frame - - def _reset(self, reset: bool = True) -> None: - if reset: - self._decoder.reset() - self.__physical_frame = 0 - self.__loaded = -1 - self.__timestamp = 0 - - def _get_next(self): - # Get next frame - ret = self._decoder.get_next() - self.__physical_frame += 1 - - # Check if an error occurred - if ret is None: - self._reset() # Reset just to be safe - self.seek(0) - msg = "failed to decode next frame in WebP file" - raise EOFError(msg) - - # Compute duration - data, timestamp = ret - duration = timestamp - self.__timestamp - self.__timestamp = timestamp - - # libwebp gives frame end, adjust to start of frame - timestamp -= duration - return data, timestamp, duration - - def _seek(self, frame: int) -> None: - if self.__physical_frame == frame: - return # Nothing to do - if frame < self.__physical_frame: - self._reset() # Rewind to beginning - while self.__physical_frame < frame: - self._get_next() # Advance to the requested frame - - def load(self): - if _webp.HAVE_WEBPANIM: - if self.__loaded != self.__logical_frame: - self._seek(self.__logical_frame) - - # We need to load the image data for this frame - data, timestamp, duration = self._get_next() - self.info["timestamp"] = timestamp - self.info["duration"] = duration - self.__loaded = self.__logical_frame - - # Set tile - if self.fp and self._exclusive_fp: - self.fp.close() - self.fp = BytesIO(data) - self.tile = [("raw", (0, 0) + self.size, 0, self.rawmode)] - - return super().load() - - def load_seek(self, pos: int) -> None: - pass - - def tell(self) -> int: - if not _webp.HAVE_WEBPANIM: - return super().tell() - - return self.__logical_frame - - -def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - encoderinfo = im.encoderinfo.copy() - append_images = list(encoderinfo.get("append_images", [])) - - # If total frame count is 1, then save using the legacy API, which - # will preserve non-alpha modes - total = 0 - for ims in [im] + append_images: - total += getattr(ims, "n_frames", 1) - if total == 1: - _save(im, fp, filename) - return - - background: int | tuple[int, ...] = (0, 0, 0, 0) - if "background" in encoderinfo: - background = encoderinfo["background"] - elif "background" in im.info: - background = im.info["background"] - if isinstance(background, int): - # GifImagePlugin stores a global color table index in - # info["background"]. So it must be converted to an RGBA value - palette = im.getpalette() - if palette: - r, g, b = palette[background * 3 : (background + 1) * 3] - background = (r, g, b, 255) - else: - background = (background, background, background, 255) - - duration = im.encoderinfo.get("duration", im.info.get("duration", 0)) - loop = im.encoderinfo.get("loop", 0) - minimize_size = im.encoderinfo.get("minimize_size", False) - kmin = im.encoderinfo.get("kmin", None) - kmax = im.encoderinfo.get("kmax", None) - allow_mixed = im.encoderinfo.get("allow_mixed", False) - verbose = False - lossless = im.encoderinfo.get("lossless", False) - quality = im.encoderinfo.get("quality", 80) - alpha_quality = im.encoderinfo.get("alpha_quality", 100) - method = im.encoderinfo.get("method", 0) - icc_profile = im.encoderinfo.get("icc_profile") or "" - exif = im.encoderinfo.get("exif", "") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - xmp = im.encoderinfo.get("xmp", "") - if allow_mixed: - lossless = False - - # Sensible keyframe defaults are from gif2webp.c script - if kmin is None: - kmin = 9 if lossless else 3 - if kmax is None: - kmax = 17 if lossless else 5 - - # Validate background color - if ( - not isinstance(background, (list, tuple)) - or len(background) != 4 - or not all(0 <= v < 256 for v in background) - ): - msg = f"Background color is not an RGBA tuple clamped to (0-255): {background}" - raise OSError(msg) - - # Convert to packed uint - bg_r, bg_g, bg_b, bg_a = background - background = (bg_a << 24) | (bg_r << 16) | (bg_g << 8) | (bg_b << 0) - - # Setup the WebP animation encoder - enc = _webp.WebPAnimEncoder( - im.size[0], - im.size[1], - background, - loop, - minimize_size, - kmin, - kmax, - allow_mixed, - verbose, - ) - - # Add each frame - frame_idx = 0 - timestamp = 0 - cur_idx = im.tell() - try: - for ims in [im] + append_images: - # Get # of frames in this image - nfr = getattr(ims, "n_frames", 1) - - for idx in range(nfr): - ims.seek(idx) - ims.load() - - # Make sure image mode is supported - frame = ims - rawmode = ims.mode - if ims.mode not in _VALID_WEBP_MODES: - alpha = ( - "A" in ims.mode - or "a" in ims.mode - or (ims.mode == "P" and "A" in ims.im.getpalettemode()) - ) - rawmode = "RGBA" if alpha else "RGB" - frame = ims.convert(rawmode) - - if rawmode == "RGB": - # For faster conversion, use RGBX - rawmode = "RGBX" - - # Append the frame to the animation encoder - enc.add( - frame.tobytes("raw", rawmode), - round(timestamp), - frame.size[0], - frame.size[1], - rawmode, - lossless, - quality, - alpha_quality, - method, - ) - - # Update timestamp and frame index - if isinstance(duration, (list, tuple)): - timestamp += duration[frame_idx] - else: - timestamp += duration - frame_idx += 1 - - finally: - im.seek(cur_idx) - - # Force encoder to flush frames - enc.add(None, round(timestamp), 0, 0, "", lossless, quality, alpha_quality, 0) - - # Get the final output from the encoder - data = enc.assemble(icc_profile, exif, xmp) - if data is None: - msg = "cannot write file as WebP (encoder returned None)" - raise OSError(msg) - - fp.write(data) - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - lossless = im.encoderinfo.get("lossless", False) - quality = im.encoderinfo.get("quality", 80) - alpha_quality = im.encoderinfo.get("alpha_quality", 100) - icc_profile = im.encoderinfo.get("icc_profile") or "" - exif = im.encoderinfo.get("exif", b"") - if isinstance(exif, Image.Exif): - exif = exif.tobytes() - if exif.startswith(b"Exif\x00\x00"): - exif = exif[6:] - xmp = im.encoderinfo.get("xmp", "") - method = im.encoderinfo.get("method", 4) - exact = 1 if im.encoderinfo.get("exact") else 0 - - if im.mode not in _VALID_WEBP_LEGACY_MODES: - im = im.convert("RGBA" if im.has_transparency_data else "RGB") - - data = _webp.WebPEncode( - im.tobytes(), - im.size[0], - im.size[1], - lossless, - float(quality), - float(alpha_quality), - im.mode, - icc_profile, - method, - exact, - exif, - xmp, - ) - if data is None: - msg = "cannot write file as WebP (encoder returned None)" - raise OSError(msg) - - fp.write(data) - - -Image.register_open(WebPImageFile.format, WebPImageFile, _accept) -if SUPPORTED: - Image.register_save(WebPImageFile.format, _save) - if _webp.HAVE_WEBPANIM: - Image.register_save_all(WebPImageFile.format, _save_all) - Image.register_extension(WebPImageFile.format, ".webp") - Image.register_mime(WebPImageFile.format, "image/webp") diff --git a/.venv/Lib/site-packages/PIL/WmfImagePlugin.py b/.venv/Lib/site-packages/PIL/WmfImagePlugin.py deleted file mode 100644 index 3d5cddc..0000000 --- a/.venv/Lib/site-packages/PIL/WmfImagePlugin.py +++ /dev/null @@ -1,181 +0,0 @@ -# -# 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 annotations - -from typing import IO - -from . import Image, ImageFile -from ._binary import i16le as word -from ._binary import si16le as short -from ._binary import si32le as _long - -_handler = None - - -def register_handler(handler: ImageFile.StubHandler | None) -> None: - """ - 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(ImageFile.StubHandler): - def open(self, im: ImageFile.StubImageFile) -> None: - im._mode = "RGB" - self.bbox = im.info["wmf_bbox"] - - def load(self, im: ImageFile.StubImageFile) -> Image.Image: - 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: bytes) -> bool: - 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) -> None: - self._inch = None - - # 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 - self._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 - self.info["dpi"] = 72 - size = ( - (x1 - x0) * self.info["dpi"] // self._inch, - (y1 - y0) * self.info["dpi"] // self._inch, - ) - - self.info["wmf_bbox"] = x0, y0, x1, y1 - - # sanity check (standard metafile header) - if s[22:26] != b"\x01\x00\t\x00": - msg = "Unsupported WMF file format" - raise SyntaxError(msg) - - elif s[:4] == b"\x01\x00\x00\x00" 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) - - size = x1 - x0, y1 - y0 - - # calculate dots per inch from bbox and frame - xdpi = 2540.0 * (x1 - y0) / (frame[2] - frame[0]) - ydpi = 2540.0 * (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: - msg = "Unsupported file format" - raise SyntaxError(msg) - - self._mode = "RGB" - self._size = size - - loader = self._load() - if loader: - loader.open(self) - - def _load(self) -> ImageFile.StubHandler | None: - return _handler - - def load(self, dpi=None): - if dpi is not None and self._inch is not None: - self.info["dpi"] = dpi - x0, y0, x1, y1 = self.info["wmf_bbox"] - self._size = ( - (x1 - x0) * self.info["dpi"] // self._inch, - (y1 - y0) * self.info["dpi"] // self._inch, - ) - return super().load() - - -def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if _handler is None or not hasattr(_handler, "save"): - msg = "WMF save handler not installed" - raise OSError(msg) - _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/.venv/Lib/site-packages/PIL/XVThumbImagePlugin.py b/.venv/Lib/site-packages/PIL/XVThumbImagePlugin.py deleted file mode 100644 index c84adac..0000000 --- a/.venv/Lib/site-packages/PIL/XVThumbImagePlugin.py +++ /dev/null @@ -1,81 +0,0 @@ -# -# 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 __future__ import annotations - -from . import Image, ImageFile, ImagePalette -from ._binary import o8 - -_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: bytes) -> bool: - return prefix[:6] == _MAGIC - - -## -# Image plugin for XV thumbnail images. - - -class XVThumbImageFile(ImageFile.ImageFile): - format = "XVThumb" - format_description = "XV thumbnail image" - - def _open(self) -> None: - # check magic - assert self.fp is not None - - if not _accept(self.fp.read(6)): - msg = "not an XV thumbnail file" - raise SyntaxError(msg) - - # Skip to beginning of next line - self.fp.readline() - - # skip info comments - while True: - s = self.fp.readline() - if not s: - msg = "Unexpected EOF reading XV thumbnail file" - raise SyntaxError(msg) - if 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/.venv/Lib/site-packages/PIL/XbmImagePlugin.py b/.venv/Lib/site-packages/PIL/XbmImagePlugin.py deleted file mode 100644 index 6d11bbf..0000000 --- a/.venv/Lib/site-packages/PIL/XbmImagePlugin.py +++ /dev/null @@ -1,98 +0,0 @@ -# -# 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. -# -from __future__ import annotations - -import re -from typing import IO - -from . import Image, ImageFile - -# XBM header -xbm_head = re.compile( - rb"\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")?" - rb"[\000-\377]*_bits\[]" -) - - -def _accept(prefix: bytes) -> bool: - return prefix.lstrip()[:7] == b"#define" - - -## -# Image plugin for X11 bitmaps. - - -class XbmImageFile(ImageFile.ImageFile): - format = "XBM" - format_description = "X11 Bitmap" - - def _open(self) -> None: - assert self.fp is not None - - m = xbm_head.match(self.fp.read(512)) - - if not m: - msg = "not a XBM file" - raise SyntaxError(msg) - - 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: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: - if im.mode != "1": - msg = f"cannot write mode {im.mode} as XBM" - raise OSError(msg) - - fp.write(f"#define im_width {im.size[0]}\n".encode("ascii")) - fp.write(f"#define im_height {im.size[1]}\n".encode("ascii")) - - hotspot = im.encoderinfo.get("hotspot") - if hotspot: - fp.write(f"#define im_x_hot {hotspot[0]}\n".encode("ascii")) - fp.write(f"#define im_y_hot {hotspot[1]}\n".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/.venv/Lib/site-packages/PIL/XpmImagePlugin.py b/.venv/Lib/site-packages/PIL/XpmImagePlugin.py deleted file mode 100644 index 8d56331..0000000 --- a/.venv/Lib/site-packages/PIL/XpmImagePlugin.py +++ /dev/null @@ -1,125 +0,0 @@ -# -# 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. -# -from __future__ import annotations - -import re - -from . import Image, ImageFile, ImagePalette -from ._binary import o8 - -# XPM header -xpm_head = re.compile(b'"([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*)') - - -def _accept(prefix: bytes) -> bool: - 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) -> None: - if not _accept(self.fp.read(9)): - msg = "not an XPM file" - raise SyntaxError(msg) - - # skip forward to next string - while True: - s = self.fp.readline() - if not s: - msg = "broken XPM file" - raise SyntaxError(msg) - 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: - msg = "cannot read this XPM file" - raise ValueError(msg) - - # - # load palette description - - palette = [b"\0\0\0"] * 256 - - for _ 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 = 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[: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 - msg = "cannot read this XPM file" - raise ValueError(msg) - break - - else: - # missing colour key - msg = "cannot read this XPM file" - raise ValueError(msg) - - 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, read_bytes: int) -> bytes: - # - # load all image data in one chunk - - xsize, ysize = self.size - - s = [self.fp.readline()[1 : xsize + 1].ljust(xsize) for i in range(ysize)] - - 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/.venv/Lib/site-packages/PIL/__init__.py b/.venv/Lib/site-packages/PIL/__init__.py deleted file mode 100644 index 09546fe..0000000 --- a/.venv/Lib/site-packages/PIL/__init__.py +++ /dev/null @@ -1,86 +0,0 @@ -"""Pillow (Fork of the Python Imaging Library) - -Pillow is the friendly PIL fork by Jeffrey A. Clark and contributors. - https://github.com/python-pillow/Pillow/ - -Pillow is forked from PIL 1.1.7. - -PIL is the Python Imaging Library by Fredrik Lundh and contributors. -Copyright (c) 1999 by Secret Labs AB. - -Use PIL.__version__ for this Pillow version. - -;-) -""" - -from __future__ import annotations - -from . import _version - -# VERSION was removed in Pillow 6.0.0. -# PILLOW_VERSION was removed in Pillow 9.0.0. -# Use __version__ instead. -__version__ = _version.__version__ -del _version - - -_plugins = [ - "BlpImagePlugin", - "BmpImagePlugin", - "BufrStubImagePlugin", - "CurImagePlugin", - "DcxImagePlugin", - "DdsImagePlugin", - "EpsImagePlugin", - "FitsImagePlugin", - "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", - "QoiImagePlugin", - "SgiImagePlugin", - "SpiderImagePlugin", - "SunImagePlugin", - "TgaImagePlugin", - "TiffImagePlugin", - "WebPImagePlugin", - "WmfImagePlugin", - "XbmImagePlugin", - "XpmImagePlugin", - "XVThumbImagePlugin", -] - - -class UnidentifiedImageError(OSError): - """ - Raised in :py:meth:`PIL.Image.open` if an image cannot be opened and identified. - - If a PNG image raises this error, setting :data:`.ImageFile.LOAD_TRUNCATED_IMAGES` - to true may allow the image to be opened after all. The setting will ignore missing - data and checksum failures. - """ - - pass diff --git a/.venv/Lib/site-packages/PIL/__main__.py b/.venv/Lib/site-packages/PIL/__main__.py deleted file mode 100644 index 043156e..0000000 --- a/.venv/Lib/site-packages/PIL/__main__.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import annotations - -import sys - -from .features import pilinfo - -pilinfo(supported_formats="--report" not in sys.argv) diff --git a/.venv/Lib/site-packages/PIL/__pycache__/BdfFontFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/BdfFontFile.cpython-311.pyc deleted file mode 100644 index 1fd9b7d652c61be4501844b8fe27db33be59e1e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5215 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-311.pyc deleted file mode 100644 index f95821067be60f73a0154b963ff1d2ae52a51625..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25878 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-311.pyc deleted file mode 100644 index cff7cf67b245c12b6cf380b65af0e056814c6323..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18616 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 T=7`-4vHK5g7J3A?An5-G^11e# diff --git a/.venv/Lib/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-311.pyc deleted file mode 100644 index 2bd47921435f9158d540931aa9dbb8b2b4ddc2d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3097 zcmZt|U2hXdaPNHnik+B*Bu-M3SP7JxmXM@r3!y41p#c{#h?G`xU0E03I=$rl(Y-St zkr64PYKkHeP^3hvD&?W2AYS+h{RwB}hv+1vNL5ww=8CEhdFsqw?Dz=d^X%-*?C#ur z?fu@`+Cl)1|Gk<$6T++ifLJ36Q3Q?Tgrp!KEox%Um2?5^QY1~vxs&dk zC+UH?TlOlwO3Pg-=~McYHW>XPIZKq#U83xxo;iLZ?)}I`$W!>+kPIkqDPhnKiiEo7 zTI+lom}}dmso%LuAY41NtI?z#d?dmN@V8+{cVB(pytC5tx~}4$Cb7s%RE`N&K+fk2 zhHR*Xybe<_e(9xv647$UbMh>;{Ct>FHJY%z-^zJKqij3UU=B|krI~X!J6et=3VCXI z7&S^PZ%H`I;C6LD8XP0MLSLtX`)fdM+26WzWy zIgz@mQ>LdVQ)n)lE9vq~DnV};8Ld!KQfCVDr5w#0GzIUfsHI%$%(>HFrM?&&85v29 zjz*^oS>w9QXli6MdiH8OWuPEETT)ZkX#QI2f;yAZRf8Ta%9(jEUQb<)UpRKUlx65T z?#RnpX;#e-7jIho7@bvhgR;7*45QkK#$w_ul3E+t7hXJvzgNH@mZ!*QR=r`lXKor) zx1^auL38*V6OsFT0toauCj1X#FRtdGi1R#^imh*uxojE4NJ_kvKwn3Mq2NSvGCBDK z@`!byi2IXa&RX8IoXOCl!Fpgeh{D5w7RhFyePwWEbY*aPVma6nu>!Lsozi*Boz4{$3WKgL;Gh*iPbw5?J|>}xmbE;E zY*wd+<;v-^mIoD}(lLjz-`Kh8PUDJ&@SbcL=7J-jtp5xMvbVi!HM|yi74sQ8^%ijCJ zd%=}2E51n87cqU2num1vE=kKRn_Ya^YVTU>d)W6NvKm?PK(W+_;P2lIcHBRI@BF${ z2_C2h5193*<^mzt;1$C#AdZa2+~OIHU1W_Ifa?GSA|x0#6{udU&8F&QhhY9jf1v+P zqB7>pB6$%CFNOHo35Z~$s_Hb_6Z1mfP3PqtO{cAvGzP4sAstMozbnbwj>MBKu$*jI z9rl=3sGebJ5$`4TE^Nb1Vqv7PIq<--KBN#~SJ2M_T5S9_TlX(cZT1eBQg=-Xxxr0N zG$^=xz;$m%_8GXdC91jY0PoVn9J7AlZu{exzUB@08_S0&jBl|W&y58% zDh6mz$>H`4Q|S~+&j5mS@`g-r_?PRy-FVhr88}`YI1bazwqr}K7j0cDnV+;}&GhxX zkb*y6ymJw*k(u>(D$-C@8Zzq-58Q%#cm}RlFa*09uZpJJl=xl6_M?brEZ(j$pKbK} z$i)b=aYWqw50ToMjW~JeDyyTR0v{$cuVZ02%VFF1v0YrBuu0eeYhU*QhAtrpwQeE| znPjl}*&;7ubv42qT@2+%A z5)Rgg6Lk`ybJ1NT`_0Zn)z0_K;ZuKvDx^@pd%|MdN_qW}N^ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ContainerIO.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ContainerIO.cpython-311.pyc deleted file mode 100644 index 6b5d5250eb62b2c28ae7148d553e4f18907de102..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4556 zcmai1-A^0Y6`$*GgB_dLKt3S3n=DD(0D*k8Srk=e2~FryXcuQto5A~UI;r=mvXyNY2d+9F?sFL5TXGZ2gFGOQ=k`SDNr(y3vtV);;Mr(I-%9%N{C@DoXbM^Yizsk&?9~l|RjE>SdJ#XF-nVcCJ zrPn^2%9uEiT`Ve@6Qn{5E-aISr1SvpctZQ-YXq+@6nbGp(=v* zfl!YnD@Aq)C-_udl6T_GbZ~QIkd6-0^IzngFa;%?#5a(HFG0XVM!3y`n#J8gTqY$@ zbb~?b2VIX#*E!Zcy1{lJnSNNT`AA;V$u{_fUEl!ktoaP~^xOekd(XWqnB%~0)Ag0s z*Z3EjX}kSvc)mT5^npA4;z8Jk1H7N>D@{x;>yT4qwilEwz|Hd1^LCh_dz!F>Bu4=~ z3TF0U3V5I+6jR*-AWze9)CI#)XEOjG)XEhZ1BieQ=DI;hof19IM`YlfnZuOc(2F$3 zFA=K3LEHgc17Dj(H* zkFMX{Jhk0>rgC-ddgXdO+ExAKqZ^eQIPjaz&$oNe+5@k8`;qx)qNn=h?@w+>zgzm& z_o8$A$ia%7sF^IZ-l!=Ipf1 z84=>iwY!xVKN|O=MKp%M$vJ3)4hndduz3dJG31iei|i8?^a*!$Pm2M3)KtXpRYwO)f2tzmp8;GS2*BeiM2bA%a6(% z<6qrhyI%_(+lw!Z03LVW0E5>f_#8O<*^Ri}s8}WM)bT;&_*Xq)h@DL*Qd;X_D+SwQ zV%1yr8bpgignRLZfavs=Telw3$l5>|uk29iXO8=L+=#RQNfX1vgi6L8LGO1iOTmY1 zK>h%@Hwd(j9nvw+J^&6fsN-RVK1}(zgDqlMU7CCcznjf1L3Nme%gG`+r_{2mh!A=i zmD+2amNWw^8Y@7+{}G|@_~wUOr?&=cM~C69PE;qp|F}Zx182Uy`r_J)>Ds_$csC|D zCjTteLWdikK)9zKPd*KQ9p3ohNn||&A(2QzNJK&0U5|HF$DjClnADO3e~S&&Vgn#= zL}6OvfDrGhg!r*{A_b`XTP1v3!gT^74_kaHEP_M0GoiQlc?P2Aj(F8m_JAvU%4E}( zx}0GsecD}5gtZ~=TvAH6J6A0hOa*^{pc##KI~jBg{&U6+WLL!v@H`KDuma-pGUS8i z{b>35((D`zwcU_bxaBCL)a||}9kGg2#({7Lb|otQhQ}A~L$^e~jy{R4$J(6|>3Tf< zXnLdTtJ$^L%4{PHx{VGY-d%}sU(BRJcIn;;OWN0V6gj-*8Rufi;r$0k;XMABg|x(f z2yhKdM(j9}J-Rp!*B4?D;uv$3Yf-#)T8p~*3n-6b)vk%EoXuJt*(}sj#RBq?Z1&5d zSZIy}vsp>cWwWdom+l8*c@*6W%}q{zlAW8Jw=0uVIEYx{zF?kEy0qwUHhj2sdy z#f`rJdEoptJYIhY5+#t1h`+xfw38FW-whaOBLQLT%3qH*gf9QkzT{NEf2bj}lX%R3 zydmsEPQ?6OIN&BHBKW+Kl|*2uGk*V U_4LN6^>hE>qyK%24nOh#0M}*$+yDRo diff --git a/.venv/Lib/site-packages/PIL/__pycache__/CurImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/CurImagePlugin.cpython-311.pyc deleted file mode 100644 index 1c91377b7d040832199fc76adf07f8ffc029319c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2570 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ExifTags.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ExifTags.cpython-311.pyc deleted file mode 100644 index eee82970d09b4503e69960b82a1b3011c39f6b1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12041 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 vUWO`GF_9u?E-BjRk1qLE66DvQuFdZ@h_Lf diff --git a/.venv/Lib/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-311.pyc deleted file mode 100644 index c861dd2869d1a610a4a4d652431bf98936a36c5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6780 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 H*?#^X%5524 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/FontFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/FontFile.cpython-311.pyc deleted file mode 100644 index 21500409ae9b0e8ab91110c90e7ba0787f04539a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5187 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 E01ZF#ApigX diff --git a/.venv/Lib/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-311.pyc deleted file mode 100644 index ec991002ea7ac26a14c5342c9f5f63724b2e1afa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5516 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 GBmWzi0)*iJ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-311.pyc deleted file mode 100644 index 4f188b05a0a5d0ecbaf5ecebf1488ba8847762e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3965 zcmcf^TWlN0agRK{L`tMiGGUprMZM_Im1RqDB1;x5$abYFP#HgKlx0hh+#^Mayi@j$ zlC7Q_p>P1k5KvkWAlh{irf?kv$%j6QA_ZEYK!5s48V8g(K!AXvDD-s5^CoP&&jzgqG>LG-eT3~iJIhvuJ~JZp3H&Q9Xfq(* zIIHVGF}!USw5T-R##`&D8KhG?_9^zMvE!KmB*VYbK##^7$nV^tOFyI8BZ45x5jiOe z(hfs$2F)~;jwE=^rVkUz6c2Q!Muck7Iq|iTqSF?m8u^2xu zlOt3ss@@QQWwd2)$}YTrVdX-;^SRwqv|sy;u`sbQ{$bP8rp>PB-gAKYW6Nhh_|vuD zpZLRxzr0x-zE)(fy#Q7eqoCUMf`WO`1DJKhqacG((14ks5gURmwqg?mtO=X%qo5gE zz^69NQPq;hg=U<*bbZM=IraUk-YCgPGu}902@P9~4Tu6?7ZUW4^^kDG2^4nU$a`q-te!z%Q7qY>Qc}6qO@X5rCtl4$j;Td4N*0iT<7|LM+)(+jkaK%8< zNnJwE$y;lL7F1AIoacol?qE&m*KvK6<#TxRp;)=w@;y&Ze$e;0ukg;JGf&Qx+^1Cc zsjR(hcjr01etF7VPxkT_cRU{}aa}6cRdjT1aYu4^EwP?jO%(Im?}1+CCO-2Nxe4fpmD;v* zxyXaj>}dJ;Ya4^5(|1eVLu&U>_R7jsE?IJTw>kIP$@RX~ zzWmQhT))coZ%CVl4N2u*&sw%Y-^$&=Q*LVqmbbERZMSvM$@Y32a$ ztkYBm6qP1L!s#R?Yfcw2FFNd+W-In diff --git a/.venv/Lib/site-packages/PIL/__pycache__/GdImageFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/GdImageFile.cpython-311.pyc deleted file mode 100644 index 024d77d09df5a420be08b5f46e2616c1734f05ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3764 zcmb7G|8En?6`%cL$95biHc1F@a6>qHSOi0YO0N;u%144pnlkJCsqvwc)Z& z@uKd`B&p}oZ`<2W^jFHc|lNpcoX%;2f%Sv)pAGm)Aa z7u|R)Ih({2Q?ujOE?r4ZrN;Tnz%OD^da-2CA~hXw2e)J660;U`(%NXwG8d?+Q!@u% zGYKZNXu(pLn5`K?MXAh6mQ8JJnZ{Bgw9U^aF1ek;-D08*pYp`?Hk=QND{gRSqi$HR zS2cq=4t4vln_$^=^t?_zZ;Uf$F_8A@!x!eLV9t*SCNkr&Y4*{QL+z`YGoSOK!lSbH zl3or1^B7T-mLN=JBBd1~r&Xe)eI!8q_tmtYbU^3?-OfGU*G}>{;?W}(hf7Aepqt{{ z`Kf`g;Z&?*iBa43+yt=%KAnQFgXn=sb9ST7bFvpicDYotm;*9%OFYc5?SM};MqY~q zVfKv}@Zt#~PpA|oyp;{%C990*wFR(lVK`8*A=LBWELy~i%{?2uiJ`Y_h!YjccsT!m z0hthTuACZM?tk4OI==u1y{Gt*V4ER*K=(YIR%FmR8hmw$)e$EbpCwMWpZ{3CQv z+S~JFujI}=B0Yuv=R0F7lGDN^KBe;7D3KQ=7A4Ax>~PzyR+0DXxF->{g0gCRe7{EG zdkSIoycJpqy*BFKKbn_8)6R-266rY9R*P1Yio#^#GbIvOQJt=x0a!N)R@7za*spEH zSMib1Z84FBDn9Vf&OS)zMd){;yIO7q+dK*HY9xNHx2?bR)y4aMCGW0nzg^ga$OBv- ziI8rv3)#SHZ_`G4@@fH2FdJ^qBnYlpbV~06&&Fl_U*966e+y*!2;3N~;RVgm3BOh& ziMu$_LP=Me+~&UC=Et$ka{v>ceBav$&fN_I3Ym6EV*pM|uKKf&QrC0@vt5O0i*Z>@ z7bLE*SX-X)Gl_S(a=zrM3=q{-09oA5nI%BLy8>-oUly(hg_jLE0mjddxT~q`f zFc7z+)Iuy(%uyWx?YQ4nZEECQ$##{ZU2sDVE7NSwGA!mscloT9&)d{-{f=%Dde`QA z<6wjFt9zG5GuLg(>CML&h7z* zL}>}O%~RHLbZ@ul8isY+C&2ToXsi3c`eLnn(0jJRJ?p7oPd=Qi_SVD4Hp9o(q%S)o zYj+-8Siev`R_lBpo<{8K+NBqH}x$ z(ZpsnvF2}dMmH`!ytsC;aVoJkwmz|8*25>iJa}UB;QNhmY$Lg$)efJo_n&^I)%(wW ze!O-eRUb)xalAhA<1Y&Jk?Xbo>zlowe5J?(p|24TSV6cMM$!I8Pk*)dcZcddgN>eO zt@mWT=j1b~-V=Y8s`s34^c-mheO-~J($U97f@|=53BE#85QN?EW<5aS9d00-HMJtm zX5CPhhZrC*@ZoIsPFXWrBOTc+v2xJu_lg!b=Do9o+Bv3|c#>vkK;NGcOK{yooNx#c zX9Ta82!Rs@NB5qPGxFH&^RQj2(gZtHb;AEw12+ z>7UQ>^!p1}6&FT?VP4r`euzUD>O;*Gg&(gDc>g@4d8q34 zigAyP;%RZ9n!yt?g#U;v!-5Z3b|G4o-pv4Xh$LJeO56l(qzh>v&EURip-`Tzi71^RjJvM&RBkp74x$b8}YNAfon#f|()eU{38D%Prc%ga>bg%%BxGI8+eZV_T0dXa2 z^AqLU6S3{89FEwB&^HTzI|pPHHG5GYyk_6~boJ9lWMEBs5gDi+cwnttwZPG)s``ds zbRVvcJos$=vs&QTH!nK-n@IKz?~+F3EEjt3$xJ;G-;Bhc-Kho6eFLrOgL&|_d%@0c zBd5@_P%^0eC6-i`zp6f9r{a=uLEP`H{ChCZTmJVsC+<7HH}M!7ffv8(`7#fsY?kp* z2H0OJLGjM`E?vY#W)q2p`@`+X&grJcmKe|B>?kKZ1GD4aU`v)KVb7D?FYLRV?4ZG` zz(qJ20GA)IOEAFim+b;+Dv~5M2SbwDM4a>^=|l|;?tQjUUv2-hg+8pk{b``%wf)b3 m>H#bJo~Hk_1km#)*@$n(PJYD)zTO?pNHGac?!OVS_kRPn;@oQh diff --git a/.venv/Lib/site-packages/PIL/__pycache__/GifImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/GifImagePlugin.cpython-311.pyc deleted file mode 100644 index 6cc613386406759c43c78a076c5bf47c5f74a6a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45090 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 MI^~BSq3incUylaD(f|Me diff --git a/.venv/Lib/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-311.pyc deleted file mode 100644 index d4a9738a48700b7bc4e38c873ba4fa7114d8bd2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2697 zcma)8-A@}w5Z^nWZNM086U;}I_5v-z4G=q0RFaTLB%}^eN}`gql52E2dtu6;-@Z(Ml~(ojrrik&kxoJonp~ z+1=Th*;#+*bk-nfy}vJw{bWVxH`3W{ObJk1mjEmy0ST0hqEv{Y2&QE^M8nr2TcS*e z0Uje*Woy(HvQdaeK_u92A;JEbM(8R0N-bm;=walm+8|vYr8{^h(b> z8o$EJqNa%-O0t+dOelMuR|Hwa>{tx5!NHHN99G$QNr|wcyw;;zJ`SGM>9P2B_2A{t zMrSoq9no!A)Dl?HnW2~>M#{SagR0?YL5SM=1-RfV>K4+-Ms}J&KZf4ZGG_oi2FcT1 zF`A=ORIV&7vjLd(h`+y}TgnOoGYP9Agx!L5&Z0pCcU#J0Uh#A4&GwA^J;(e%8|JJj zt4dQy`Bk&;u7=RWPPQP3d&+8#I;Jvy%~8<>xyc)XebN{WyQuolT{tWAX!U!rtAbP3 z9ErzE?ImAU@AakGX0wHJHk17}vs9=qN1+DnZ>%i*iYPSgk=g`DC6?wnHM3sr>-3T^ z-9BCCn{-ojis^$fnSX@3Ty4dc3QFzE)fD2&J{J(2s`{bG-c%(?*FaML7=UFoj#6mk zz?>=FQj~df0!qTDMLN?6(@`5Fg|Q8YkJjlPzfMUiIa@5d{pGon;cKdh)v$;KG0H|0 zDnA+?5@)oC97_n{f!JgsDk_>79@Y|ql!%50E}Z=|eD#>$?+*t8>~L&Mo93|?_6OMD zwZX7P1l)K+3Qvj3RQQrK8dfDu?2hx1Nq$^Z!&e3`9o<(ldg8O&HGQ(AYLQqpekR$q zU(RuoB554g(_cq>GLQ0}KA*8Hw@$jaSZD;7IiC>$jEiwB8!S{)e>=8 z)Gbjyu3IEU)2(V;mNdQQ6JAb;#u!Wrh0aXGBt^IH6k4BMXH-!h!=y0a!$iRnRmU-; z64EJEr>0agiY+yKfUv7}U7c)xT@Vg}o_ZdfIFE{k!yk#O=N?QvoB%%;Jb^V&AZ=fF zIKMh|=hW@fnbX;ZY+JTr&2cdI&d&~i-r+BLj-<~$_Z-Yd3ZAw#Pg}mW?STsg=v;C_r{TaRqMY8Mt8u~lmkqf*nVD=&uD?*B%EyeP#_g=KTmF>^+D+BkN zSDGK4&D~gaKhz#vczB`E()9y=cIa9EkMBO2`F^I*@+1>+;OqnVh}Q z)VbEwnPxJzX?QTnh;6qK;nF48#i|+}F%y~cl6@JD{{(zX4REiULEDtmP$oUixgt9*vp zLq4XITjU^NQo?W@5Ln;9-2~f7N-2C)OJ!LM*~@_$ZmA zix5AMC&*aGuo;sJ#~{rB)F6=g@>662c_y%4*DxR4WLmAhO=Kp$l=Xc`l2?<`8f1E3 z6|r$F0e?ZjMr>3~;&R=l&Bi5V95bY2=SC%khqFyiPsyy~1d&J@rfygDmG*fC6Au!< zt2010Efhs8I;x&Go+4_@o8NWRlsCVdwl)ej^D_B^@cw*-z_9FJPWNce diff --git a/.venv/Lib/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-311.pyc deleted file mode 100644 index ac66d839a9332feebdd887e0dda207c318db3bf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3089 zcmZt|Yi|=raPNG6#ZF8@5+`8DHEB!TmOvmaDD)vHC0H#6HGQbATkGOmrx(sXckj$2 zG9pD(O;IEQij+uIrKoBth%fwv{)BVo579|Tk*ccVn=7h*$fwTi#g30KKF`k1%o87MIj>yNQ=5y^ksZN`&3DnivEnh z7{~-*?pK29pxSX$%7oNCY8Q-QkxUXbc9W>PXkeC~hF#RI+jmw6p4CpqE#~NyRhd5PvgN9rHcHe9 zFltp;$&qlD$L*ScG&n|hioRMQRic3N!5nce*C7L>N~Wdgx~!DTx|Ziw9W=`{uNAbs zJo!=Tl&qmq@|GQ=9emY9Sz$`C$()dz<`~nnG;fV^o%9323FWrdB?T4&157kW-n{kR zMD`PtGBZn=N{e!_Vk*vxmpz$xl*Q3kA8Eik7`ZOP8`AYSUR$v*^LHlD`PXo7oGg4-ZW;Z5mz2 z9eF{o%xI<2@>ORSqcfUmQPwn-;jQ+fu^2e>q|rro#ploB?8lns z9ckJybdS$55V_Ca1Ok1I0soyih^slM;zb@xMg(NOHooNY;ePz-ClctIi0~SoKu!^c ziSz)1i1nb1JCk9+I>DTh&(pHSaI;|)BAO@bk?y78rLm>q#fjDU9}(G(99{eL{>fiH zfAqr7U)j=8)(vWT__tsy#)YRZ18ap)k`Yvr5mh1MgTJJPR0%T6uZGnCi~%(W#&$T} z9`9o8Iue@AFzi?akjF##9^6A8!8@RbW`W_t8ot#IxCfkvE$%hJ+A1l?@~lSR?*LV} z2fIFO?d+YI-Kuy^w8GoVs-jophTu7)?d-NS&zynftV(i$riLoP3@?#Gm8@Yt?0{$9 z(^vJec-6PoX503XD)CwgCz2`t$LPWB=VEEYk`*_P3wSBQnWV_0h$FZ-u~2p-i|RU$ z97keQQJu)t)sm%Ld7m+ZIg&}~MaQ2j8Y+ds)aG!|4bYQ}GA$(~RM87gz$g?W2>cc6U$T}j zuT<|=*G}HKzI?qFJ5Y}uXb>?xvfeYY@ZRH|eXIFe&v3nG*p3cwgrbYV+tFLmrB7?2 zL_L(SLy1O!^bambiyiBIeAwvjTiJ7W&z;0_Vj%!|(jY>3|9Z6N_6N5Z~fLgch8?$9~`o!{)QCugPXi)Snv;k z>zRLM@Iw2g6T%S2x7duB7K7f$`T6#gZxxnRSnIup zZ~Lq^&Grj|@&HwDySwv(;PaFipEuQR2<_|F+V+KGx1dU@0u&OEZGV}#DVp@9A!U?H zbZ&@uSR|XhREBQ@S#z5*Rg)6KFBbd^Fcr&UPVoE`&q_7{Y>|p$-%fDWE)L$DqULQIR)Ag=H3%tRddp3&ci8)|0p`9L1PoO|5E}hN7_rH4`?Ep% zZ11x{_S?^UHX^b4P$Li&;tk?O2|*Z#H1eQOzW}MV6Rn2p1Bd=W!N1$mBa-l9gLqLd z5qjtSb+X&;eW~92x;^^t@9`Q*)k(@GsdciuO?IEw$atNM+hlx$44`1Z9(=VvIQHmR Ojhv{H6L$0Aq47T*V6L73 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-311.pyc deleted file mode 100644 index 51cbbac1fba0762d5886a96161e43a221ad5ceaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3060 zcmZuz-ESL35Z^nWzn!@GbQ9e4mYz zBSHltRFz1pNQs1y@gb?bRQF+P}Gway#HC^A$&d$#6&dvO0 z*1z`kg$T4W|Ew1ienS4jL8p1!jP!IDm<>V+l?+mnvXX?nY{(@~)&snUDuz<>X1yg} z)(2y+=BMK{^sSN&&=+Vw^g)@NCp7vkp@*1nNt}p#-}eym5Z-pnhH0F}KszE6=3VOR z$XR%)f1hVT_bQ19?dZNnk9Op~3@50vsyC_k%Dz4Ih_6NkxLpgo%iG(w<<4u>eMdk!WH>(>g1OUvDm-8VNTDojnnqjC~wQA@EVbzpbWd*&c z7u30#+0&|yMyY#tq(WlV*{a61Qb%}J?U++pSYib$C3G?mBqxyHTbGo001PnE9Ci2h zxwE;;CgWy~amq?+sb*>mxeU8u6^u%a=4L8aYb92;SPs6G>a|jCX72sZa-W=>o}SK~ zIHAs0iq>_Fv)uFv_59^@&cccOVolFoW94hPkMxC{satHSsuiw+@n-H)`lI7>w0Ig_ zCmeans4eQ{RQ0BFh_glAv>5N0$}zITXe@$fg|zy~q1ehC{+@z>IKC=pMg4~3UASp6 z(@_>G6~pCo1f%fz1Tg4x1pRmN7_JtL%2x%PAP%0)6X6&nKY+jcLgS$a024k4g0{Oj z!qV~QwL*baEq)kA37i}SvO>1Q18a%36Kjb(XYH}6Kf_bDGQ|gAssL}d?V(qC`Z9<% z2qRgElB`UntOs6&2B-o#SGy?vEkN z_}xn&Xt%9iOm>9iK5!4aqpu`uuUMeSwHiHopi${Q?E0{~vwLI?Q28s_3hpnf%WjQZ zlIx6~vwPM&a|RZwI?4Mw8dQN1l)QGUlP!$nf%eRIdg>k?t9!P3Y};Q_CvGd@L^3bl zq&LGc=F8Dc#Zt90rl(rOph&YxnWO!JK;YzJ)ln>F7y>Ph!kI>$@chlPrQP^|^9pwq zld-FgH(#ny2A!!dV`o%APpMQ{IjNwEQFMHjV$o!l<0+Yojt>8%H~f%0IUNe>#>daz4+aU^@&yA-_g-EYyJ90{a$_Ry}Mtpf8B^4YetW? zh#Z{U9-Le~_jvHgW}z{dXbvXqNMa`tx#Ryaayzp2X(JGC2I6)g-tv*ru~p?xXnRC- zI|CydsMvmB>r{#f3p&>GcV?bPpMr;X0 zV@=o~7SK+E1d%cvO9UkAG3a`dmA?ez=lTQv_ZBK6W>(1KXlykq&dxvtyIIxY(VnCq zs%XBfl~_LSgz^}$nt^;IpZ~I^8GAFnVuhD9%NcC_}fx7|0iGP^x?)K*4YO4JK(a+8GQJq)gUK53tUJ3F#o+6{}En-Y{` zQQQrtFMck{=NC=@A&g(K8#XNtH=2+adQ%>uEyAz~j5`e9j95LIy#a#q099}Q-WCPH z<0>&8cdFfzde?9D>4wK}OwP)J~I|361NMWK{K%4pZv@=;6#71_=Wsltt~>g}tR z(WJuhzX)FLre;~(@n4)5S;^0U7-mmGC;Y@uBbNknAmwm-j!=3RXJ>!_ocvMSAN%?G zFE<{IHjbWY9z6rY?f&Ddp2z(oYlR<-JBA$?f2>5lzi{gU+!_m;uQZg&rZQ=F9uc@@ zPwL9)WhHfm7Qq;-Xd*Lu@TrLFi4WnFKrP;v$w1riH&BXE=BJQ|Pk0l#eS8lfl8ZI? z&jLv1=xE1h-K^^6MXun0aICN#lSH^m+{x`)*5|s9+7L!JIDOrV9IFwZcFWLR&QMnc z{%WwYiGRVK$%);-+wBZ{ho6HTumG50pin9#sWnQZNt+~kpB*w{yPq90VL$KL2}f4~ zEuUYCwTPRce z?bN$}#2O^sBx#$Zx5-e?+;6NwPBqCXo1EGqV>mHpkH6L&Kl$kL@3W6CHponq%-Eer GVB~+0cBkF| diff --git a/.venv/Lib/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-311.pyc deleted file mode 100644 index e1155a766e172f28d251195d81cb15e37e28df92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18707 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-311.pyc deleted file mode 100644 index 208d84461f51a708a778d7118dbed4a9418334e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15407 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 MOdTjxK4d%nUzHxgLI3~& diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImImagePlugin.cpython-311.pyc deleted file mode 100644 index ffc1725faa715d137941d25cec4104f6b592cfc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13307 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 d64SNGIFas**QBc2*DoZQ-W1a-L{s&8{ri%ao diff --git a/.venv/Lib/site-packages/PIL/__pycache__/Image.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/Image.cpython-311.pyc deleted file mode 100644 index c23fdaaf5c38e349e622f5b6f33913b307437161..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179967 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

e)hMSR43OLn2sM z8l=?v*nVVS5h}JRVU)_)|9TM&j}(m~IBxS4_dj<`WSbIlwW%>6FsbXVRi_F$$ zEM)jekG6|vp?1jDI5`XkNsxT7-RdWTBuNy+G7iy$iom^}pZOvW`_~7_Jk13B`sFXN z?)Yy$!Php|-+UQ=hKfnf`fKnShTKK0!{5-xrp0kGOKHRQg@gE+{M5ce3^~w>CxG%h zK`bYH3^?EiiW&M#N*Fk}(lOuor9k@2QK7igjI5JEf{ zi!<%+ABm*h2#?jqQJ?llG&tl4${<6)VqjNL>bJI^syTo|Te)xq{hz5UE9Oa_)BcLS zF3^D*n08*#JoLAa=Cy#(6r)a+rCnFArd`*rSx+SG8oq-6XV~M~v{PAsMF2p)7<4I0 z^De!U#@hpV4x0I1r=zSoo_Dh-ng{f%vYLkuudh7b#(w}j6?fhki;fxSmlQIeEJe2C z%D9`fs&x8|TW@?Yq_=dZYPRb&+mof+=~rK}q!I7LWgMW6uD>_>!>`YE9!Pc`FfN&2 zvwn8>?{A;k{`P*oa#gZ&)sOb;JD&f!+f`dmZt~^uJ1;ALxR&D^Cp}STwDW-<_JfA` zy5$1?yeWEM-d`5oHD3)4@6Cbu3yHFKUW|P;+V^=`)pP?q`^%d3G76H6=6xP0d%JnM zHNNTQy6JU^4RGey11$@=P9lX4o$s378sEz>q2*19-KoGTJ+NxA@~{b%7e@0Rmb-jg z(P;DFbp+eu*XD~VVm(u@Mi0d66Fqm9;?6VGv(As}W(sG&{HYUYpsl+&b)vIG|s*-Tb-;$bKOPo^2gyOyxU@(^EJWPwM1E>CviDd z)1lXN7^h3iDT)Iv3QPwOv|;}m3oKy3>)zWK*WTH3XG^MVg;ZG`bRaN z)F8G(Z`qbA+ZNsZ^d$jO*4&=hHlxkIz{y3}Wx5DAV~IVgKQ^iz(Ktryc{p)H)w2J{YaEw@yg(ez9I=sL;uS^+Q>r(aURzzz8t1rRc~FIVNn|GvVM9}>&Nq9Ss>3260v2|&vPYu8e>jQKeX8(zkYs2(L32jg{Cx;jJa<+qmv z<=DJv*+5p=;AoFoD{!56E1z4e&(_$1rh-lS2>->4kbYSQ1C26z2ufvOJCRUhd)xViDbv&T8V74k0`fRgVK66BIKcbn$^ck;gn)ywK!~)LK zs-LzMVc#+6PNC5$3jKzv(K&`pr6kyz+M6Jm%Y;*y(8ECD85j;-7!dL>d8vWr240Nf zki~8xK$J1kSsDc(_>yJ=70cw0KxWZKF0fc+Rx1T817T%k7#3#AwGfF6AvcGj$a!wy z+7(268<|E$S_JsO;U1i(Sh!g-s4hpp5}qzHh-#NOuZLx_L$gS3q zlxAnC4@CDAg@*C0DEpNLF<-0bXPE#H0N7jSJkP9y-dp zSa~q!*4CUFb6;6=s;xy^h6}W9RFmf-=64zaqd-igPx*rp{_Bohiy%SiXc$AD&Odc& za1itNFX*zZbf8u+u4~$TapYp!KQP=+NaRDqgCpr8;|uyTICNV3W0XgOp%orQqtbZ* z%R*H@p;{R6?;lZBqxAKk(BU&Wv{2LXSfi(DbRvR7I)C6Q9C;(!8q!>NPhEmbA*Qr; z5MMP`T#>7b)=u@Uqzd4l4i{bYPuT-p@JfWg>--)0+CwyH>V3Y&-*}lF{i~HsC`W2Dej;P|A-VL z>#)&7F#;x`aYfWSUtSX}Sn!v}Hc;+4cpUnw76@zne$A@6npJ<``q($y^kLD*MX8$2 zdd+6IFILx6hL8E8lD9WbcZ*DP4_$6JHCEM5e_5|;iMe7f#McAP+*wp*9RQX9FmyN0 zA(s9@3G^^7-;Ve8C3er`ryADj4FuEe+wuK<_jdnqU#hED@9O0fpJ%q^lU4Bj(-Aex z`k3gmq(#VrX0NDY7rnDHD^nHg^@{cA=90#!NB7pwcdVzs^`Co7CZTqS`ji_0Pobt$ zuj!nH-(c7Mn(nz8++~Mevm+WjvG5BcTMg307|2kcrOG>C;O)QqJ8uJ3aC7M>lc=+Nc8>Q!S5dY&f&X< z^(7mlz*+x%$?`=0?*+aa_)hWNVtvWF=)ni{@aO$dNBMj!7wQ}Cta`uW-Hw@BfdP@M z-axrns@@vAF&1w%aj_^34UQ^h!)&1iwP8@$ySJb!4 z@sm}B`}}}$uiBUI{%L+5KL3x;6g^ku_=}>ZgEj8ISYLTC&-IrcCqDmWUg5#=yuU1Q z(dRNJeJ;<#XJ}S6tan@X8sf(B-}ws?+Jr}n5qw$($;f5XIb^^{eiMEt;G;dE^&ls5 zFM#3coZKD_&YA8ics?+}5@nd^5A&VGQV|y<>o_%Vjk3qnKBhpYn->a)E7PhP0(%Pf za#&t`^5otleM}4C$R#(pj^N9L!yB^So|tmMM{%XHj`KsOG-9bjmyoL!EGQ+0L&8_H zYdnlW;EBr%&}%l%EfR^toSjk}TRws=U`oUm*&P}k)l?irk%+AWl$ypZLf&ZDpv*Cq zx3uiS7Pl>~P;O*0fmBm>u#X>vxDerI1Zq!yf)HXs;y`-32op1L z6&MnLMW~NUHV|9^`wQYJnvYJ|@-b%|W7QC&7*>+`C_A3G6-1jzC$g=SFuF&fu%bTf9EL@n-vUdor;6 zVV)yU9qndAM>-GiQ|ImL!h;%kU67kVhA%JV^XJ@u$_pHx^j|h1}-!va7R#)fn#Wv6C${fXux3c*|oro7dkaS zsbOHFS0)_shJq7b`xmp~XsSGdQERI()^^aC~Lb8%%kFx;Kaq;?0ZnQJL_w+)tsD0{6Ke zY^QvY8zC>)e}fO$$Q%jzllmb`DW#-Yv&;x#6Cr|?4KQ|5g%Bi&Ai|T0vs>}`h&|P+f`A{A z5%#p+4DSYsQz%;03cb@>a$O%7wiY!({3B#hHVIoU@fpJdphcWSl9-@?pxs-UlUuzi8Wsp^Vhhoe2&c-a?*_5$Uodzyus zQ0g%2f+I(UB@lY|R%o9wZsrTx=Oq&^3Nl4tsS98~Zrc)f+n46J3$_#YgzF8LVmnzR zrUoQIdO$A%!;{fE`@NV0hmdWN0U3j0tWi_>!mOSNRc<^mb48f}@4Tk1MPqChM&WMo z(BKu#OF>%%_2>xhVK7jv2GERwt8yv_kr|0M6J%bHmthTac850FXU)1u520Sx)YHTl zid+|FDdW-}HD!acw9Nj3i==#Z5!&aJsqf?qF93f~)0S$Lf#E?Uhg> zz?z!(ZF=NvIt(wKbr@!$-FX)iL;Jt!>s?xdq|>qDN43Aj*ES$k=VVg)7^p)CvB&e<)=>Yd{K1Z98{Ek_ySYEpHbdR=F#WP@I^A?e)^ zsX;?OTGdnG_;CeGu1l+XHoAYjF%R;qZJ)-_2vR_sA{qN>9~=9nd<^F7CH|xT5>m2& zpa^+O$Sn*@@ig$O`}S$y&xonaNyTnlo)gzzIBs}fR2YfHsXqa z62)lgCLcWe{WD7EKfZKkz$M{hy@~%}T>k#Z8 zwhV*u2`bl{beT3IxUO?vc~D>W9wtFVQSJ~`5K1LRWw3kLLmKV}iU~nOgExaXrHx$F zhVb2Ls%#I(Mxr?v;cY&kv1J5iOETb&ntLKQc`al-lCg1PdF^8$SHfCoaP*`p-iz+S zP;d!?6E&TrUTm7ko@F5dwFWt*6aa34!E;-*P4#9bc^gUq zHZQ4T$TFryj8k+wM&{{{>Y6l4l9e-TR zgDo2xL}T6x6dT1s+~$hd|<`A7~7n=>FESnhtAE{kZU`|yX(wENt^HKCu% z6QJE3q(Q+Q+TYNDf;ie->3kuoY0FTlO#vL>_{0-}&l>C9&*}z?kKBO>L_~e<>M*%7 zqvQ!dNDPfw5ie>jACP239;DYDfV6pU<9nlb#%5Yl%RBYuo!{^JWZS)$QX6~qjlG|( zNG>^?S^^{W;pFo#q-u`pHAj=BM_G)r38-?$k>l*!F8d>xbYdR3=-E=ts(l!Zke?5o z+P}ikwz<>J;dH*}Du@0EyVdpUY`1#k-Els2;Z!)ZYwSzE?l71&{2>hi$=|=a?)cHh zdzU|Re%ABnc|Uj~wf(TZ{qS`o&&N_cjNBdFWps2L%gS(ThpKD1QZ@cgVo@O4X|axT zz*Q6O0BhX}{Lz}}Kv7S&UTZ6H`tRT2KcWsdiw@6r-gEx(=Go0Np_$N+BA;<Ot+x z&-ea#SL&Ig`ZGt3-oqpzW0R15GiYlfKOJNcVSLJg@Cjln*@6)v@h|wLFMY{)Xz8k) z6LZY4*gow&wbj%3{0PC3VsBE0_iOw0% z$Nsq$82)iPJOcTuN8YjM9Chb9UYXqc{r^7CqL5^FPbX{LqtfP_efI0@$G`vm zKl7pEQ9znR1^E#xBwzvsk?u%KcpopCgMxfP@>%Fz8B?Auq~TtJfneGoXY}( zy?cO1b1nlIk0`zd>4!0mEysZmiR)pZXT1u8*>3OH} zYW++ov3$L}e0`$0MJ{d$XWzE_+z>6fYfxeF`60!_=E{=g&GGW)M0tx`-V#2T^p(eb zRmt4KNM^F6CcJkczwpia*XtqE^u{o(gIO#k>TCFBkhnE z{3LKxaasRV+u-?UkbteT*m0;HFj-l_U^_ zF1|t_aD}Y*XLfxlP6L@-Cl4twaS!P7u0~)=U!$?@sk@Dd>}4C#$UE4VurPGFeyIdn z5!&W&{3^)#gLF0SxMnw#n!wD|tU!P}0%xx&B^IH?w8SejX^d@a*vPuqWFD-xI87Q( zPV@J?Vja;8cB4+in4y)KW^DwJ>wA}b~Kc@W0U0qskXtxf)R25_WfBbv^qhXd_%#W#sC-@6yM`nKr_j8` zXa(tnJ3-+hauRFqv(W?40VqP{?TREI3XvIY5*OBr!Fhxd>J{n29-;<_YO8+av`mZW zMT)pJ(*cR<)qk#cfQ0KoJN!&`*acTu(4w>kurP;04OFS5=t05C*4kz?YoT>^i`8R7(PHu6bh+X!3V)|ZwTVov`z#jqv={=@x=;c60=DwQvsD!oT~W3MJsT3M1`&< z;Fg+OA(VqEdso^y)}A6qvj`^MgDU+0OKU+|FJmC@;>qH(SPQyu@;N~o76>-13+!nI zCY{*N?iYk8V3VX93AsqKJJN0sOG2y<2(zHzWC?lF{*lI@!QBOT5Xe0`2u_v3WrQ-D z`H(O)K>AkNgrqp|BN3@dJf>Q$F?P5%@o7I{RAqETH!Y;4)ajd_);NBuWl)>2aYBkT z(mw;KJvioPRUg151wPQa6eiUjbVANgwU*AdL)nJP_mO|DAnm>*w4SH}A;(gVqJ+2B zGP)xlt-=J$K`O)F#f5YU!zuv!XQ1(P0B=m^bCOGxLKN^xoj-w$v#V4fCYrkF{FW-#cjmr1y zV52&byHn2H`QyA&Hn&|k6PP)7BXHw-ceA@#{q-?yhpT4YZP>1iCaCjBM1{HtdDt77dll{bn%u*dzY68;0S|3KV(;6rFRZHR78c&cPi z6=@eWEG%33#cgkIODtP0FI#W7amqgoRb&2c-IlCcj zOY#vsL$SGPzv?CP?>JzW-72Y{EvZkGG{_|l;q5qe=NC@bz1jGBVRY}k5Y1J zXL}{rH#nEol*@-WYshJe%SD_sr8n{r2P@yEbot{x^|T7x5#pQuWJQ9%J^;66`9{m2 zO5ga|XjX2THvxVF{UUwz#!czCFHL1~jGND|qFhl%7HT%k0c8}_nis!OYc{^gHI|^% zY#rHucZlj`!mK3f?1*LaR+2$bFO4iUriJY zX2Lln#pFU-wjh*u!D1>$g9D*_xUAGlMT@lF2>DaqXgv}Nz9`mZRzd3np?+q=ru7bW$^gVqI9;?8qFwFf)VqY z`bXC0-`ah-MdlY;N!B}1$A^K#*9!G4((4=qD%Rfe7;!0(r7Uq8vPw%t& z`;l%^$<@@{@8HhJfs}qiSVfIEg`02~ox8YI^YC*Pt3dPc<0KD1YH%MOe$=F#i8nv# zyVS1lQ}6={{)~eEK*9e(!4E0;a|FQSI;in`DcDEBehLW55*XTHx;sL_Q3}{6j_wKP zF^YSMa4(iuW>yO85fDaIS0uP7%&)mXiPE8J|BaeLM)airOi6xB!2$(;g8(M5X8(y@H2qbS7Z<#A;!0e2-g6WcN8U)ShvJty{fJT8x`M~*v zZ{(?6k)z}T>Q6~^WwR$~M#x4rSCTu?R38p|+BAGN{$p>29oxcy@LLbm^n^D=bK zvuonnH9(2r%6>bPinm8?$^1Y>daWjUqt_psO z7j6%$1vboPH^j3WOtmR5r(c@Qu8L<@q3!vFkrR>UA}6Mc$)+5bX;EvWXS(FB4+TXR z;UXqtOXiXN#v)3q+$`kg!*fieZMqH79W?grq2OXf^1`R*m%&T|KHs9$auTl~#t4Wjg*7?A4IZz$1-LBoBkfMB`nf_%z zaodZ^aJS;2*rxdMZQ}P4A|C?2n*on9MQzsWd*X!;iyxxw>N-v1-zbewBUDAsi;(Ff z0tP>!0M3hYe^%#3uIyK{E@fTxPI<%L6gNM)Q?1cbAn^EUzJ^@hDd#O$$*ij+x+*$) z`5f#K2CkpG8A!Nx$*x^-^(Vj%+2=ILn2?AA)|2(l1>AfZUAY*R|KbbV5Z1c5mSAJu zONGVS{qIn;c7|qp7b(6ftc2RWf&R0kFQQnf#Q}WtI!GLn&KG2l;6$-bCu%Auew849 zNa&5FkdvwK#$Ee64tMR}xvR75k&fMa;O10oz#@{op1$+Y;jZn6Iy(;?FgY~Un%wxv zq0Y9>on4#P-LpI;Wz!}kHITa&71g})-eq+@(suCZVVH4&46T&5Fi!CpNcuYsE+KVl zg&+|V`-3|BEUC$<{hi*;tqRPc>B1WgtEBNp^C6~#ssu{gi)ja@m!@+)b?pU$@#`^# z0OQTNE=k?ZhdA-hY)F(e%O%YT-+I}%KJHr2lYGtvl~-uM_L$YU{}s;kvD4Ztdj$04 zp)+Jz0HO;pKqZ(^L|y_DqCdSZmin2k!FJ_?iH~9`K-aQgG&C?^18X-uBk*8HHL8R3 zFra~HkhUX2-Hc5+UN;Ps*QAtW8mPwEl16yzD%m8LY)bex%f8KV*JeQhFoF=&A^_1T z+>lgX$Tna(W1X-9Tej*zWjK$t=|(inmw3`VeXCGUoPxd2>3u;=X zI){_dU&y>UIl+;UPs)z~c_pRT!IOf2LD($Wor0J?oRd1(ijlMv-!$iYZltS!xJ!E} zeI4I7=NcJ$jz{&Yib(@Xo5rNU9_suYuC`Il@|)D}yLf>txXR<^--54D_Q4W~&Alp_ z-$c7^d9+86f#P1+87{o#TQTcf5wjZ#{hN99i6o>oI5ub3eUj%U!X{YYm zg}~U?(r$|7{&l0Xu!K;A)PYDLd8U#R_aR0DJ8HVCKVz>3XMMp~AmOV<_s3n;+^b(z z1fWR3Nfn0jW74bfZ&SQo&_Ih2FT|xRbock1<={bR|E{NJECa=e6W_JaBOTa97NwvM zDWZ*DvD{Sym60itqOC+Jq$B2BkKj>l7TrT!kUzAW1Hzvv|mrbzM6c*Gd| z7X7hFR_vi%Jnmg|PZg+rn}rDVzS?mAAl+M~H$?frLFMxoa0{Nn%daXe;3;I6`Vb|Z zq<~YLqU=fv0?p{VA$oaMOYt1VxeU*6oUc41#fUt>xv z+3+w-6J_AIhCIB&Bwz*S03|cl%gdsKV)gc?^aPicW9U6z#cL=J4^X3)n_I;^B)&`c zrFKEbU{?fsJM0o+HmQ)KTUtefT}eR|f;neb7wnC8b#Wif`MSE8QY9oJ5SxL1pIh0* z+7K|7*E0ZtBbX@cJKF_izh0?pU!rQ1t)xisu+=&p$FNS#`c$r|X92w@UYlq5QgNQCT4gmg)S zBnZM`4Sjhn1+-u}@FDH+{{j*^Y4~^B=61MX*A79UrF8k^uDHEi{1W!^WK~_csavY9YiZcc|+;4@{ zIS8~arHFMl#{qn?A#}MNa06iu3fDV=w=HRc)7D~YYMNk!Wh-?>&{1*Qk|t=k*3*!f zgD0$RM>f@M3`#9!!Q|?-$zWx2S;gfokOIG*{al6v77dpO!JR59g=c5@0)fOi++D~e zjkmK8TOD8kFA;_?`{Con92COc$mE{e_F~6+`ocv)OMvp2gN7n%yE$mKJ76d@P2jb- z3TSFpBwZ`x=HG35i32=$bFjhXXr`%R3<8!lO}8z1j@3&C)dh}*+mB@q)oh|gOX@UXkMq0Y&;GES`yewI~?6$kWv4%!$QP8-O zR#Tc_7uFei!yG(eJ<0%aQFz*>_Oj^jS_@X)rmcYgw>_t=j%~ML_bYAqOBt4?2W~r8 zIyO)%76tpQmS8;;*^=cI$u&*MhIPrU58w7lRvOnOLMQ{aTlb(NPgrSAEfMa?2v9$p zgNA@(JL7=Wu^Z4h&7Y5c$>w#m+_sp4 zkII~mR`BIaLB5lggcjhjh8|M`KI1b!&;#s1yMQ>*rP@*LwH&jCEXSZmcPyjVuKO@2 zd5a4v#zKxk5+D3mm-K5uFvd=kLSwv!P-PQq0LYG@$PphF6ghB)4UWtd!+vx+HjxVn zX&WnIiq&CirXn2O$hF=eA`8*(CN1D>gzeme2XS)XL$=lo?$bJF3T`ePLC?-*bf4&% z%jrG=yJFovBZ9IoFh%C_>c|>(A@}3&QKj3tQWaf;6<2=uT&>!54-)Pd(y8J|>%m?Kcz z7P`|;gFVVbM$ch3<3IY*dME8veN8p?HH&-%guBd@NSJW7OC*}&3+(R9x zUJl$K4j!&>W7a7C3S!<>(=Fw_oAN7{uIwGU7gNnPwt5Gs{IGv>Qi2s)s8$0`^oHP) zlfi~=WtQwA)=96T2CPb6kbF-4GepceI7iB%XfCr$L}UN5$kcrmNDI}-Ojz8#xN&MD z84kZ_+_F+DW5)JyB0PY`479w}w1Qb_|_41JgP^r+RyyCGJiyTn|V+(7HK)mh@9X(3%>ASz09lQnD5k>n;on zKB!6E3C4g&;dqsFTY}AsiUX81YG3FNjht!-o+4MfBVudN*@2{6$=+%u#lp71X9YKM ztn4T>QG_oPE}Fzu(I~C- zZ4U<59R%6``;@j6IfPQRs9Z#{kdKY#m23%+_3z z?G0V&eCL7afrO`C_SDmfZh11NA)GOvQyleQ9GV&euVvnu6>fR?{Dt$8wpU)7d?}f; z-uyo4^n}|kyb#HI<;BStBcW*1^vRg@^=Bi`CUe%9Q^M?YQAOlgu?~o~I_F>kbcqOe zCfG|GCYo!#Q;3jw^sKs?OB5dULR^Y#DXYo7QmR=?Fx706Eh7eCk^+2C)8fmxW^_ab zilZqeu+6IpDx{i1B(dv8a`ckFf^U5n|HUPhg&=Y|;5y@;0HF-?_q_m_^FMOm}zfXlH((jBc)8B@i7w{FSB8TR0mcB4juICt8ZnzKX z_aV5R*9Bik^xH*DO>;lNA>t~%lyQf-?vPu2?Xdr@sj`$l*^EB-pwIIsGSTOmv3$K` z{mwi)#_e5@%M;hQ{j_$!#CWB&Z^AZikKKEI1+*G4zrf^0j(4?O<}W4$syl{hBtRx_ zbR@l?>xF8DwuM@#&@v_H3Am*wlBu#HFcm6PH#reNF5%RKTbndZ+4iKS(*;=B*LoZV zmB^{j8p=4V2v(S&Z=0%43R7}JaA?&(NQz}Cz?XRbg8MI+_eu#28&tEatf-RGG-f9^ znw&wOfc>^-H4y+aR1oBlbGV#QjNXM1r>u2Ws8e)>M5WeRupcsy)&>v`f+CJt+9tFJjWN*3Kd%2of;X zI}c+G>;o1?K>wK%APz>5Z#AMrW&rV+rFu|rEBgyV-lrGZE|1e6oI#ODv_zYT;O0!y-7-qY zTw-Dl;q1sf7DfcRsXi`@PMLFAJme6_fQu!{HB8$pW;I=c%+HOX;C~Q;@EmS%8mYCo zym8-}xRZYKuDnQP)Ru59lU>W=u4NzEeGz-YULe~G;`V|Cr+0GVLto(H3sWz=I(}*V zO8ezKvCf&6MAS4;uBH#2d6B9s{)Dq!c7h7xa5RBB?*kfSA z^@(Ab*@?fxLT|#`EPI=QeYgWZby;dwzxMzf3-??vzV^^Jciyb}!~O5?PgHlv)g9ri zc~4Gw?BYXH4@J9YJuBj#74NK%jeY5%s}Ei8o?W#uzG~xww>obAEtFK|dMktdl+K z;`Vg{E22dq@fnr5fWL}IlQCP`^f7wYJH$LoIV_|g{3+FvW%Xwks zpEo3-R!kykLE$M)**QBPp#~o?!|cuwh(Cb;8D*2v%#e=2a4cDMASq2vfs=3QeL!f{B(*~A9_IQ-tx=7eTQ!9y<$26vIcyB(;vC%6?Vq`hmX z4Lxu^sr1ZJMp;E=P+%of6QWz`;N8G`4a{8k!$>UeKZ?ypY~8f`u~$8ek1+*{2$Ge3 zGz^Y8BnVBB_A5S3G~8gn0Cv;Z6L-fU2!^tO0%2K$_EMr33fC_$X`W*m$*&0ed?B{B z=)RGquqClw(pU=AD0rVZQKz=m3S5l9u!8akwevRY;-FiI8E3?sr0y3)*Qv;vj@y|q zCuL;2$gsSEKq*mlpvK3WQe$!s!xU&Jq2zN>7ioHBVsavy4;K*KZ!eE7PnHGY zqz*g8c*0XAd&*+gSF;$RVAwT$klrgwXm#a#(Mdo@O~J&ias#w z3C2Ca*wfb^nXTFwuiBVgwgPWlS+9C8c_W?Ctuti_*9O_OA@16MU1G9>w*nK`C&~?j z{g3e_p9<{TQ^2%p<8GDl{0Oy2naOhY*f=Ax{98AxHu zG2&87wpgIt^~@5v$ItgYQK&{xpbfBVuv`#WQplw*V$A$(2HCXb(it!@w zNM2V7HVs2${{*b^0F)T)6QLG@6$aq7$ZwKnvm8c>kXUi3agsJlHf+Qnr&>W$A)sQ| zguE!@`{1i=1Y0Fnh9)xFmpo=P zuw#xVl)r8GOFMJLjss8btM~=(ZM3KU!ZtYUo7zn1Rc%eEN@1c&h>%nI8$bvAoIg9OQWK9mkcEmr`O?8%qDpA?v|L=&@T{)5KXWC;Vm@JphZCL zxp{ujgjJG?^R_}HP|Wl2gzh7&?_^d4gj>CHgfEU0y>NTW+a&xH!yN$77cO@ZZRLM6 zwgAf^pkm-_Kwe;Y(la2 zSj{*VIAku5k(qF%9#n#rS08_`H&NOmm$rbt;Db`<)C*zzg3})vopqMQon^2B5@}{f zme6O-i?&5t!|fDjo!aS0U$BkeaCf&7#+ft^_WxfR&Sx>rdZo zx*1B8?2}9OCGz&mdHazB6%Ai{G5lgOw?1zEEtJ>YD&H_$zTx`ljT7(p-r9C>cH6-Z zMibi}mA5^bD1S^Ye=K5~&PtXp!)bqC(q9nn_|QZ3x5NUm@#~!lPpj-{joXET%^nPr zcAM4_T-9^eq@i9k82|g@Xsae!@HG!IMX!EMnhb(>LyAYaR~NYGm!Dd^a@l?4dlBRu#${bfTa0^pV6{dmzpfrTF0}|@Fw!6L{)t1>pfE zFfs&Ecb&e`bE%;2;FLh+3APAlhh0n&1w)!=;p-YqkF&}PvLiTnwh?B~hlXowA7}_Z zP^a1v>_3Bd9ju#5MRU7qyA{*`B&*}c(S86};I+g0f8kA_A;W5aidyls7(S z;tMw!pSYm)%^Wq{e-h5VdHjgirlzOwR8pky-b4!J+my-~f2Mv?*kSlMbT2%0&|wfQ z=CK(58He65zC;PEtvEFVWpJtS^x2aY>Kss}NB6K8{r)q`@C$C9XcEm#bGx+`2I2X) z7tMxv3Aw%&hjd|06W^d5N?2M9rsXies-PBk4g8ZPm%vSO! zb&=yrh?%{M9cpHo13uXEW-JlvIc1GrJ2&p8G| zXS&a^7#XA2H1+gLaS@?4PCAeBf1MEJze0gv75|de;>nS-R!;69i$u<;{gXS1P(FIG zb*go;J(-jD>d8wdBmK}8 Jkswa0tXl!yEep}tO$-=VeXzWPrk=P@b&nF6NXI9Ph zUu%pPZVK-X@BVn+2Qhw|8_Er8kj!64I{wR|J6>y?Zj5!uy*1=XcSu`=P=DtorZ?OTV}VshLlXv?vDD<`XMZN|5X^V{k(zE$s_`}Mio z?Urxbv$n6x_;ybD_SG5RUhTlW>D-8UB2GC%_V*WN<6_MsJd@2)Kw3$_{qCS*`hr21 zSmgJzu)vfK&4z^_qtFVZl|{?af(0YQDPE*#3jRB-kzIHN>3@4k-27Yc>&W78nGD1XPJBTCB#S+z%1?0)T_&9JG8j2jNjU?rXO>3 zY-!qXRI6c|{w9;&Y}a3H9c@u7w|8t=PbG-2*rvZgY3rM}Yj3vpYgzb>Uf4GM4eCK2 z{nge!%0&C;m}3`S?b3?droYLgH{11BTl=W@)Jz*%^f%k|H^{W1g)+f+7H_p2Ff#Bt z3^fXfpjHl2(mY7^ z6LNz3g-7**LuY6S8R;`2_?0oTQ_W}aMJWw*9&<{v6FULRJ|UA;Uy4;|6G2dMte{GO zj$>>Qr9f=v6^B_!IGxoXV?L$STB8!dX}kKJYF)-0qLvW@%hdb@!nP*c*K{h zwjVkg>>e2*@lVkHXx|b}`c~83X^flnECnm^NK*~>bD83tnFfH*Q&I{_LF^g+5%R#n zp0g}^pf65dD?f7D-B~{Y1^|UgbC6+y=CCu! zkZ;Z^>4q{s@$T=(`K^24sT!%~nK>soL=YVs{-lER8;CYco~MMzbv!f#8yg!bh7NU~ z_<2N0KuDrDU|N0N{rRlVdqDWKYC>i!L$(q0xq78a@Pp_FcS^@}K)BSWvU!rS#>+iQh30_EIL#+)gKJDRnT+@vrTtUo>Y=COz>n zZ3M|Rg`E3}HIxaT^3Dmn$zfEAzK+y1641-Imu!NORHwUkO4R`}%P)}RhE!~n=|AmL zYXp(gW$wiZkYz7rfeN)!O=Gc)R2c3n^?RKFx=5?R;szl+rb*Z9c_50IWp1C(vm3)CiI=v#e=Bptd44rSY$sv}&$deCv~zLHi4qa~V%sUI4&P zUrNZ6lG8ELq}O7u!)iHcx#S6zgtNjPxJ@m*;GM{XJJn3cgOI~Co7qVj$l}h)$Dvtb z0KTIZ>7emBrgyYnX^PqCOYV^e^q1xqNi}-?M#6H~-DeFIU2u)t?yeECxW$tDV%E5` zOVcbFhu+u4EGdBgE7Mz{- z5Mwl!i48Sl3qs zr}p9M2ewpf-K9TyHo=aP>HL+ zorV^l=*9L*@+?eBRp@FgV8X@eIypjlgQuM$WvmJmYdV4z5~P$+rYcFQY~0kZCe=h@ z4=C@LY7QdtnX}NW9}3dw^1R>==pQt6EG8Mz-3`=PpkAQf^&lg9T@j5@i)EcdRciz- zIt-sR8sV2}qPa*@P8VEOvNn>OF;@k*_oVNy6|Q!fF1@VQ289=CbdW`TjvqgJe&p29 z;QHVirtD()Fk6^Uq~@m*b>0fe{q{je7*a*Ujc5A@h~fzv=;$D`$Cdv4Ok%FBgvOp_ znd@Dcb_a(>b`6aV3MM%F52A)}N26mE%6A{7P%724QyU*0)F4oZkt}AWYvl-VpckY} zPE1wxv-RwY%73hTV6@j<9()^t+>hQjj6Q&|L9joQ>zl&nNy(uEA1AKWJ}U70O0woh#l zO`Q}rf&xAT$ZQO57ps*)9|H(=P7`?u>#*_Q*a~%Ksqgh>Fygz5ZGz3&q!XP?7yhq& zVyy(?`iZ;a&{NFXdq#SQo;_G3z>YZzrws@%_Mel;W~B6Q@ClzRy9-jyk_?}e@@Ufx z(ot#!-8RVw6MGm~ll2a@h}?FQo6U&znI^*GV)}+>xHIpql+LJJ1*aQ1Mhw@S+6p|) zn0nlx56;Yb2b452y_U1E#s~~1#au01p&D?pai>ux*o;+5g%>?B14geme>}y3DzL#V z<4$QaFbVAPi?3930an;>16H+IDaK{QbjDq}Y_S=WgIbBJ2Sx>tTBg1MEYzSuYQ)P& zG&~d7utD2a$HDvTz)o8y+(u`oQtgso4Owau(=dr%xXmr2_vRR@>`S1c;-%g6f+;SYN(k2gl*e)d5YlDL<3c@mxZq#+b3 z{V@gKr{HZ0#%U$6#X3H3^O@Xp^gPr=&oP9U%jy^m^@@AJAj!mn8toaGbM#6Qc-CuB z%3St#aJ_e`;Fb*v!ng>nM_z=|7pQt#Z_?Khha)YJC}{b>JADs;I+)@%t+>KTW)sY zd_{HaxvMp=fyELnOqQ>LW&Dx{V$a8(pXvM3OIKftWX}7`qkZr6B>eTVAL{&>dCQZ5 z%3Fcevw_t!yM!iMJg^?WWC2;Qqt}IR?tXoDwC%OM(|aRuULA}U!BN5!iIPSbK#Rc3 zz?zv8*G?t^8|1)-cwj?vS$U*`{(b!Md|<^prSCoY&CK_`asN&*XtEE&3XvYp`@wFp z=D}Z>)`YhBx*dsz9pCHuVCA>^zT1~**q;a-kOK$efdjgxkzJ?>ZTeokreS1?ydyC^crEA-Lj_>-aaNmPo z*DlNj3oDz_q4W)_rf!-=ol{-p6HxU!F0Nm9YY~k zizy*gOpDBOVXLZR`dc&=X!?GvD47;?#tS-Qh1dIT9*S=`ieIEp{8d7J&-9wHa%GoO zHudw$ae%RjDhVc8dG1fqjHg{l`Zc=aRiJG>(yJ8Lg8HQh?&^YbcB%KQB$$o7Ks)IJ zUFyav4N_7~DU}zaLnjSAmScSJFeXmb*~9J2n-nQ}T%Zp)Pc0g7O+?HYa~JfAMcpQ;1bF=Tug( zbcLecqTp===JovW!w(A%4!53ywKP!Yaf6A5RoiZbQfzpbOkE^%s;^W=N8YNxTp!P= z#?Q>ln|J#o+ppLzdlK$S*$v4+hhsSr0oRe5DpUAMG!q*O&Ya25&F2Tg&aiVnyC~{> zr}8~VtUQsuR?c3FHRUKz=B%aSi=r792d4((uCfJx@#Oww+49Lf^Uj>G^zw@rUc@4C zte^K6Om7tK`QF)nwPWVQmkwM#knlIla7f}>aQev5-pcvxf~jYsn_``b?0Px79)9+U zmWAPa*M4U&_=fU)L=f_H+3v(`=ax0=UeW}?nHKloDF|`N)2Hz7`2Wvv1)U2Uw!=2-$ zJ~j2!2y;8-+|G~Oj(qq#K@i>!Gfgf~RBev@l zOD@q>Nk6RqSsetx94j!mM7)ihOt_ZIE@JW#pD(NKMsa*i$IKHmPu!FeS$ijU%x48- z{zO)loK*#Tsl$X^eAiphUSaue#kQTRGQL+~ML3tyf2N6oW|LScVLzDG);s?WHzZaX z!{5bM>V6If0*ezNW>LCNWuys0t)TRZ3oZ?`doz}2##SIMXdU}UJ~gxroIOQax)9VG z22~nxt~oda(J9NEVgd%%+1W_&NcrHoO6(3RoPj&+mC<&&zu+?48`3v^xzCo}5=VUE1_UyBw&U z@n0*v?*B$%BCtsgY)W`G%bv|~yYN;ajETREf_qSqj3KE>MotN1V; zDUFwHFrNal0?V789U1@;4+!mv-jNr2Nrdx-A-vIC-$L$DCos@t<)bi3R$}fN#mz{5 z>OnEZnu7Jg+NQ>J!8IaTU2wH{(To?I(WFC^c5;g;cE9sjo4C9Xh=z4vGguTaK85LP zhAtsha$cVTpB5x45d$i~x<)wQ7Ft_ClvPFhlyySn0AFLq2)k6l{M-n8Y3!UiA%0@u$L&Jpy9EMF6D$37b?0(@dN~l zRUa#uk7$%T`VdgCAjt_wLBbI-L^c6)ex56T&H*L0!4RV_U|DKwpO>XsG~z1+7bv(% z5MVpjB_KfMeL#Tez0u*z&&P(ZK0h;>2s|JM9!PjL$es;x`v$=r%w*zH)13I*%)Sgv z(14ETsMvbvX#owaG5lS8nKu%6gUyHm%q_maJ6~k_hzw(4Td;NaA&X(fnzjaFCS%cZ zm(hCVb`v>@9zZ`Lky^}WXqJIk+dT{;LFOfd{Au=(MQQG}V=P)}Tmq(@vfva7YwBJh zRvNX7D7N%h+l>TUfhqn#{Pq1zEx4kIbXG}$6-2iR+T?IcOPuLfy!~m7GBiTXE_4PN zs!<(^`32IYVf349)59*}@6ZIBp@5xPT);q>ja|;UwS8Lp8q(dOiP(Vg#Y8N&Wcy#; zcWK|n15*bkcP8!b&+mI>UnDbXkA@QVRkD3m+`cO5$(`KKQ_gf$v!ev;H`Y5O0lD;E zLri3y+qDRxuyy~9I&<32o*hv6I4YqR_NY$v_nZnUs-I-I12BVNiEz7KM?~x1Zlqv= z0q!|P*V(`dVqii&Ey%ILLp`7ogzw4l24*J)MZlP0;1FDj)&hW=Zf+UNvU6ROypgn; z75RNC+K`^}_YxR`jY~iw7Hz`}5bYd-WCWIiXt1zA1v4K*szoUxl7djnWnf{z50_X= zgW!}HG)aXdFsLOdTCMzr0(CNMg(loeZ7DN$6oR_Ku|XenKTE5UI)!!=QVLM}`e%Wl zOpb+<7c$6;`Ad^jx`}yXM3(04)MwH)OwqrkDO!s6n4+aH-TCU4OIso%(YEOq5}p+@ z)C%n@ctT1qBh4qiqY&~1^yq!6gVxD2CahaSiN1|G&FXQfTy~TELW;>AVS;BE&Z@`B zIs%+T-&=$ylo7HU)wsYReT2ZPZp6n#Eli;eYF0n*Ei9B_uzv^{1%0{c@mguld$oJ& z=(v@6xwH|`nPt&s-Y|%li$!jzHN6QSqh!Ttk~iUN+;Y+ya>0fn>NJ=8W$PoBFQoJd zwiXr!2cyr&s3PSE7U*d`v*?4w6Fsy4d0hMA{S164_aDKRGFz($y_+*g`eIN({4~n$PEXAupQdgQ=6}NV(p3II=Q%R)>9Yv z)Fty*n&rqjRn!sfzU;c3t#}|#O#>@z-fCEV%L9Q|^{;~RUEWvSm)sXUQ!wln_5c}( zAHLYdFZV0%W2QtnDUx8UhPNMmSd0PHuEpbEX2P+^*K_;0;K z0>4WmD`p5Z0UC{wmj=#Tsqs0zYH#YU0u&i&GhD_SVClGJE7}pVGV0ufUf~7%NbgCA z^3jf~nvP+@@!5gVli>L)3R&vzt)fH*rYaW#?1#~n9${9DEP|L}U4IDRNUMNZyt)*P zWX2Q(KgO6ItRpaxm`$SyV3=|U#tml}Vjeq0Vzd^st|KAJDrXmP7TP&I&kmed0hZKz z8a8B9@C^)^j|liivYsJm`Jz6u)6d*1CVw-#iuhPKjA@gM=ZfhtHkU0aUCf*x=^L05 zMFbyOkrk*$nI+5nYVoDwi=|VgY-#F^{7LAC%!6!*B@n5&m_3yp&W7L0XlD3xztSGg ze|gU&{_*6VbDe>f66x=l&=10rdE#xu4JMv-1b@{FBtVS);>$b@4O4||W16N42|+1X z?SYO1JB1}~oVCslogG!EBgc<3R@6xE!SokOi|UwgVG43>m`T9>mYPN8;#3QAcsb3Ufwi45pKAGOvD8$Ws_PU210^C&2;aJC@e{KzGbF+HoAk+A9W?T=1B|MI z52^5#B!kVk^3Qd$j{V1_X6kVF^ZI$|?r@EZV7Zm0XQU#j_9@_+=qtj?)OA28A2*BV zElgJtwuO_Q8RXa`Ngc+oD#LhV>0zYur1$Z@)i8_!OY!ohhw*7m)lH zpJ>U}lpv%7-^2PQ6Uu!Qsdmdotixb(!uV^hZx_To7I#PW0Zo*NM=s_BRD1S-E@w8MyEfcXQAa`Cm)4l(wF zrG{B+;J?Iz(<*1oKzpK77TYCDx7aeo{!aU)^#7t0RKWQssiT*#jh3v+2v5zSMfP^;bH={jUyP8cO7>kaJcf?7=wy#6V_gWel4}Qlq7=LxHr9 zaCxSPzG z*x+|NLw(Jo)Ps!LMe744TJI1^(@fwouM#L47}gRqGX)#ukzRJ z|HNqi1zx2YhMj|KkMZX|42lW9pBu+=yOhA~LCcnutpTs67M@8gTuVFcFjsBYAtwbER6qq3@62*#p zLh`vqN@*>rrJVz7`#k=igGrY2O|bKhjZD?rP

Lcti|?c)8dwSza#=pFJa8XSANc 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 Mi?sQ#wNd>41LoH8c>n+a diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageColor.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageColor.cpython-311.pyc deleted file mode 100644 index 165d8e8dee3f6288beb8d8263ab173908b971f76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13870 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageDraw.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageDraw.cpython-311.pyc deleted file mode 100644 index 3d2eb221023f612f9aae07f43694543570366e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47548 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 T&Ld)f52xSo`fs1o%GvnegjPZH diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageEnhance.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageEnhance.cpython-311.pyc deleted file mode 100644 index 7500dccad1c1a1fb007310fd370a84afe3c28fcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5682 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageFont.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageFont.cpython-311.pyc deleted file mode 100644 index 8e15c61a833f68af1206a5e7a0cbfda158037bea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68479 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageGrab.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageGrab.cpython-311.pyc deleted file mode 100644 index c3019f8c1a2d0e2309d983afae231e18f4fbbb47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7602 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 OZ)k3+%|Dl_)A}zEI`8TL diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageMath.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageMath.cpython-311.pyc deleted file mode 100644 index 955ae8f8af677c9731b5e5fdebf7bdac8d29c7d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17429 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageMode.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageMode.cpython-311.pyc deleted file mode 100644 index b2d839589aa4419a9905a83c002313bce2077842..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3118 zcmai0TW=f36`t8$E=iFTshcgyQAA6=(Y9z&lGVBr)Jk$9$)N6E;ype9w2T};ip3!bEh5{WDj=6*z&M^m55ggl4OPD!t(umJNvQl5h1c~ec2 zZA?m#Nc$VqM5yp(ip7$VF>Xu^$%MOCgDWnRo;xXpwz1W4b8KzK~5dcB-WJGU7UnY?3xwpb|(>R>v3Y)Pflyc;U{ zhVUM&unWQ4gkBKz-viW+J#}T+REA$Gf!b1S>ETjc={K!+U+J$a9ku1!^26n0LZ}w6 z#UI8S3U&20$o~MlajRXNC@U^2!j@?cg2|fZzrX}OCI--E`U0oaN{rr@P~Z}iij>J) zGzY7ixxS=KWo|$Z}RI{KVSoZAF@HfFgp!6WZ|%dXV_WLoMY$Ng|DT*(JiS;s?r0(C#r-+AP*VN zUW2^`-NmQS|L0Z=sG;CpC4DGbDWwpyC2uKPt}WGYH?>%@>Z;0BrK&!K`ko)wnIP;E zyKH?UENVq~<%wkFqfaCjV`K1*vkCaFe%-$1uDXx6_HG-@3nQhz-$rDza&bX3^l--h z-Pz$@U~K`$=UR9@2fu}7jS4lNGmN};K&KDrjG(cIB50iBa))0v3|U34uEuPIVr5Mu z`W(pBa!k-A@Ery!q}+s{9|JpUu{B^fBMLtctXa&GhtMqFT9^alg+rq(=q*7P1fAoS zg8~kBTRapVLGOzQm#_|c_sDhj|G3UNuJg_tMGB#O^(mL6M{WNSDGDk+!hm`w$>%+qM!*uKXv*9k!D&v-j6h6xgMx<3%90X zS6iHAYcT9#u?7f-&+(kJ^RWpb#c_mi+U&WIj`bA_{G4$Hy&dDxL`n9HT2Wd?2`bMB z>E>)i=D)@wzd@JUKN;A1JA(i1n&2)JJ)d15ulyVc1_KLDJ6`QQM z5EFJ5uc*l44xO{<6~H4d~D9n;&zrm7f?ERJOOK6);D$GUEMUa5}Z7o z<8N&3x)G0cPzhBlvRtMpTzCqiD;$Wpv1^Wqhatxpg$G4EMMR(gM=qSPmY=SBz#4Xv zwXF;Hx@KS<{3e+2SJD4XaclpNN_u*~THd?+kM0q(dt^JYop>=``?#U>2GoX1ynZuq zuHi=Fafla58<6en&iJmnH@O$U#|%UpJ~a7%))YWfyHiCFNr-sc&ER;W14$?G2F=j5 zMi-K9hx8yh;gFL^dWkn=cKo8zhvWmNf&nBSI%E*ZkW*$D$ra=m?|aRmu!LhYl*81eYG%eAfAR^1mgyJDsf-&g*g9kx5S z?;m{WA2j`g_0g*@*mu5t&&alS=i08eclT9rV3+NE^z7P;-1oiv!5c4wH%!kB7}Jgu zb^Gl+i2`7E|IPqD^`28ZBly%qJ&up<(0Q^k80vw30o0ZuzRa`XYKZP|MUM3Da)AogAhTj1LEI6Wn3($}$r7&f5*d#;8 z-`AwAW<7N>Xtus}GGMm8ugPh%^=+ta6z&=C!%p%?)c$m2>L-$~Ax+Zh25G{NGUy)l Jy`#0F`7f-?`GNod diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageMorph.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageMorph.cpython-311.pyc deleted file mode 100644 index 7fd38e3416e7da6772ff806bd3aa581f05c7bb84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12663 zcmc&aTWlLwb~D5G%cNeUOw01xXRl5zDb9$Ce#?6&YNLGm>fZq0Eqx z#ZsuU&2G4<(Uk%PR<>Czvv9IX;}3o0!)-U+1lR&8S}aI`g^4K)7$_E9_e+5jz}3(8 zoI68uhL*Aqpy(BK=FWYdd+&MQ`Gvz_r63*nuf>T(D@FY$zLb()&d^T;$lRegilZY` zlpdvN%rg;Yl;L!oKB9~2NA*#|r~%3iqsB>!Gya?&HNn#aPcuWEra1GP6leK}p{P&b zUrwVIQe%Z0TUCvfV@4>S{V_K5(UL6~i^UVcL^vK3hab~e$Vi4W(cmO6IRasLhGUb_ zxG;4+Ou_Iz%VQ(7d8`8<;B=2o2yi(9g2!eA1_W5^vj`4&kSfw#u;VN4i-0W!8v+Xg z947?-<%Cl}qMr-{yhHKSD9ur@E%d0)LUB#pcFyvqVN}mGbGA42qXupVXNRYeW4SHx zG;u9l9X!okE4LM%7Osuk22XkU?UMCeGI2Z^j&QsXyaZDXu%Sp$6xoTmz>Z@%ESn9o zL%4Ei%1#LJD7&mCeJ3W^CExnpganW)OWDM@As2I@fDK4SM%E2+w1G< z@0ELWOkWQtcyTI-1BPRvNRpr)3CH+xfe+pU90b5@G8Pwj&gUn1#$f^R7~4nYke4(L zy#YmD2tx+Y6=$MRJ|WDo@hR9LLLO{KI0o3lszO1LXM?17UzebekFOJ#Qd&JOzBDq& zj?XCT>tg*Z?C@2#i#CQU*;kyijH7ne z-~^ll+uGINs_ebLG62U<1aSnIE)i!1K9Lk~aXcGJ3IZR4QzY2D9*iXUP8Rk!bRF6f zyyV6_$A%}^Se%VRFM*8)6Ql(YP%_3T6P+*bU3vL^u%teAIyl3Y_DxyqFjNfllfeY9 z+LDvWXcUitkY#zU%5pn`F|3UyfyROn7*%A)d3F-0Gv-r<8G><#!h#S-;*-~Z>Q*p1 z717XKWSl+1R#>8=Ov6XmS6gL*L@Hzz(rdjY50Atd0g^w$M#lYwZ36Jx;gjbXmdvGb z)?LU4uL28PW7F(#JjP3=_*5VkjPmPNC@mEl<;|7!*d(MQ5f`ntsEa zrqfiQ+$084QT@*08wxa%(##u&IGST7L9R~HC|e?wtz6bi%19e1hb>1=*OvJS_gBiWZ%<`B(wB_agLC+Ff(LMuo6AFL zrXo{UruP{oV<;}fctNso;RxaUzDo9hWafpq2-2gkoI4=td2W(Vxh}_U#^TelvItnG zTVQq<%r5DGEF{aRTOpo^9-l$di+p5)R0_4&VhiaTC=raLi;9yXZadN#yZ*+BgJYLL zJc(nx!0}Ne`QZ52Fn=o%io}!L*va_KWEA+89~()41WZQ9P7WTwGInWCPfyQSZ!bF% zpGZuDBpmDMWlvu|GnT-Lz+^H!2E6k6*tzidm~r0Oc1;x82r0IK5O0hpuKjFi1TXWLP1YR{a!J(L-G)YOcb;!a;if7@KN z)#hx?kG6H^dQauNFBY5k1|{zB7U8JWz`S{r5G z0Vq5HY^ilinKMJEvP%hhkMP?r$lL*{zD3_C)lq3W1$sTiRJaeR{9}6fW11YPj}cm+ zG0BTKD$5G(@R005jw_#W%A?vxb;TGo72N>lsG`}Paolz+HRjDNn90DOfGCB^3%Kivg30F#FrU?r+lxRoe`mVI~+(|E4*COH@({&Px3MT)|Akn z>Q-&GEUFb9h$7p6I1 BVxb5++iFB5_+I zUo9Z9VzK&1jt7vljL#(apdbWiB!d995-*w0UA`0;IWu}n*a72$Y#>Ck2l4{!3MJxJ zvd50eq*C(?lBuR|TLRLecmlxFr$9D!_4C2`T^Uo+UYnsG)-|aSg#2gw{<-n*kN)x~ zWb;jD3jpiR7V6F-duHH|EMeVMUVx&WG-ru41qjnm@RX53D(o>r2|g$UW+3aN$vQ>s zps;~yl272ar)pIzQpz}JCZb6Ut8muczLjwjY$TH+8YLa*OUVYNMKmcJ?g|TsV~J}T zm5HQ4Fr0$STl5`D%?D{lOUWF4ld!+YyhME;cqfbKK9e%^1Srop&1vS_`2y%vpL$ca zcmp!3VCe>L5-U?#2pf!XY>-tggp|k@0GMUhWlIR8zhb^AO~LXChCoLVI~R;MwA$2z zpggPC%a3s@B`q7mrpRpA0hxE{G8@`~4Vg6k4C6VFwaJkR-OvLF7x_Y>r-UQ$l*yKr zIZo(PZ6Y0j$lrZhXK zJ_~2n;;>0OTXn=^lXlkX_{Xf7(7)-%#e9JDHH$1s$T8}Z6)W0Z_?HP$j z=)7zfqudK8MDRL^6N|54#Kw5py+nCOM4B8%cvjX$<6L+m98#R}ijz&ebDnKixQqCI zIM`HB05=O?5a<$V4O}&(D=G6#Ww2_xSga!9DjRJT*^w(PlFeQ&OAPsWUvyL0}zOn;`oSnFNdv)Bm|xI1&=VS{(6cj4;d z)ip}z0COC`JY94(-f_O;EH-R?(BNBb@GW<&?77#u^4h)b&yMCB&K4TZemRn>zwnig zsj2;%08|2z7%upNZxg+;JTC}Kh+{O8(i<`0iVLrBM<$^+w!ySpL8#`EsJ^Y z-hy}U1Mi_#@1grAKCjDrPZhkU9(adVy+dDyawD(gy;lm}EAytJ+w;@5rOQVS415ERe~AMG2226Uo_Go+am zbmEK%AvAyiP9;?fYYYu!RalhTL2r{*?10GGtfjfCr7=-c8E4a87Hu!>8z>RuCVOD5 z-h)lrJ+oJ!IN=PkD%GXJ(wH`+O&`H2e**ta;jBN2?Y5td(pwb+VHWa%`k5# zQNYGo8=OB%*Jo1oxI!&w<4luGT6HdJ{!3d9!x*=_Zr@Osf-tA-zfkDEkat}yxGsVotg8oA>DXCx_pS`&-TUtA^6o?0 zkQS()JCpBBE(I5EEZ)eRu6ljg(706dGtW;v*_!vf?|T;li-F9GpcXyNcjE8Fv!UfZ zdAGmd_CIjHussf6&;q+Ss)`xibB^G2eK)(0Dp;Kb;xO z48joGcjU}li=G{TpyfEM2qDZ5fjD~6`oPt?>T1pIUDoAYods9t16SXwt8ZoG{;s@h zpx_#SrP;SXu(z+;+dmw?dt;^MgXrDp%9Z;UJ{`^NJeIc)6zl^z^83b0)q38&wXkCm zW-?hi3CIlmc5Bnph4JX5!vI*Yf;~}Ftn=PE^3IX0H(%FTsDm21rnA`Ao(*PqE!W)j z&7WKxT)MDu_UW1d`+*}^Uk*k1nBifckr2Cpx`+gDg*wdDBWM8N)64bGX-gSZ3nl*@ zY;7c_ozRc1(SH?=At0k+8Q7V`HYD|g=t+)PiD*E|Er+nBGAbGyJ{!ht@s1%7kgS0K z$cqhuo%t<0}cd`0)4__Ty!1au?_Kw&Qa z62M&fZ;fd&nAa!-gETcrpQG1wTMd0{)CS-M+RzFopaDjm0lHAnKr3x%#I|Z+G#C!7 zQChI28JlRqF?u%^ZUW?m;hIA5UrstXM?bj;nd*yJ3k8?4joenagvHBPFXx0yRs*+< ztAVExp0)5a!F6o|Jk9WQ!_xwnw;p)Pm$A)~iNx5?Po;JbsIOteu^?PPmQ@9~JQ3xp zFD{6~vcyH|QPCd}l7uG9l&Fav;9B6He)2h4i}nTy?udNqpm3VGSLLN|90AZ8sG2({ z2-v1|Rio9orG&l#13g7v9gC*Y1Z0Xmiit+DxT4f|+$lXk6@>?wHm zJn$S|^&HN7`U{?ZxP|~(ni(uQ8gh;nYC1ci3ZA|Pp8i!&f8KMf;5k-mx2B`E zv_eZcmSn(h68Lo+xtsA5xbBhTMPOTWva0fHnhOoEj^v}?4GK&fubr#m81NU6IFwXv z`++4-SNsc3cayXgYB;^t&v>?M0C;1Ng$h+{?51&_Q9pPRa;Ze z)>N$Rz}lvzk%jKX?wq~lVO`_mca|={Kf2s-&%1IdUw5!jcQ9jq=-OUzwS9PMx&2

C%Nn6>Od1EOVq z`8Rm^|K=Bsm;G(@UiP*tyrT622}OT-nuiZ2$`P5jq|?o5z3h3E zXkO*RREWM5Vk5*)zN_iD)j8v1RTGv6!f%AYQzAA$&M$L>pB>?O_MpH|9Q= zCiv+0{KLWwoQ{A_pYRs|Ad*%ldLfOavj~v5h3g33K=6G8e+A%UW`!ng-*;H`0eztx; z!F=#fKY1N881b(NJh-;PS_(w*9~9y0uQ+ayUf2^xLrq6gML=scG!Tt0^|6*{@UZZ! zA=yV&C+fb5fD2XvmzyHR@ z=&s6SQ1fk43r~CZ^1gcq?!irx=3dB*jy+o8#PHV~IZ`Y+ay!x1>T8=cL^rfNy^pHa z-hYfqr9EQJO+LfHpLPzKirLzzUP{zYGq-f#rKV|``YuJopIXC%E-n+6c6{|Ui$b!E z5Q|iQKcE9`kD&)8rK`+Dyp;t))Tdg`f#ySHTULeg*NHJUDnwY^Q;8AAhf`ax2yqZ3 zsNPgfp}NIqlJw9yMq;v(9&AWXmK!g^+$0P^f)*vi@UNj%q9=&*)0%~n8MQFE$}Zc6 zrIK%;m$(98j{2>mX1-(TWZuzIaI}E)VtGD$;h~4k*8IZ#bN2_0cN_Db-38BXwD{I^ zP)nK+@D(=x8bPIOqukS{Pd6(51_Sz;#O+%@I&%BSPX||R?KxX}(X$O_D%N&sweOmV zvhRd?5gmwy=LYn;FZB8Wv*`;P4RB-fM4#_ZSB`2)1mvvKk{XaRgqpKuLV_vEX>(%_ zz7WQ+UlnU$=?Jwk;VM4Fj*%dI&8j9R4AE7HN!BqEGd&LUP|+?J43Z4f0(>>4rV~OW z!aP(~Q;G=FXep&s@_THZ1u#cFvN<<4jUHB$P;>S|(eC*1>9M6`KRLKz=#8>rEJQKKJdFn!TT1JqCknovY=p#zG#s@fm) zF{!o@Fh9_~fDoqgWpRv!PubwBVQ_K9cv1-Q!@?mLp!6XXZoB3~DwC*uLE>iBOe03ml>SgIMIj*vaLTTCiC)ND zl~S94H*i86!4!hm5bQ)ShkzI=sCicr~ zK8Rbj>?}67!k2ez7Mo!J;whUz?-m0@+O&XmkRH##W(!7Jw7_jPfMC;tdZPhINef(z z!2?maje)#2To#0`AYe6-1Oo#CRsxCwA%x%r0yNEKn+{d5a0S6t1jMB$+oIj7b@O34 z_|-4G2kn4FDDgJ{fLUl79Cx}cN42Vdk0{F=`Fo@-FSmJQtC@rAQhgl*7l{g(bFNwS qHCUj4ImepoRfdL$)5h>CQvS8NHmx6~Y1pBS;a8;m>rHCO_Wdu$d|3|w diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageOps.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageOps.cpython-311.pyc deleted file mode 100644 index 4585e25c70316b674739af4f4ad7de79290c04fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31560 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImagePalette.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImagePalette.cpython-311.pyc deleted file mode 100644 index 12f1a9d2c75dd285e26e235ce1eaf0086e69ff5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14322 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImagePath.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImagePath.cpython-311.pyc deleted file mode 100644 index f50cf0aacd959d67eb66cf022f834fcff19831a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 399 zcmY*UPfG$p6o2Ec8KzzO0!y7dRBMNjhz==~AR?FqGO&!!XsbKBGCN~`E_o380zn@k z`Zk{TByLb)@!tEr_k2DJ+Dc!qy%z-VX^M@degRsYYVZaWC<=h1 zHbOvC)CyAEYFh}HHLy1$gY*Wqx2WBOLV96{0!nsB7)FvvKMLc8zGS#`m6JZJ7cxoK z^Lk1u!8}h`x|x75n-aSl36|I+BJUErq4Ni&3uv>JlT2(Af!|N*_k6AdzHNS&n zU$Vmy=?=BV7&of5;~%+3#nI?-y?xFjsseT)cC{e$QC!k#X(5D`4xob>?Ej59?9Kki QJd>L~O`j*Wago!*->*7tYybcN diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageQt.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageQt.cpython-311.pyc deleted file mode 100644 index 27c1d125474abfb8d32cc72b12bed71fc47cb0af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8800 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 F{afVMClih8d1z=0d_iavRWQA-6ZgIn%fsaK`Q? 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageTk.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageTk.cpython-311.pyc deleted file mode 100644 index a90d3ec11f87cd20aa4b3ac1ba9b88a13aee3a17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11327 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 HdC2%5L%zgf diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageWin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageWin.cpython-311.pyc deleted file mode 100644 index cb97c9e5fb01f7f5541e01a9f873d1844ebd363c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12129 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-311.pyc deleted file mode 100644 index 6c24f833909553596bcad7205e7ad057ac6231a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9371 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-311.pyc deleted file mode 100644 index 90f0427284af96c696189f241c9f6dd0aeb456ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35478 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 RQu)|m`IiO$8$KZ7{13VYO9cP` diff --git a/.venv/Lib/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-311.pyc deleted file mode 100644 index a190e282eaf129c12450965007ab5166958225e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2505 zcmah~O=ufO6rNe_uKXj}mTak*RzZ;yS~bM6oi=G4x73Ma)x~i_T|1yEh_z;9WJ@b$ zc9l5722;|q4Th=^s8Uk!A*3lupvOQjIrb`zW-4}$T*pLgQF+7bGLFPcMYOz?}ZVe&m9h~Okj;V{O0E+mDpKx{-z+EQXz zOi5u0_zu#2OAN~b3L(;S3z1$bt?l6;^uUJDBX}AkY!?s}*SeZ(YG3Q#pHsP08?c2% z6m-_ON)Vg9imIk{MNgzvZJ~xaQ!u5ul(I_AZtFFhNK#YIFd9#6n9|Bkooc4csGeo2 zDXyf`$r%5tIk;Ky;1`Er@;%zL-2F-zZpvZ%b%8Iy2-`x9TdlQBM@ak`jA9T$q;XXL zOXK`xWJ#k;i%>>r%Ad+=%1UH`Zs@UOI!hum>Gf=isydA<>RFP=rXn++oVybFd}3^D zEHXasUrfjK8w#V5v2lNBX)dC3L3A~nh+L=Y^~ii;C88yCdOV}V*1=~ja(Qn4#KqVg zQ8df@%gO9&LLJTAH0@C(7NZ%R^@CyDAI%G78&!H;`9OX=AJ~~J4p05wJ5>~?UVsF} zIB5>c=l!@)6vhNW;&IqUgs@2LM1q7%M25I@nf+}RG~$2p{M^j+Vs4-z@PkK+KMt8; zJlCeUkXC6&9(V|?JY-;Jo`XJui^q|_U<{)H3#-(uyXCMxW8L+Cl6Mg$Zg)|Al@K% zw;=$>La~!UG6dD)Xzt6ooARc#X(w{r78h4}Tw56;yt6$EH3ad`y#Z&7Us3(9R4q?a zPCR_-y+n=s!$cq^p09DfiRW_C+}ZI{=W3kI=O-u5<%YAWmd#|+OsAv?7*Dg5qStuv zYCN;G04KacYJEUV8&hrs1;$Y=66`aDc*Yc=dx+J?rY%WTvv={Psw*287)vvAkoQ)U zP%Xw189mLSfMJTsgr=Larn77e-dUBO7iRwfRa1(l(uBfGOXR32HmDA53Oy}qG#NLs zX4+EPs)+&9(zOG;HIdWtxJDbBBw%}fD*E>Zv%Ha_=?qnKo&$%&sKq`C>e>KNDweLH`9zA#vF_{t8SfuHw#^Vhz~?d0l6=pOlTao2Ts`QGxb_QTb} z)r$L=asIj6SBRC|fwDVLbOfp+M+~vt<*yt$x_k1;(3AM%)YI8#)1}eb^5|?S7%B%t zrIApvE5x zyA8P50EBk|N{Lq)8v+uP&8}!vRZ=t>HG85w@!2GwJEGBRStYqAksBpyx*P9SUBUmB zo#t4)aV&Hz$IQ)_oE(NnI|F39byb|6?b*ukv7+d$i-)DlxQ_mdHc&ZMP_%xjjF(iy z1Ku&g9&UF$3x9I3oAL9Ry#vHV40<0inG@bimOZAE(N$;y%B*r@XStx$_?KN%jVOG? zJ_ae&BGMiJsoOBd^&<$66j7l4t|I5Qbyd-!;_L3ZjPZwc)JX=8V($9uX+BZ*2LG~z kf48eFV}yscr7{}KUn&p1`|#4!D5`*Y>jw zY-)eowSC^X=YDzTe(pJ+d;PiF-9(_g{;xZ+zk&7-tW=9sR_M;}LAgs*qS6FO(h#Mn z3ke}4s5Vth*pgyMOiCdM>~7V0Lk!ska*n7?H;CG-Ni&Y>g!gTPJb+)hgk*te;*7Ie z*W?-Q3)VGRvp4ppg!gWKS#Q;KUx1n6S1#a(FhznbPp}%KW^*K!N*fU)o=)kLPbeA% zQ<_LdrZv-ZIUb8~^_@g!I-WA^b4-iH7fk8ObwkrlJJXB|OPS)8bUG2mvDJbLfgjyD z4$57!!~yzP=&ZIA!_o+uu}02vH^Dt&@`(&Rz!gV20k2GGrgU-i+{9RrGK5UWA%Sl{ z9(yDFuC6gXtT9zf29g;)awR;eEf~>6I-`cqq-QfpEoEroDI=rCGs*Co^QV6rzI=RW zXec~99GFVSjQI%D!b8J>bMH=s4Qx=RGx6{>Ep;t?A$}#S#|>>@E)tyuK=klC6BmwM zj7RG*8JxRrI+RE>s?8a!6};*~_k18$$X0XPTF=_>TF>empZV7JZZ`Mj#l9VAB2g68 zQrUI7GYOVY04|M$s7fG$Xvn4tAyKu3B(+7gWAvzw8zkgVJv^3VwIxep6r#x$a;mLd zcZ1%PB?~mv3_!M-uByM|h@$P{#Mq)AOf0R#;sbmofw6RQE)6)2GmJP>oJ^;*hW!-5 z%=hyl0DqS_iDB(o{r)YH87t84LyremuO*^XmPtse_W&_)dn=`vFyAs&>9Sy0Axy}U z@Z1daBS9t0^g}vN=gETYJu**K;ReLkj5Tx4UY)c4c^@hdEW;VnSO?FnB!syvU2juu z|J$RFs4Bu}Yb8dz^%C^Tn(4W95XDMm=w<1uG>a(1NX0?{+ATc6?yAneL~`z`UjJ0> zjqgG-f*^2AE_Oqb2O_BeY<~dL>CHeqbuE&JtAR@w&T>n`ej~lXYUoZ3l)Gday!!dz zGF^hORB3%4vmUV3hd__|xbg=Ks>a`PxMOwTY5M+-=)jg&J#v*AaNCFkL4unL=#Nv;ha2j!RQ#8A~&>dFpz~h%A&V4qTKPXQrLc ztD91cMUs%`2`yzhm6XD(y4f7pl}HNu7@BIfDfKuh3cNzpHElL%!)GF9QkWpAPwSXi zfeO&3#PMA8){iY?9E5KA-$4MLvgkbg*tf6fJG9a9rLW){F8YSEXI9T=&p&z@}9_!J@)Rs7cF>uir$_Lns)`CLMchm51%d7?b-Hst;>)6hc^9(3jV`I|KXAZ zO<&{oeS;z^t~QriNo&XI2RQ$M=cmrQdbW4@pjXr5&aQix*WWL628*3RFtlv#*}r~j zV{~)RKvpcu{_PI`opWG!Zpp6O&Rfp4?whVvSC)TtFRb#Tecj|YO{0SCf%h%jpCwSD zR+d6DMlt8gUSK~w`*L7-u`JQXT-AZyrhr)?=WDDYR%)%tW{uuZvP6N& zYOII+Bup;4Av5$$^lE^|Yp~gDRxl!!=v6H`%X(o-vuPrwYL&2;&t4km3BUrp2{T&CqgI2 zXn##?dAl(YcHevT(}6n!xu4`+ebqGR$25>hyYJ4SN8W>*-h;WT1@Ez<_ZWnz`LrWx{g9uGOgV8$fHHT<*F)w#= zW^8yZ<_>@Dm!SNLHoiD# zf@N`6Lq1nW{sKFXf%tylKa%~MvcDkjF3P*})i2)z2m<6qwhKg6$Lj}#4fk#Y8*4pW zxCmq;MKPNcC7D(;3DjMR^2=(_4Njs-{O-d=CG^ncWa<5Qu<8G?CHc z*EBfYl}OCcn370G)Oc#TOoT{k>_;dt5E)`(x+{?yh13NUX&F1rz_-gW+m2mPAR+6& z1pzo!KU;3^%J^32t9kL2twRHO@nA{ZC+#YcM)5XvOM6Ph68osM8`!cz*lm)(ME;v- zvf%{ZL-38@Zo`c-8IJQg}rZ7Ck%U|1hC3a3eP2__4)*udCR3bR$+ECyL}mzWU|s`VZ)?x5WSe diff --git a/.venv/Lib/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-311.pyc deleted file mode 100644 index ae54fe72ef30681c1d25a64070ca20d6be616a79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4006 zcma)9-)mdf9Y5#lN|r3yl4aS6-9*(Cx2dV^*eOl3Fba0#Bp!{E#%l+fhLClxv>WSJ z&b>-wp$yY?LkWf|!C*h^!5byb$csxEWTUYD2~yC5xX=+8V;J_J;y&eR-|vxprE5DQ zNB4fuukStQdp@7<`JSV%`uchar1SsTNUl2x`4?99lf6}-dmc*2CSiopG|A8irG!b$ zmXoAQ4DBO7SL+tzkVM6uoU?AI0d&Av`q>9uO(tf1ZB(dcM1FY~1&t1WGP?~(cg z2X&c$iHrw!QF)vi?sztv)8o3D%WAuT5*e2a`$8t3QVf^KE~#k+^d$8>NY7FspU-h! zyP?EcVt+o&+rZGhb5PkN3W-ogA`V#E~_L=LfSR}bY>>B zluPQL#<>!mo(Wz4cp<7|M=VuPqqmjp?dXTSyY@Dfi!*y@C>J0NC zP~big7H7e|DVFwMC~Oi~4&<#=qAQ}nua(HQY5smM=8xcgVm92BN)p@u#wlFO>|39N zkxh7*RD?N8QW5&W9nJOpCM_HHr`ui!MT#tweD~W)m&2 z7JyxDIr=U{OTya(AUu2o#Q+Fk1o0Q388o3GR-w>76M02h>1G1!VbIWi2LgPo-@mSI zjXmoRR{MhuUtrVq(DlH*;V#cMyuQlJ{X)6WIB~KfZ@3!1?7X6&VbE+;tQ<*c6;p0@yDzdK3ns?vvcd|#jjVtoBcXh z^UhbD^MY^-*A6fY)ZN|+R z4lqt%iE*^ioEMk{mMtL;*|jZl-0Ll3?SewVX=jh|QR@8hqy;z@s zFSOr)I7qKa-(PP$mA~!zhv)B}?>_pQ_gio6-7EEXuhdRnIf_!dl~M;88rfLbmTQ4A z3`=GB9p(_x7aT4^0Xf`;{BSBA2s*GgyLdG*>+m1}W^@tYI0=IZxUAlP+v5EKyKZza zT%Cn4wJ{KYj>q@K!u^E`yLWB^DNq!lAE z&~ospmOw?V1Y*tnH6@$Y+Aq;2IV1zJ{f#EE3Xjb`fMXshT85!b zh9l3FqHEEei)ke$t%$HIw#u#yjT#Dw4&U%M zAcM2#O~|^>o}O4dkx=qFe;Yc^V<(aVWV;6{;mS-UyndlNGV#nkQI#iJjtkvpY6p3` z*RsgG8Bw?uQMeH~m@IBYcCe_&=rd1uym%S%)$8+@I}T!5Dw-{J1OachMzuBR=j1c0 zBN*+}9XYI#=`JnNS3AG~Ix!+2V79xGj)(UC=m%ooXOzhhnOeYt&P!*oTWxt&y(H}F zm>HeL_06%k8-khCZvc#<5AL*~cs7LSg^~!Q?Z)M~UEFQsj@Hf-evXmQa4)T9_4u86 z&U4(b9)7Yl_aL$n*&g_6_|L;kxGB5r z6HW3G(Haj&Dauose5z;%sica%w^gR(&R`j%BJMqY8ik02Z$W9?hcPW#fLlMrG>$H4 z5RU9~JlKt%*s_|9^Hp)eK}}!HtJxG6*BikyZd+l$(Z`jPs_6@gB+_`p9c9! z)%r9&Cn$u*!{P^Q`?1sUKBbcohb_Y2M}d*UqOwpAoc;kje(dzVNoZirUMGWPmfinXKQ4xPUfm)?l~Fk`fQ>`-m8=Ms{4=N F{eSBLFgXAK diff --git a/.venv/Lib/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-311.pyc deleted file mode 100644 index 61f4b4b31da462fbd9c6a4c08ca889dc3c661a1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8389 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PSDraw.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PSDraw.cpython-311.pyc deleted file mode 100644 index eadf93462c1ef21bcaa21630f41002c6c9a3f7b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8571 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 Kyd&X{ar}P~UMr3O diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PaletteFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PaletteFile.cpython-311.pyc deleted file mode 100644 index 21ed3ecfbb922539e48ffd01ce6cf0fddd8f974d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2543 zcma)7%}*Og6rb5$e_=Zq8w?~(VnRi5NC>7yNh1^ql9nPxBn{9iuF-1ou3f`=O=j0% zkS(EzN^Zo#j)-ui9GohjN-Oo$KOpx?AaSr(LPF}H;^v4R5SR9iZH%3usx#x~_vZa( z=6%iVE4#e`LA(0bTIfB8(4SN|Y#`Hy_ih4RM`?hYOuVf zOeCHS7+~z4C_p2?!Yp7`}^rdO;V?HBayT? zQFLxBrbxl6TVN6m5=(<*hFJ&_UO^glrP4&^B}i|pGdIyo(7ZiVqZDI7Nu00hs|sK~ zK(a|z#metV7J|?H$h23XqG7gV5y7kHHA8h8CE5D3MdNHKrKCwTr8v!0gXHRw53p!n zf%W-H2^=9QS8vxx9vQ$RLjYE$j44yfoU$nGok%N{S$UsN5wT&40jnt{X-Z&r2#1FEXM7;S>DWRixVLC7-CA6R%i;IDq zvDtW3QZy+ruEoVjJQ}$9_3(FriT=L6zJSl?8IOgu1%XI`KA&e~ax|b(1s{$_0`rnG zAGj5n4yX}Lx-=&QXN9n&2JVdBx?FR;dgm4o8V2Qvss&@wx$8^awK|@UC=re4dk5uM zP>|K@z#Jk!0sGZ+K$g*l(^nq(rpNsmAv>@(kn?4~s7~(z3hg2Y=>(y%+@rzm+!cW? zIi>}%?g}3t`HO(9M84_2BM&imj-xm9nPMY~=4FTz*6KJ>i8yHnk+jgW|F^GRK&xkf zfUl08^2iN6c4fZFy4T#*DdMJE)5PxnLpdsXExLgSN?6j(L=r?fqDVR`ONwqCUsN<9 z@g*TKq8rpXIil$e-wJYEDoqhuxjHu!izvFO^2B)?bWWAz5V6wTyC?vwIvZ8PI-Vy` zp&%0-gEXzu3+t)2lGD2RFrQ1!$7T5xEKz$PH_NC{%IFK}^^IpU&u1W!n@-=B)0Z|C zIhW14s(ong1#9r?~pch{D?Ys1mCQ;KN5=~e5`t)<#rhdKq8-6qS%jD+i{){Pyvkk@b;BoN+YCE-_ zc$CPSHe0*5TD#NSsx1v&rN#A*GY#9&JDY3x9Q&>V13hTc;&ZZ8{{CF_s2Z87t7}># zrOys6s&#lzX5hcvfUmwiA%?ylV^G7TWSfYv5RHkF7nAbR?PHjV2(kfN5dEKWZ~?0Bcv3!t?mPw-gPox`eEq>rLZ4yXs4dP#lrZ6_VB)7E zia-`i*R5pD2WB3a2g`0=C)Z#B4Y?WvQe-j4#WM(ZZlH6uV+XZt)Q=t1x=}xhMh^!2 PKPK<#+~3D2NVcC`^N zyXT(nTYbueEZK+Ma{2hwch5cFJzrJbs$2ez&sQtJcHmzYC%d-^!auVEzDZ?A{Q6(P zc__$&EXIX|I4X+Fx5aG<`=}j!yDY_}gk#i^aE?0h*b#Rn+@o&vo#5Au)`IUE^~js# z+S}5o*Cr_5$B^|i&LxccWRL8XeRAE$_R%`o4_O7d9(=#NSq?*=dg$Z0+Q2)=%}V`a z8)Sgr@+Jxx5#Yyiv)uBn5kV5sx-mj-8xgvr4sAojYa(m0 z8IGYubV@O5@XyIuTw%?r17IDg-Z!r(e<46%w|(uuAY5e{qv^KepS6G52z;~=nA`}w zz5!5K;WTNP#RF)CMP)u34tO^LzKuZLMgUo8Qmlm~;z^N(0?0xEWT61EPyksf0Oq5L znPu>5O-2iVEUX_43?q<*0#vao3-fpvL@B_=#3jT=su%)PF$Ab$2vEfkKtroV779?s zFq$fc096dTQ^gR#uuAzR0apwGsu%)PF$Ab$2p|i~42mIuEEF(N9zhkuMyePBR51jo zVrD+%<4F-^h67YFY@~`IKov79=X#ifv;f$zA|XbY{eTvIsu%)PF*BN9K?qRA5I~lS zgb0{n78V*o6~kz%nAx2xh5)iK!;_jQ2dHA$NEI^+ssA341VHTE($Yxz!5A&p10A#5M zgb`FR1dxSBn3;jr^toaPP{k0SiXlK1LjYMS0wI8g0#q@xkt>D(RSW^D7y?u=1k8R= z3lgAV{WyTNPyksdfGiY177Cby;YpE&g>e8`D1a;!Ko$xxA1`5^!>o`4$ih$#APWVM zg#ySz0c4>7^YOGpQp`scLjX;seDtYeW+P5uJO{GSF33Uws#uk!qDPg50$2+Lkc9%s zLIJ8+m8DXCm4yPxLIGr<0Q0$GC2t*pKo;5sStvji!!F2DsTKh< z5u66}u@)MEEEGT%3Q)zWES2)BEEGT%3Lpywn9mi%XsQ?jR51k1@k1>Ln1%z$!cYz% z3k9fR*qthd0J2odM*s~4kc9%sLIJ8+m8DXCm4yO`QUF;fz|lO9HvkMUAH$dd;35OqY8VXw*O|{2zi0r+GQW`<0REo&A#MQp zN9H$i1HcON!`uMyZ_IDz27o^>zl9qB=9!NLF#`g%ngH{-VkT+<82Y4g=FA*w8_V$j zWDKXOXftZ^xd)g2J!mIjK;~8ho?Q^cum2i80X!5m_QjyGT{V4Klx>=Wpu?ZZ5cU1XI_W0w>6Ux~-c`dvrtyUv_QM?4_>#5HHjh#A`~ z@Xm<~?u;l)vg6e%oQ1n(7RFfa3)Q*!$m!pVXdROXI>5IY=UGEMt+EQAl&^_3{PN;f znV^O}sa!YgaV2Sl$InIMi39yH?RYAlQWMeXA4TIcO4@Ku&uDT~iyBfqmevf18co87 zomxPrqj5#kly1A>h~d{BPX)nn--IO(oN*x%i9G-L@xHN(X+=$sDXOd_B8i!F^vc*- z<%Tv9PtC|<1F83B5=v52#zwRmIX06R8yM`rG^O1n9&jAIGvZW!hz_)Y%`%)GGTZCDt}O)MRIl>VZ#Pv3f|xb;w>?Xd2B ztLS}e{zOTtxpU^$nFn1DW*&`v(SAVRe6YCrpdRikhWqrup<>{WE*&mPhYQl-Qs=h$ zAFj0QT^B^hHZ)mZ$sNqi>F%zqC+jIm{@lU5{nry;>^!D#?=Noe*CYLU@VG7=pZ_87 zd?__PlNxiEb*a55wHKuJlBa(D^w%&-AtoGUW}cY{n=zjICuY)GDzTfNf>~cI4F`#7 zRY|86dDj1KG`(AcGnt+SDU(`d#brpzR8leQYFshg>4|7E9)m+$EMeFtr=Qmh4PU-; zQ&ZAEG2D~zMK2jmD9=4bF}2Dyklh^pF9o^wk$uidXTprrTFEU@7Bj-QIp4~jjPy(4kqyodJ2$&%KG|!Y zKOeSBavj9{uUKC;uRVs*e`Z#|X0@wsekj+Gv+1(5*h!09GrwsILdGTg;Vi@TQ$Fjn zkc=a<@Px3cA=k5+cdiENs@2%LKxLB~NPZ8rdM&!}>-wx50NlJP;A%XP@oMaif#(TS z^UT84J?E8!b3W+9-hXhbp1rv`(1<*@cm#|Y+^R--_Wt$4W{sKiCv7llpWL`%e1S|& z#?5M${isZc*^CeUCZ^h4J@%~6hZ-|Arum7BDcqt3L78yAXz5%$tQYdd$y5PN6sy@!Ty zk-diB1m1#_>Rx8{fQi{aY{QwFoJ=d)8dFL=!VH^!4Ey<0{e}eQ7`zupuXo$3Yjwjh z8J|hN+Z{F}Mr(MK-{irm5-~0J|I2*IB?D%)H5>Tu>Vum3kPDuE7Eg{;6-+ z6X_{Kf@MV7kkr)mwBZI@e%Wsz>xc1JQdVvl^?Zo|UB}s?iYXMGN*i9j5W!;2Bb33- z+tfiuEynQjP>;hwnqBI!Xxy+JJ&KpHIu5O9W?1aUa1y_P%eCaHxqUs?dF%c8_t)J* zuqo>*)%mmbQXrUhWnHT^o`rDk_`NOJEhUd{;mDVs&CfiWmlWO8RrGW%*AzUxu(OV# z#h!eq7}$|LUTO+2y?+1QeEa>MW>1zHLreDir?MwX4Z(-aA2t_S57J$4=qon#W&5-J zC7*xc(g&CCU0w?5zO6;y*8IVOZx`(4+k(3k*py4>cII|M-7l298VFnEfNuVM`PV+(U#NSdyl3qz zb)nqE-S|Sh;BJMnI$U>7-8%KRL$`cNA$zpv=;d-}HSKQcd9YHle=p_Op=^7dl5w;(mHdVR2puAZ?% z>kpRI-(D}Yz6pD&KJ>_0*t)ma+^g63W*wz)N7h>kw=B*s{tTR8=waW7efJM99{w`8 z^I34G9^6$7?#jBe?$vN}*1PKR=U!XfUvRa;UJA4>UAVs|->(O@FE{9coy%i-;Na7! z-td=MXV$se5C9`N?+o4={KbV_*WJ;D(MMfN+DAJ--l_Y#eyuGJe)9gO@9VyOzn7j~ z{0GnPJh~57<^x4(pdbyDDjm<~>~}9MT+*dbQ3^qwRor#=@&c^fTZ$6Y-@@?=x$Sqy z7RGd`wJ5a~q*jifFVwf|zK)`=Lzg;>QfEQxBux?B*Ix9s>rzKi>L^GZyy-%&-NFv% z%H5cYK68b2SGeS^{lI7ald7;MR&Iq-E9ST+e$-IE`7gsv2|VW)dbLFkCnW2 z9}M0bd~kkAynk`=;@#ne;p}k9-?lXK%->b;ca`b`58WTSR~nmgH}Ycs*e8y~pXrS| zij6x~nwpoI^X>WQC)<|WKj|*E?9!Wd7n^qf*)E29zIs`s!xrlKvt4Qk{JQ{Vy=rQO zz?OW|vxXgoh8_P0q~H8Uo#3duJ)G-bvMnk3A1z<`?UcT4-{*hxbpIa){}e6sohxj9 zyRhlJE{znWk%Bbxm8&kR=JxBZwxX+zebWh6biP}=P@Bb{bvvNggilUG!l#m>2WIZX zY%P9s+Qa;_@L<`*=CjRUy4~gJnfc{8dLQ%HM6K>;1|tuE*WGB;j*m~yz!z6#d|YME zF2e~kZ!9^bvNs4r!0&wJCxL7HN-P;wZ@%$TQ)arDVIRJX5E~u+28bWc)E~2e zcbH*QuHjRaDfkqqsO2Y1z&wPHcuEqV8`Y3RETQ1TAM5AuA29RJ#FZl|`{vGGa?&ke zK`T*Q4+vssLFl0Sst_tz_f=s_;oJ6-5H48vk~I~iU3VT8+Xh95TmLJYTWnYttfon5 z=_xet)|>YfoA&_kdY!PP>+{LN+m{M8@4!CqT;0;K{KnG@g-}1+g}{2_q$t8!e!;$D x7sSSSM^OmoPA;9$g^nVQW>sirVDnN_KCBDfMWMSObgv3Q9(mdX0f!x>`)^gN`gs5V diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-311.pyc deleted file mode 100644 index 98536cd350ece4afc3ffe22bcc6d033887982cbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2157 zcmZ`)&1)M+6rb5$$+9KYscb9$h~2fDI2BD3r!;Asl+wg%+$6%7IB7vFEE~;8T}#?k zXIJ?U4w#aF2!^=DU=?!kp|~lz^w|HPS1Ig4EEEJi6yH?bQ!eS7m9>$Rbawa6%=?=6 zW`1w>muPeVLHp$I&FoJ>g#O}_ZVPkoo2WbVJ>FuPzC`s!RHo zQ6jXmlBwAix`qs3~`J@|U)Gjl_l@?8d zW_T#w#4}w*Z^yR&1Scrsr zB}Nov!F^dD>F<@10hsLr5aJHQ%m)sMkSOerA6bQG_7*`|DF^$e`k)~QU@^F;BjD`v zcq~rfoYcx&fDl=eVJv3>4Y~l%cX`^3tL&zM=sPc7yl};93l|fD&JRoHIB~^Nh9m^W z6Y_}84>Hm33fYn?S(N5oiBXNX;pMxAt=;*OF_XE6Y*<7snU<|G4o&I?)S^jvXXzCR zh92cw35mNYWL<2zV$sUEVUy_;TzPor(aF%BKbSwK+^{IK6v_xK%Ehv!-BcFo9XnGn z%S1_<`En7=sIqLAiC!)$$*(Scqg?-RZf;IFeOg{Nv-WL`QDyG5yl~^PVsn9-E9=TF zYTQy%`c1{sZTdk;%jBVQEM@6(>Qoo-ONDYyH%^xBLi}cl8kJaA!b|I<$D4vktv`UQ zq1NEg`tADQOy_NdBI|vRA`c@Q*Bha6Cp2CUjW;8Q))yY79;Rx;jmVS}nX2MeI8wb< z)vDLl&ulC_3s2O;6V2F6b^g!TWG&N(%{Z}{dSs>*KU|YGbKCfbd^OyZk5(loG}#Qt zYt#ECM`x=^Co)}+OgE#WwF}RpllACi^XPGp+Zq|KO6vp7kx8$MPt?BNCO_+q$y2|L z{hq9kT&NFU1WA7to;^qf9jIXr7x?hrCJYYNF#7`V=~t#-(LU$R)!AF~2P+Lw?c4Tx zUg0r#4Kz45yvA|wVIMCh0xS+ZSI~=a8+p)UykOZVkOXEE&{^EI%-#X&h6<)eRBDjQ z$blp6vOnVbDIja886I@PavKHuXIn#uH$Scq&34{ae0(#vW&CJtUw4k3YsAkx@$=Q> z`a*MT^6}xvM__oR3Qs!>mYzAA28WAKRQy-O!ax#zZb(%Ptw>eX9Z-3#l%arBH=?TF zm9@gYB$zc>QM27xr&kHJGE6V=N?|hhbqvU_$n)>z$N1ggk#QJUSAnegPcs@@yVM+e zuP(*g(r{oNx6y0#L@)p`{}1V`!D`KK|rL1D$oy**ZGgLZh5N WT07#5op_RMpfe6SQ}4cB;Qs-r_wZi; diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PcfFontFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PcfFontFile.cpython-311.pyc deleted file mode 100644 index d884ce656c5f70f1f985309a012070ec8e6e5225..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12293 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 aCm9XGnle47GCIp2t~J}Qza`Z^<^2s3w*F!O diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-311.pyc deleted file mode 100644 index 470c0f3b8ec0ad899b7e98448adf92e98acd378a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2147 zcma(SOK2NMbY^$;vm{HFKaE3UWTiA!5<7MZbsI|3Mrj-;Mlo^IkFv0=H6yc*ewke* zw&H*&DOG}?Y6)0@7Tl7iX>-Y`{JF*m1hjp3)C#E!`4b;@*^GD0)qOhH%Ys zG<#W|*5+hgGw4WOO+;Oh^r0DTQDwFVX3~XuEjyZDvRsOqOwzo;f?yYam_7ig zgx0-1)kt-`8mSyH2M_+@J!nb?p8y9XIcmXH3|cOsD1iw|2m~iYA|xc@A`Zw82XTT+ z+*bE919%85$IR3RZ=WlM>`$1fxygS zqmS@*%IfyuwdDxD3-tSK-ZgA&Wj_~L-oe#-h;U6Xpk7+AEOefSJO9tEV&|zMsDqn5 zEv@`!B6a5V4z8n$;({C1Dd&~Z6IC53tnw| zfLl&{K;hYJ1M!pYl$es{!4FFNMFjDhj59yT6oXKZVKv+gbP8gx{R08ecoa1rChZH}*)o0{7^q&lQLGdjNbu}k z54}{5Jr3=uCD%fcdMIN0A`K_52YVHkH#OV=ENzpf6DAT4GKMF_^}>%Q5-za zYmxN>iaIT~qGZ(!RTQgB;odBy`P!!_mkMfni{nh?SVlFhQ1h!0swbJ2=lz)NAlH0a YoU^MoR399D;9Nr!bu?kNhVA%&0j%ojQ2+n{ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PngImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PngImagePlugin.cpython-311.pyc deleted file mode 100644 index 647d2aaf217a285ce5d884b3b7e0158d2ea15f5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63551 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 aGB==b0}?lo(q&d9b2}Aor<8GQmH%(3&|jVa diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-311.pyc deleted file mode 100644 index f9ffe6eb3dabc75f3e4f66b2e552246d6b7273ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15450 zcmcJ0TWlLwmS7d%Pf-#{iJ~5+o(?VREz6PZ*lk;qt;Cj<*pAbR+#E_(l4(<~C>;$V8uHv_Q*F6~*eVR^{trE3Q^=#o2OY z-84n8U0WDM*v`*X&|CP)A%|O&|7KcQ$G2d#vGyG?-1$0+dpAoldw)*vh+n%CKJ!W` zE~7e6dE1{OvX_?3{!l0!@kavT5I+Xrs?l@Lfh;JmO45$b`DaAPd>rK+nJw zMpWTf@iW}l8)SJM6z~{LW{Xv#dnEddq<-tv2}yJE?DyZ0=n;t?mo$)Y+-rV;^EBQg zzk20YpZw~VUkBvZ0I74l8>^60W_YBC@x^gDXAvvRMM*old5)b4+?2FaixHNWbQ~L5 z;6jpSDjW_@^*T`~)jgVKIuDMRZ)M>{!%;vNJ zUSP%Jyb)k`Pj6rUfq|LD&tY0Qtc}M^&&wa4JT!TcXE}b7Pmkw(cqVeg&#{x;J)Tn+M<*kg z;hS9uOkQV0*C)>erY8A7gzcF3PhW%e;wQ&P&vcE?&yi&t4=&6GLY?!AlHTW^o@VDG zTqE=fSOUd21Gq(H%@snUa9n6!I-G1-GdGClBdLLv#>a!J7P0w=s5$Zi(5Pty`H&-a z`b8(CJfK)=f@UaS8uWykQB7!I%WGkaY2mGdw+`5V0p5DX2(xFAEcw16NlEJQ@v~9u z_|)8daDn#(km5KbWDcocv2GejAnTSSt;VRU@Rq|Z)$7!4nxW%#1TgY}QGEt0@CB{{ z2}9K7&bX?$Tq-w`Jcj&c)XH*kbxh3}W9kT!c`jV1I2BEWbTK-nj#?=yPA_%EXc(Vn zjB5g%=ZH&4#H*21GxL&`^M_zFX*kx;NR}zzjVrKbJggZD2pXOZ&PZAqd|+CleG)y* z<7hn)I1fZ5vk%Mp2tw3VJb|4>Ij;dKKLr3*)n;G1A=;YcXQSMn(Eh%nN_g*{YuU9) zX^hnbB#vjx9n1O$miw0EoA+$XHb}5LHYwU#m83tJ6kT3;vgJ-eo3&I3Z{B%5F`O9A z+8hZB8Kh!)aN^1G{12FL+*aSVJTY21&5Y_ASt{;!aoO*sIr$cN^RkBE$7|qj5 zM?&w!RE$R6*4&}LynaS|o#yI|icx*Ho?*$=`lUD!ib^JwViMhL4pwhNzbhDBTpdB) zk_)jC!n~~@_Z{j&BBHo9MjxY7$gZ}9&miTCLh4VbPgLL5A|Y}^j>u8R*y4lDJZ>ke zDe8HP^-o`68PD*!5f2c0ko6$>212u*EAVEy=$;GVYi!6935PwwFeC>;o*6`wvk!T^ zI_?#yOHv2f5VsFoX~$2~+y3AJJIrxmPSP>#beMtN!|lf`Z3JuNx=5)xes<>#M38pe zKqO}rO7l9P!W}ozdRc|gdgtoW)#Qn_vIeoNVdu?bw${Lw$yQYUI4D*$!IQ17+oV(# z^&5^lIYVIX*9bKmRqo~42f_QnRL{Nea(LyESk(_t*5TSzQ`NOQB`FmZPSjttN$;6J8ktCl`3#uz%2wNxy5NC6(J-lBgE(} z85~!I_B2z)o4JMJDnYTNzl}g|P&d`zr*6P@i&4G;(Z@i>1J5=vYDg{c@lZ9SgH(rf zts>nF={iW)!`3OnkJt)B0alPQY<+FTlw(w~xc_MR85~oAAuxtGus6ntvWPK3T*a7k zEKbc>;@Z$RkYdfH@Db-$AOAglkLzMOrcADlcSH*6GDTg@859&1(<#RbEX)S$RZvU; zV>=70FX~rGd0^Cq8E49m03!6E;u6r?~F{6eN|Mh=#hT{gNB4(IY z-BjgT(J@Xr#@j<^AXRo`kKsmtuX(t-2CgA8d$q6dQ?HbK~uVhVw2*kp_Ds^ zX)G$GW@_X5kb%@GW2%@sSZNJo$YHBu`j9%Nj~QlEaV@0R!pF-GG|YOLfoTQ4XnQ7Jei|8~JHJ2p3SiBc3T1Iv)bv%i|9*o=`Z{5oNisq$Masv45!@ zIo#Jf64l}B#K`kMK?s1oKt+4z{5P-rgN2G_L8?Vq&J(%f4|%#tg_6&NIp~)k5@5Uua=&ishghXq9^v3tME_%lSh7 zIVkDpW_j)yX6RvwNau9&R1wPv)mRc_T~_N0&$FRurBaKlWTl0Oiw?eJuqU)wQN#{Iq1 zm2^C-@vhZ)(>3jxn)bAFf5y50m(!~)&w5X+^`1!g4rO|W(w)PZ&SB9xOq#5&OIWhz zYO%IkG~<)4ZA+Yi9$CtTzPpDLhqHDUjwoxb5YFFyH}USeqbAw%%)M{Ty)W(FpKlaqgo-Bx2`v~q%Qu<{n(ut zS{fB*)0T#f#ngjr#B)sQ%qb<`%`OsPbBGd8`;uo5F+90=D%dn-I^1g5m| zTTaVXjVfEt+MIF^Q<@d^&&?@ww%#LXmQA4gK%2JO#R-k_b&^Vv(2vvXEqx4t*~niePTnOa8Nk-Wbe}faqxARsj8;b z$jXH;zn^Xyc%u1@{=ZxPo8{MKzbX4lBRbEDjxm^ZV*>sNF@9?8pnh3*+^8Od-B&O) zflZP4A)r97K{EIVW&3=R$%mV5A;?19;`6+KXmd*7a$}kjym~-; zj^3pH9F$wfhNt0I2t=fyD`Xs!whZ};pk|>d&uSPo3SGuY40$b6#Z)uq54B*@yBG^G z>1&uWc!Tg_%HeHfY8gAcO^gFXMxA7XJwA@Cd5Gxh+y$-h=2-Cr{KLkFrWr2{eR%h*bNtK z=n`B_OdZoiL1_V(7`8}pSHZmM5jIMHfi8z>VpsE)78lsmN;-S!uamOK*I44FfaD5O5Pr(c(Eg(SW z6gMxY;`Sz#CYkem2`EXj=0C_5Eb%9l`vS9}FvsR;kB@q`5nc(#e}!gvI8Q;kGutxe zhE2+1?AoXVy~Skh$~H7TYv^BV=wH2M(Bwe>ZQ@1~HHfyU(sn&>-a05IR?uKXX?lpJ!s`H68?HirxT0SeBKyPRyCN+6vFR0QTMAGQ%Pb+wRtwLoYf8MaajM2(Cr zu2MMEN?edJRc@306o|Trk>y(l*#Xfn3ZJ+Y!0q@Wz}6KKiz21gZX7mFs&LFzga{kq zFZU*(9SA<{SHSMmf_H=FnizG&zEx{XJ6kfoDD*O}Q+NVOEbiO%k{7n2hOig#C=_o` z@U9np55U|@>dw#I>Q5sD%aNi|Xp?OVjF!=rum*HdTDBoVLQJn@KOjQ%(O;Nki^Ai% za3ui82E51b;n{gV2lki;%%Lk`1}wd4{{qjVZ!vO(^$-)$GkyY$SE9J>_xOWB595#c z!3_znL#Tpd3)QkW{nL@)q6b`G9wgHJ9zIN}0UL|uI!Fn0ZRULV*n=?9{rthsLM22b zcva8Qrh86~Tu>7n4S@|AVB}V@Gf*!SN3-dWrs(*UI5q5JeyYCf!Zh zvRlL#*AF=|D_cYy&DAi-Pc1(m3`EHJiEQc_=ls{$2%JCgl99ZEFiT#8Y~yKg1|)L? z&H#fxa&#uMLY+J*+(B%D7=5}x=sL?qc=USZXJ6KbY@qz2FV+V(e>mh1M)z#vg-V1p zRKaTrEBx9-mDk*Pf9d^%CJPSHtC^~{6~~wEjCU|yHJC8}9(=AXcLGa+9k4)3Ox0-&RuHOYZ{XH!Q~Z={Z7?A?i>uWQjCtLW?3byQ{bgFW~6q?{|}bVYxr zqCcU7lbMe`xcfnJCT(lY*jhzHD1uxdYKOkH1`;I>v!<8#*Hx}?}!;dK`n58P>>8I{WgYF0v(D%okg51KMv@n zu@oO_1m9ZBNK_Cb_B&=w;jzcI@EN2ONd{BQ$W6tJj8Uni?aU9AW%-eqX=h%j#4DM@ zlCj3}D*GPB1pY&iFbv`9#T=c;1GB{_R_EiS{GVtB+%N z?W1gr!&?vBNdV7r0}}lW#%FJGw*@#3(B*)neYO5PC=@oe7F_G_b zKO`l=@btlfqf{1Nh!9x_+WkT(BI)rPGQlV(z4*_FZMxzQ&iIIwl+Dy1VMQn@iOiI= zWF90voJIQh2*;yKIxjYJZ&`Yl6{IIx{Cu=wSK&$W{}0r|{{Tqf7PW43^zIZ0Jl@Br8^rC(5$5dmat0sMl)S#oBhERcKwcC-m#(&P;hzs{ip|y1XM( z-jUF57rjr0(^bcxj-{*KN|-^2CQNwxxh37wyGdfL)t$B1!|j3!_j+Axig|eM(K%sQ z82$r@O!rO#+E#<&yD{r(N?lC5_JJq{AE9Z(>3;C;{dezOUcQ_d*|5Q#1f6wX@?xqt z)tBmfH1VvyYpuR3UEhwEKcmLs)m!CWjxI9+`+%k?grYC=6yBPCgkH z8&1L_oI-WtQrg{-ad(K04$wT31NV;#N3#v*zS4>f=in*DS$EYZ+0@L#(8`T;!$8_~ zFylH1wU;|m%;Ugn-&)&%*f#KqT5dLJ`t6A)3%?%y&1kxOSkT}YBKHQD2UF%Xd%I|F z2dfc`L^b8u|Mgi~sk6YUZjRGbxg%jFoIuh|EzHcY+)G|!Z9zTK!4;k&7LIDv&W2wEF8SmG_{kKtm-;#2m{1SQ)-X0gj-;Y+ zB=xH7jzGTqQZot%OW=Jz4j;1rOD}sS2-mxVsS^ku0+38R8}a#h9~`U@l|Jto`xr5h zZE^1+KrU9|9peTdEm~E|O=L~H9tObwCqMvaL_;(25r9)-X)vi?GuMjd+N{0$nSC!1 zecJBL*uCgvuT7jvoZ4{KEPp@A;jSboZEN6QB{1bzUL z(Ko*k4D!AiMzZ;QMK>gUKH1zNJ|wicII>*0Qe?VIUHvR(Aov;lc%<%IMSrk?Z;fU( zE|ENGjcZe*)&f6M0+U*M0MoVslLyZNlwgRi*0ya@O3>S*1qP}FGqmzxL3z#~nA%CAD;Nms_prg~7ySU0j#AmvU+i=) zWf8D_3#^1GzCnU+%KRyQu^j|$$U(sdXkayP2c(G6Y%vKvSV;!(n-tj$3Y(`;qmnJa z2|smJmv3$Bdb1+6VA~M;NKYWqH9@;C_T`ka979eM{vFhoZ-Uy{GKpzoq~4O=85Q-H zSU&kOxmM`VkBe`7l=@`ALg3;ixP6ejIm>~S6fQH55>jSK;7~m3p8dk2zJ*>1u zbP8+04EHR}c{@@$k`hmnnP}yOH7TsJO`+G9*g2q;Hx{Omik0NbTKN*Mn6X_}WEEFr zd+RF3NJLE`CvE{zv*Ue?NNZ6~N?WlgM+>6H1fs?)yStxLz}AUM{~Y%OQS-UK!PpRj z69_&*@KXSA{WqTiHcmcp|gPsBIJ^U09+(UpHg!>c$G6-;8 z5!X7|{y)T2WXX~>5Gqoxxxd4VWduLQTr-@bMonR2coO{mI);-~6gR zJ^Xfh@KRE6A(0yy_lBa%gapl13z~@JwoJzN!Ot%hYT8GlE;f!neyQ-Li=4TUQ|l8!tt4oQB6W_TpibhCW|?Ffs^VOO#$N#1x8*z z=@?xBLvgj4(ZkI^9b+iuwkygTb4sv|F%>Y}jJX)+Clq7(1mt3|{Ed|y2ZE1<-dULk zd0>Uw3LFo;O;MN>CHJN&z{}k$ zu;&JcSLo0&tK^?`@KzjrV_n2t>FDX~ zHp!Nd78^N&;1mKBU|l2Hyr6@u>*$t6&6772J#N{=Ygcq8$Y}uG~fQ<)(2Tv%N=V%FE|88 z)@WX;7Ea!6NHl=IV#m}rW$HQ6*bL8Zbri5S%KB2hj}MAvee#n~ua`N6={v!tplEPs zHM$?2zI{4zK{$h0X~({_bzfT3p3$_6n)a;ToLIOWzZK6KOdlEU8U$C`;LaG_P!P)+ zt%CDzeWE^Vt`w&49!(t0TFO2;efPBR4%`IGSQWKaD}qDnrqUA zS~yM?4Yk=S*Ya%2em^9H1eKs#X}mSMuCac2PB@WNCE3*5D^p+2rdtoJzW3zd)8kJU z#Y1n3^>2xF=hK=C8O;ST|HzDY1XtiS0A6iW(>Xsihj5m_c>+TO&dlv_In*B_H%K+) zU#?_}kywOvSe-$pi(g{>ggE{S#t4P1VvJxS=Z4ElaMf#O0sdzUE_ZRrv$$~pk`As` z!apu>8vKxbk}~D#;j}B{=N38C;JFn9MEyawFKa{X7(0!i5kU(8$vD24GmD5>NJJK) zJ;}TVZVIut(vZrf@&byi*>IA*kOKcs24|S~UwlQS@M>s@N&3=oM842= zl=~NG0*D>{5e)X)rkbYdO%Fvki&Rtbvq70}k-seE6qU~g)gbQlWT{3``DCeTQTc4g z*@Tn8_FERX(O|J<&1G40Ie{42usI>V0qGF2!9@a_QME|{xTW1}q3PG)Kb91r+)vYZ zC2seZFbEe%{~#m$QHeLM9#PStD(nn}K&Hz32a@^6VwATuZY;DN2sN3CmOo&|AGdN( z&^7c$=-@W^J({8&x3n3`E}Y3Y_O8^e-bho&GSo4VI+msEMLEti)s>;TM5=3ps={<| zRVJ^dDQ|}Iij+5-PkcXhE=~1ksD6>^-=Jy`vnC1GNIS%?OY)PZ-pNq!h}1h9#SMtw Q6KU#XhB_(cAF@~fA4B0uC;$Ke diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-311.pyc deleted file mode 100644 index 1bf2fb20b4dffc3f1a3895a42a24354f41da48eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11748 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¨y4`VMh?A|ga*34(49f$=fH zhxpr(>A6JoQy#E!C_E|hLTEZ3=AyAF;R9?F1)N9}0N=7DS-6UE91;`)GHwBn{i?zV zqOY?;UI$O&J0OeIr)2jmo+~xInr9kHuk_@Zy<5y>+R(B^JwqpTl+nMXGZ`ATC?MbK zA$T{WMtCTrV@szu>;|A%CYbKH`=J_ZA?dWC6Qr(8s_7VEv>QNrv}Cu=&7>{*M>mj(3-u5(WZkP0u(^m zYJ=89gT^jt(B{@!6aTMzwdIDWwC>{vpr5L?wsPO=>erS^nqD%$`6ctSFPYy0GhwX- zWiP;g8(3s2w$IQKm8g<-ovR`09oVjeR(sOLm88dSh$+5k2CY_QshnnsgCpoq4 z6MLPWtCJ_1N{v7bHND!d=xgwPTMdHc%*t7(=xT3lNo%Z8vQAN){U5et9T00LvCf)U z3&i5yiqcD5wD@b55VRV#3{qu|l@T(YCgB;7CBf=BWQd!8#39?p#z z=EWrAC$t=Ve#)KEfN85(8Bh}^G*%}UaMLz9%OS+!hW4E>~kR;u6 zWY#5F;U>fcc3F0kdDeED)}=DF*6#XSAy{Ll$&HG40``ZbD``#oKqL7jE2JDqI&1CC zOO)i4e4IyXO-wdO4T4|tKgXurP(PAXw}gH6N&ZO&4vk&}B&jnJUK9IAH6Vw96i`U? z553^|HLX1bY=h$^fVf)5Rv?g$oD_wRpg6#lv+xoST_zAK2NzX@h~~6~M)g#PN5|e1 z)A2}nI&rcWPnLhg>}bgRagkbgHWrj2b*ZyT{t{~CcxlT zsNzOYj066?78k@IAe&%pZssZ^#V1uboCpg1%{e{+M-O5`-9#NOyb2`xx4$909Td7D zpwRCMPI$wWIDJ~7hlP2}=EfLCxQ%{XsKOm2n50mfhzL~xZkmRR_E=A!ViNe->2QSa z@}Q*=?4tVc)r8QG`3*ui1{duR-G4~HvzCgMu3(yZ?CjZ#p)>ElD;&jylNiS&U_dIE zB8E^S$4AhL%JMKkUVx*NFogMxaB&Rg#jXJ1xMGfoA#$6o;(lbhqKk+GwF}otX#Sw0 zyAA*OK6v*La8HVf^Rs-SY_>$dLeB{AV+k{!;X`P{G=epDO1!4fQMe?(8oymW6o>>) z|6Tb&Q1?=2e*!8Jko*DuiO*pPz(jA@or~wT7~0T_sH~p+#YkBkGADECzNM+u)KY7z zb@4P<08M5dqG-RVwvZZ7Z7>|gpg^|7p5|EW>XA(uy1O>`Oyn7IUI((t_#@`;koaew&U zaQZx$??!Tm3ckHx36Jj-Z2d)Bf8N%=lku!vV(2#=D+da;eMQ?oIKY%_zNhYn^zG%g zOxqU4vOYrO!5u1qqeXh|UQ$k$e1SBbrZ;@e*~6I;@Yr1UFW$SDrI$uiqw*+NR=|Yp zUK&;pQZN|SexJR^E?HAn*^0*8Gpaea47P0%y}MJzk2uaM+H}3(bboC^*z5(Pqoljy2sXntGnpx z&bzvw`U6=8p39F+E2ia-G9Q&&(c1@U7(!zU%d@EreM2)$#|8JacGyvJuc>}lhL@k}mt+8Vs0H26E(piK1Lh3)Tng{^ zx{T!FPu-$VVD4Wa!9AJm*j-MA!AnuqD3-zK%Sg^4A=|Ar5}$z&%MuB^nl#)dH;#sR z@-oIJClkD=n98?=sx{~Dp{T;*t{sWb#YBakPaqW8aUaD!pKSc_RU?)7S0MPwmUD3k zNb1<)&{K~;&84|)-||#u3h(3=FM`TXyHmp$nVA9&wRje^eqGFl-F^Scy(>!}r9N6b zw_)<6!)vBM-V^}EM|QVBOZLO%&oiHIQ3ke~5P29?OCa;Md=_uwKE3yu{8`BbcTLOo zv;i6*yNn++&*UnfZ#-PE4HRtydD}qAzbnh<_(wAZxbQm%wm&P@=%6hAEWO4y<=G}^ z)9#RIRq>HKvc}xmLQ~i3V4WK(@??SW7a4z^@o$*yY5Es%BTE}xC9@6oz{^Xflu0&$ zv3~I)(ZCB#?`(owXaeK-6#v?%F|Id^->>z~R=!^Y_}Pqejz=cd6@lW( zRrnkUe#s(yf#fifb|jrh5X-3u)GqK-QNY&%xvCasAwls};|M$@OJO_TOcW5T)Pt){PCq?hcQysOx4T@bPPl?)_*ZwxB?)>wAB`T2D{z_DP zUi;fA20Ebmm9#-f1rf0O0i;!a4JBKk>fiEPS=|-|WYMtINz?5h6&m77(lnSGcc$rM zMen}vN#g(1W_go&pQb%qR1KZg9iRaVR0&5@v~ST+q`c{oqHq6d%adCL>Qs?Bm8VW^ qP>q<RXm2`}Ao`k!8ytsp~YU<*(SWtT=T(6{QTVJIS;uQa)0# ztjevLxh-R8h?06U+j*Osd8v(LgEtsx2K0{xD6j(UFft%e;V=UphHfx0U@V*gfd{nv zJ?~2%??_6K+pJwryyu>KpZELT=l4GEbMNW<>(-SEIQIO1EFA3*Gq;{OCHB;Bw zQ;*bZvhG4@6`_X7#*s!U?MXqcydehN z@P0Q^0+W zac$uC5EovrZ8Xym$J0CQqrXJGuh>igH=wx6*8$;d9BRkf``zH`|RnUYHQ5Ap|>(yq} zjb3r88&uCFX+%<6)GAzMwN>@u>eA$qGR-yORyV3Oxc8`=)COG3RYh&YwL)z|Z?+lk z6Bh=@#92y$U`wNE-UnPE_QhIOja zJ*wlZ&#pqfy@o4DgM81dD;SO`xG!V(J9ii|V{SSO@r2VC9KlJW z0(k|-HUCshkLpx&!#O@4G^DWrw6GrcdIOP0mMR*Y)eL!tUoNnVXqcjW&9Ugq`z~0g4qM9BZ z)pS*xR3@jRfm5Ty+DvRL6q!~>4@S;TPior`OuEcz@udgAENww%KD zPhCL0Sxx=^*=jR57xa15GWs)+dEt(`da*ZgD&=lVyW5iPwmaV1#RFFkr|Y^?-py(6 z=D4)nq{O9#b$1%pUp@Wy>Exz?Tf07R-+m(1us_|fACihYjm=kQ-kw=<-{`z?;r(r? z#=Ysry%1F1sc*Xa;@dAKH*UYxdF%Y`t*QEb>H2+;lrOh+UT?U*A?4mkcZ&zFJhfcc z2-cHv33ZKE9tG=OuJA7GS$I5gELpJ`zvY%q*N(*xE*#I43!ZgvdM|rZ?)7Q+`eg2R zAMFvwEa)N-&ya@(%T+c4Z;Hb=0seXqLZT#BbeLpWX@f_n9SUC;=R^X5i_%4TPEs9bSwg)WxtK6IC(R=CqBJMl zrVW-Guhb4WSvu$OC=DV)jLvx0EOgkIGN`1o$jgcE?2BW6O0AjB;2 zft*p(yoINKHAc#tJ?09^RVCy+iPn`WRnFQXn^(=jm5t?|b6BA_EUNB{E`)j1vTr!@ zkbDtS%^4G5mrQug)sU_<9i1_u*500rWuH=8X|8O}HSP$Db7fT4k_pGQ67USr7kFlQ zdl%qZ9=L=NZ5k-YBWiFws7007X-%0T6Gp*MoawvJuRMzoHb9kNRGA0@QItSb2`JHE zcp{{kIfQ{wdT=ZdQh;sKnlc{Ivr&{&fv~DDP>%K~#0U5gr#NQ%$>~rmxYZK1Upb1B zR5eJZnG%bjYC)ujWySJf78cW#sF?>KPzk^anTo;Gq6(Z~QBMqJOYbi?qwbvw=z&RP z=E7dqK;GoBNJLkIVOV*6`Ic^(=~FKB^eZQ|d}9IHdv$Gm@2mL~Tca1EF>UhI{=yCHqwN90io z`!&dLkC)Ff<94ENY+ZS1Un=7QcyVOmj(#sc9n*tY~shRnLw zaE7$7zL_PP&|<79dI#NlqFT()s@mgb0I3g9ZaYcloQzHw;*23)FyugJ>U6+Zmz@?d z%c$B+lAeYE=0B$PjbXB<7&HJhbLR$!?8yW6aJAnTj@A{kirL8I7_Ox$%#wo1p`Gv1` z@z7i4C}KS6>%$N!#QX1q!8F3B1qa#6s%V)OAmzuLgTcN77N}KDGbB6aoJ{TnBw5SJi3#+aC8q@{ zQ&^(GU35?yJ3Io!9D#FI5c?8aRjhGvM!%o&ZD;}GX85H$Mc}&sw;&~Y! zAVd}tBnu?$hfF^JV%oc=$|FGul{Z7rQ=(HKQ27R-rtUM+>*c({q`VzzZ%5MI!PUiU zvAoDKv#E&_6~QUqzXZmrCaO5+7<0@x&N2niD==##20yau(-?NZKURmB&Vrbx((stk z+OUY_kK>{gGwl>u36kB0BHIna-#N^l#OwzC&_faUCupvWOvjYSxS|Kb6Izec@|eh! z?~zMA8+{O>C>2SVoV9c5sah5Uxq0J{DXInnE7t^DU-jZMNnZzkA2FJ!yVlG(9twIx zyzxwO%VYR`#OSTM+s&Ngq02Sf3ZUFu9rv&&qthUQV<8-4Bgtk36U4CRvJs5kWnf=c zzAoz95ap(5)DA~tM<=1VY*EGCCO4hDU-HA19=O>TM{zS-V@^!wP``rkC>dT@9aXiZ zsyfnD=6D*D5S}|8wwn6WNO?1>NM@zj1Z!6$eIFuPs%B2iR}mg1+j(C2Zh8{EH5{GhG zi)g*X9;nW^d@6TId8tw>Y3&*gOlp3=QSSF+IX)dCzS8eMHysFZiQY#A(XvfHOynsL z!=1CW3^$%8Qz3?9Iz4LEsrq)}wi0=S2wCuq>;V(~dyskaFXO0@n=?WQvPG2FWdu8M zb;*xp1UnfPtL4s&U?<&zZ^QhNWpDHRk&GnEH5tK9szgd-CoU(2tw4Bls3l`K&4WfK z4)K0BsKq@f!ZGN$B)~0L0XHGJ1wFWPspWv5N@JZrrw}`L_;<{H?!;i9GK4c4i@+O+ zg|0Fl)T1$Ggoof>!`gO~>$Toz2zCmJz+ZP&9%MeG?J#{unMcBBEJXFrK zJ*b6MI2`g|M!pdaXtC3}2DAV7jAr^PXuJMpBCmpc8Y=Cypwiz_BI>;rapysu-5BP6 zOB)c8HsH)bwbkx@cpw5OQGVaRB@y<3v*EvrD$zaWqQk5E(qV3v1PB>+r9BiNxj0D^>B{EptY$c1ork2LD0 zi(#5hYZ{JeQQ~M`X6UA$1^4MVwzJ>Fu@5N0C`j=WSv!uE1h?gydIG++Vca=tL5N6! znHQljB7cjs2)~XcrDLV>tB3H*O585FAtMwMu5(lZX`p$02KcpWwwoC=aMfX%9||eE z{?I^bmj$GLjIQ|#4DOiR-^)Ns?@lYLoJ!B46^_Vv}H~3 zwJQ%_|A-1ldq9en#RgwDy58TM^bRE51FJxo1QT$Lt^b``Q@Sp;$0lhXFm z5VwOM&Po7rFwu$$hd3(XAtA0@En~|}H(O?UFfCPJU7uTK?wRcxz!I}hInk%=Ve3ck zZOs{J@aRs%Nwmkdq9k1Pl9|FCL^d-;@SCe5GU@qB$iX)OkSV{CVO5{6k_E7SPQ8hu zXb?0sUpf1!i#wY+MfGGLMGMNcscE*xH$@IO&rtcuf|h99Wx-6NI!k3uyU0Ma`?Vmb ztG9OHD~W*xyhBKPm84rKh7eL8RyUdxuVU+ekvS;Tnl#ZoCH+Fu{d)5 z&OG4>+O8kDF_uzxq?H{dk|A+MMygLf`Q$zgsn<8Q3-9y~);T|{6+wq#m+eQe#aoc~ zp)szM-hYi!5J}^V4uQ;@f6LOgq_mCnzMWQPS>h7qHoCPEmrF)tiV0VG%KkG@`YLnK zVmF+Bcy{~I$FM7o-tI=RD8oBiyon|Rz#=Ue2rK7=G$=f)xE5 zL{BM>`E)UN+ip|$Zo)h z{wEQ-C43k% z0fO-0_W}mwVy?Bhm}xg}Z?C>U-TNwaEhf_Z3|&I|hb-FvKZslCKHhapy?rLtFqm!_ zd^qi=f^mxX3HjG%Vc?DY3Z7$CoP`S0n||h3zb9b!hPT|007DFMSHViF9lKTxJ(E3(t(l9?aCectvc6#V@v8R9MSRK- zmU0#eN^s7ix8Q*>%SD(p>tSIuSFwXRncS%7ve3Q8E5YdRN z=#VMwbrXy5a$1Pe3aEJTl5sdaJ$LFFv1w&GRo9iS>xv(WAL3vndf@HI5grE{Tb8;~ zbz9PPTPR-qP{xS}03U3MsclMhzSTz#n&q0t#K2pMd#{kxy_I;ne1&w3%>fKf@`L!oR$k7B5!fcFV09p_p)-q7ue%ng@YBj#b`~m0G;m z?U?->r?7=BYsmcGa7zC++VT*fwBG_sK8zRr3Z-W+M+@xGY6wa%Y<^SN;ZOr0%07Y| z?C5_=bx06d8`A90BTX%h`7R_a9`oF>Qv1fm#PqfEfA~nlQN@ll9DPoL%SX9C$f&}`81e$^KV&t zIDpwi08>b~+E59fEx_O{{P1l1N&czP(Qpj!*mF3OT`=+0l5J^3I>nYo8^IJ91*P00 zHy!-*2sZz`iZrX+GgK!FbabIh8QyajN$BAW7^*7X!+y&NG-&q&QT9+@Z zx~7u^PKlM4FQiYbDtyPp9Cj{}`;Q;?*IzlGhrSI`UXe8{7g$ZqDf$r_icLt5ersu? zURxYos9HRS?;7|=4Qx!UGN`Xp*+kkYCqiQDpzcdbeKc!!&{{uBN}BejV<7J$AdZh{ z%D(i7?t`S{wh|}&d~$YkiHmJ6Da&pysm`y6(G@4p2c~BGjy|??$I!Nd*^|A7g?I`Z z(pNJ1A9j%I@1nx`s~{ytcS}*tECYN84Vmv#YPRAvXDo!caIzs&g*a<;LKHZ@E;?+k z3v2GkoF90#SMX&78S$!RX9F3VdFLALEWUHxSw2x4mqsP#jC0W-rkL5Ql)XCXx`sMo z=cC<4Xe|X^-m>9Y8J=6Ech+lqQrO3mz1%C${PS3Ea6=fIRS2yNXIMMW_UvHiMGpmt z_>3!}2Pg1N4ZgI@e`3YAoR;YtIft}ai?<~^w)(T8-J~6~sKIs}Z_S(MFP~pLza*x- z?P+g&T)N|{z3P73om}60<6z1+koFB=Gt0oEx6a*e`e65us(-lWN6-Ca;KwiiWIFlW z^FNzO4!n?Z_s8XU;0^a;S3-PiOXAQ{+jovEX*UMHcbc-Fxjd67TdL<@Pu&nLTel0H zdqqYS9t$5#!(a#smvAjUfJ$f)KkTTK9{~2vr8%FnL#G{Xt2&l96f1%WosUsRZbA+K zENr-)yF8aTcfpp8(l(#?a?N7S$Cg!60qk6V*cE9vp)Nh`CYr0wOR-6h3@D=uYkhy#W=q!Y5w z%H$6nHXK8PI0NiEF~fKZW;r_|Ml;OmD$Um`jg(4FZnr_Idc4~S82FyBCihrk9!7Zj(?z@M z$EWdc8?d`xrzzSfqZYyDHk|nM(Qu*mxY4P*5!d{G8T{jWuitO^KO5MeFOA`od-m@$ z@L|3-9_99&GzQ+l|Bjf#J2duY)^KPuhU}k?1w%R<8N4^xr$$4pKl#-9&s3O+mcWj5O)pU42ktNMPYa&V{}mDO zG=%8$Xe!*BqL}Fw#EzuUUhumsRL!%$WubhY{VfYh(*C#IU@n^q2d}(+df1fOu(We4pw}rR_ z8PB}a`n&6ETU>`7*-PyyUsu{kLt_3wyd(by2>c{dfqdv%C6sT7H>N$!i9IP#XWG*_ z@4D;s0kp)XWvMY~|7BdKL=m4Ml%~IA;U8P2PdTeZY$Yisi${J*p&#c(?LHBsy_ir; zgnpbCb^9pKV!~r0PgB(G74c5Hm@GE^l0rYui#oj`UThVU#TO~&Zi<h|8mAde7PWd;#)Hn#8+~D9r0D1 z_Y&_D#?9xN9=ESCodoF96d2K$^J_7VTTmzJj_ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-311.pyc deleted file mode 100644 index a288d613b986beca588a55087d74d7ce4cfb8994..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6676 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-311.pyc deleted file mode 100644 index 9218d095c3798689da923d4762c9a97891cb2abd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8960 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-311.pyc deleted file mode 100644 index 38c91d8b281ac0b6a0821ce5ac071e7c4d33ae63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13915 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/TarIO.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/TarIO.cpython-311.pyc deleted file mode 100644 index e606ef2958e8e47b72e4ac9202f605f08d9d507a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2860 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-311.pyc deleted file mode 100644 index 583229fa909b2520845231fc72715c9b8725e71c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101343 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/TiffTags.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/TiffTags.cpython-311.pyc deleted file mode 100644 index 0620a35756d0deff9fd249f793f4b17f39662dfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18930 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 au6aSLzOGfLwdzGJ@c*qLIllbl`Tqh$I{mT$ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/WalImageFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/WalImageFile.cpython-311.pyc deleted file mode 100644 index b5eb40e72a5061cb8d4d12aacbbdaaf15f46248c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4175 zcmbtX-EZ6073bB5C6QvONQ|ftTB0ONG8I{pl{ku3wL;VMBUt9POWJOR0F@RgTZz6# zQt_O*K!9~XPy}dN1c))TmDfl=K-Q2=dxSOA}N@k`+~e-kPK-ve4@a`i3HCeWlTAwi=S&f)VMa)M`s> zZAECRy-u0j(DlAn&gVBbH*?K)tKaC!O0LoCa{0nLIm(0i~X_|R@|fuD`udbf2;k+Xu< zGkqMpZfXGcv6QN;x4;+`%mH<by*Dpk$zAS9>q@TISGx1!d%3X% zJpq4%{qMeX#WXx?O5?4Z7JgT1oAP*5j&ulEx4F@+E-Wv}Ir0fUIuRL^>5h2{+7mc5 zLbMomQ-R@{=m9=^>uj;DG{y%$rk3#wJ)MKj141EI5k!_nMypoYvTBo^vi$?wsvSqq z>Wu7wxNsTnlja##aOT!?=1~@fYs&BRfvOlYssit>VO!~Sl?FEHsNwK~phHhbFbZLe zwu$=D9I;JYpYZM;nl_m4;@W*+i@#K5^8GjG~K0q@6(Gr}n?Ybu26CD|j zV|qQ=c`O4fn^1xUWLE_!=p|+9|JD1xb=#`Cx2;q9-B`a&Ts0q&UNO*{Ph=Q+B4C0e z>&ZNjr{<}tc)wMAK!&X=b(AL;@cggwx2p@`Q^$iMW!UQ-01U&@>>D5L%eA*PMb&DGDk~kKGti{9+6q|LX!izk?NaZ?prdqk zrFK;x$gM%AcIowt@7Asr3xz^$aZ$M1YwDYls?-XL!fS6|uIYH9zCLKxZYtfIwJWW) zn%2^lg}&6d0WhJ}05S3>vnto$0#`9w-11J1n_~%V?Ds%!6Z@wFcWigbgBil>zt273 zKjHTx`QfR;=v3j(%;VF69sjQPV_{jaC``$Z4CqHuXdrltKnN94T-MzSb_S0W{ z$1i-#FFaHpy*1=ZBfj(v8u4Y&?Yfs5I)nRcXs5XA*r|-z`R~}=w`}g=;E^1TE?#`vVm+##ey5oE1@4yPf=G;?olbAvfoQ)=ev>~1zV9dZQ zX45{>Cz%g9Jn8QO|4$o8;uAL;^p7t_kUK_@X?)t9;KGq4euMM`BX)m2&rj%=(NvyJ z)|F4>{4E%rMw{s`zzO2#aY1K~EqhjGYIi0Wx_bimj%Bx>Ss$R^x?<+7nZcslu(Uek zM6@+}fce(0vT4|G(y9?qW4Le`u(ky^w~GB$LwJzv5A?p&R&-r4=-=Y|zj*X%Yxg8s zL~0!PG;ExpCb3)r$gNXTS%5j0Fxzb)kOYkH?&bkub)9+a58uE3p!-R8_uA*bd1U+A zHT0K9{xU?@Yx{1`M=Kw$?40|w^ykW-Dmd~V#lCVs(!bvN$EmNkhx0EF!S0J!eu)gApsDMaA2w zx`Bue!&x_RtX?C zdiI!C)1m&8R9QF-4_tgox-J2}gZgo8cBt#Py1J>TYD-qk!tGG*f0bC{`fN;(V-jjL zp`+*D=J`}8G#3cOIWFe+M|{4p*BkJ7{50*QD4HZmhXeR? z1#uylK9fylGIR4{BAt$uaa*od7pv7wwJKDrY_;O8E;H37s#0lbqYcU5f`!@5SXw8O6(EwlfQow zk-eY$?Gv%R>EFRj7y(58l-ye$`BMMJ6aP7$t&k{wKuky^Z+{&f*a`I9ZTdECTK->D ChJO?Q diff --git a/.venv/Lib/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-311.pyc deleted file mode 100644 index 62c58941421b72f47e3368edc253f368604cd348..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15527 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 A#sB~S diff --git a/.venv/Lib/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-311.pyc deleted file mode 100644 index 2c5f64efde421473d70641eb2826db3b857ea450..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6808 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-311.pyc deleted file mode 100644 index 07c1c8ee88a3bef452f225f05427610ce7abfb3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2919 zcma(TTWlN0aqq>4_!P}o9Lu>-jvc0UBE=s{)i$X7Vic&dY)Otouq961rFt@Xr1y@I zMaT#dqyTLY2o(shK3aeU+|-6qAT0tk`O8N?@<|#5LL6W~KoJ!BW8i+}r=2~Dv}x6C z=XPi3c4lX1XJ+T_j~>qm0(k2m+ga*B=M56&LJJx+26-9Z>(E{F15lH(BOv5@2Q zLQ=?!Nii=aC2LO1+4Ap7fvl5UIRIIw0q z=^;#?ow%^GEFpwP$~;2Dau(nHe0~{Buw*>@GOmLLHm&gghJOLx zdSLVk7_UJf5Q3xd^Lxw`u*#PH#Y|%MY@DM$n9!MO`G;F)r&G&1p?Zo?O!9KRq$?|_ zd2++Z$`j2XsYRoN)lxon?wvF5rIy~Dn3zaSPRfggtg)_8lA4&56U(zH zgE7*pB{lT{(LPAcsVga6HOQ%=lDP(6(^Ctxb8lR|vh?dxex>KNTxnI+UN3H#_Oz18 zkfK2&VA(NdVhB(LbzGzMSbee{t4;qd{LuAMQ+$cCi;#gn0PDESIY(jY4k9SYVU*-C zmlQCc6tNvkkTDXrflC~w|7i=X5Zd==%7Lp_WP@3!DQZquS*R&X7*m`tXk;iL%&%5J zYOp&C$lAc13jZ$ph%;Eo_Tg!6W8d07uQy_D_~s11>7$sx$r&tf_F?lG`H#4vJqGuo zFVDu$pg$N)aL74ib>sh7bCciX!4~m<+QMV$Nor!-HOm*2)41C7Cf|T+aS(>BYcT&F zfMJ=NJhpG5^uQ~|;BF(dIb^}GH=mJnJh60GF3W@V{i=(Q!4h&G)?9rGJB?_c1`k7Q z9}MCPt37=l9>Fe%khlNND%w!Q*tI+W!{-J0K_$Zyc4URDxC(Jk56+F*rFYNMAZRK_ zp?JxPCJ*Iw7E0Dq`PF5O+$fTaL9l%O;su!!1*_WXK~c&Mvo{XN%pvyJQvGjr#cmd=~@Vz0QGB9kyhgXD6iXsr|tI1iL%Q75^qDdhE4lhbvU zZL%!WFjFI?3q_)p!_VIO*RA;p5Yfk>99Gb-?@(>M>5KK+cfN4l*j~T0`RQh3X6wW4 z4_m$yZQqG5;+^B2z{%>_M}e`OOe+v;2VzZktZPF~PtE?VBl^%0Z8;9N9fzBa!(E%r z8SeOl+xBn$@k zE?3JPf2ivL72N>xct1(pPTZQU&3Gdnx!10-Rbo8l9Jo!*s=whR}3@I8`GHR8OQ?mVWp=*&3$C4w&F$EZM4uyAoL#t zstlfvCtSJEdEr!340pvN(lXaY{|)!FGKKST(faUFc7b~K2Y`aK1*@|q_~?Swl;w?y zC@W8t)gLPv;nTFDY6{(8KV*oqDnMTYWJ*-g;8%d7CI?x!VkN(2xapx}Rn-kbtrVkE zYzaHalT-fS_-W5qZ__itV4q`M0o)Zhj_V#r+;|hko^HG7Wb^s0gCfo0w(AU3Y><>L zZ^hnmdaI%8^;^+ew2LIpYoW?a#}lY7*C%gXtzGRRQG#heRjxA{u7~Q^x1!r1EjVEs z5TtB)tm6;V`TER`u$5?VTW|N0xpBF1`QGTg#ru)ZFWvXHUYTmYGS%`=eHnvC`Fi}T z)o)(@>Q}Alx%Tv2%Rl$Mz(>5*L^aVBm}-G->*YAPi-wV3=2&q5Gp=v6Bd>jLG5`6r j$h#ckf)%Na4mE?v+QA<+PyOu6^%hFBQKH#zRtWwLy$6w- diff --git a/.venv/Lib/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-311.pyc deleted file mode 100644 index 4a2dbab4b8aadec1bc0d0eb714a23fca46fdfca1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4472 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e3f46628f72b9a0fec2bcfe61b0e8eb1adcc19f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2163 zcmZuy&u<$=6rOdQ#Bm$DZKQHQLZfo25m_gdDu`Pl<(FNTI9+O|smw~7@y@J0WPdR` zo7N|C;J_b%RL&egh<~OB4#+1Y4yZSya_WgUYp3jlj@P4kZ{ED`n>Rb({=B+cM$kU} z>wC{EA@rv*F52R3V7z_;gBOURKB5LK_(o9Z7YsxfXwhE?iv6O2Sn;cQG(!EwFN;G& z7k@PRO9j+Ibm?0}m)Y`93kdxR|5@voXsL^8D})#bS={%dXZUtA5~n!wupBXLjpZl` zaXTPG9uDyV9|$7GwQ_kL%#$q46P$(AA7iV1fIYQ-Fvbs==Lt5(+a})i3HV4zu^WX_ z@Ifjgk(gx+Z6sx!H0t#sm!ouGx=~P%Gt~7sBUGP3)$^DNf>G>=D99i;%}w(Y6Cwb9 zPU+pu6|bgXRPa-LkcM>h4pO^OJQjR7lK8e;!<$=MTWVF8xq?Z2Kn4lk-T|zm1j^Gs zFdgTNiG)X?u%Dm#9x zD$XoFg|dSkX!hDp>WQvQ2U^f>Dl~h~eXiRy(d_+Lv#U)mHAkiCb8SI0))H2ml4*`g zYoIe|aW9`>tpx{vnfBTP>fOEUthU`y=hAkge5%!UkT)ysK<4dgJC?5Ico?%`-f>+y z?tHGfI&Pa19k#>uG@VOnDxFy4Rp}(!NmVW4>r5?|=0PjgrBkw~RK=1g?48OHS5(Sfo8nE0sRZaP~QL{EKsArKnoyX3zM5iA#5X*+~aJv|9v4M zK|X?|nan&UJORnzA#TLuM!@8#aiXqoM%#>H7M@`4fgE72t{!%?ONs{!t2tPy)ayS8 zxYA0z+OPs!hpqV{p+J-*f&?&y|1nOOlu9}qlt|Jznc+3L&&-2I+j~y$@zLS#c5i>r zX?M0;``wc)t&Fe~DZ>F7W0I+|65|;$n9Gs!Boivc#65_(0DA_?iTN;$1mxgJ0tB+W zio;CtM$A1;(g1se`>9}aEk3LjL5ZA@1k7lz34Oz;B=S`SDo@Su=gJ99NWD+8yg$; z<|gh&o_t0Gvo|(z>!@u@HQ@|XZlAI6%!bd7op8z4W8$8|;UqSkT-|Ya$fe_$AlG++ zMb>p-kh~Aw`P<*Lu(Vj3BGp|(i!0}Q;@(B{VQochfuXkQr4kC^I6{3LCrGGI>EudI z-JvpZCdkQT`B67}y=J%#l`hM9A4YFV_h(i6OzeQEUftw7=%x#XVN46FMsbQ%_W?3K ze2H%5pFhyem-;g;qw0IVRc@VM`Mr2`x>Ubfn4*jByfmf8im@_9|L=Y{{#$wfdB;@7 F^k2n)$shm# diff --git a/.venv/Lib/site-packages/PIL/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/__main__.cpython-311.pyc deleted file mode 100644 index 98bf37265178abe419eccd56c5e903d282878385..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480 zcmY*UO=}x55FPDqV&f)-UJC)!n*(m`P(vxDhbB-PObBs9!3cyB&6;git3@Bq$EEoJ zJr>$u&<~m)<3J8!Plg^!ZiU=(s#KFhp591ro;1Vg`|4@~JYM|yoPP4>?~vRfSqO47 z^x_K$5F`gl#)JeN<j2h->$|ajWNdYAqj0vgGq2hK`a%k-I2Q3+7+|2 zZf#6)A%_-nP@&)+b8>Kf>_4JF4q>5C=%M6h5WV=)zBgM72|0E{{n17H-fzC&{N}x# zrH^dz(PcpG5_JRWkf;YxC(PRm z^LBy00{SxOKG5Bu`$6|u1ItSC+Q#TT+cEe$wVjeLCR|^DqMlzWxm-{VW!qui_*>jt zk_4LJIIb{+?K)mk4WcE(TnRMaL7mNWw-^vJh~?G=^MW{M!skv9u^nNOkQ^yhkU$ox zb_3W}Hi4SKS~D1>E^+L#3k&i%01pS#gKzH7=}$ezJ)Loj6=~7;jGVs2z82=H>s$H* zcf~I2{eXf6&o}8T2Qz^Ra=EYYAXZmD{e)4ot7ub+3__n^roHhNC zozp#AusgUHqrg1<@#3S2Y);ZMURn=SdzQC@C0EcS4aAo6Mr-@-$@A&0PpeQ=0%AAp zGYWNbpSJ*PE254A-17#M^JE9)Uadv${_S7TANJk?YM1a%P$31p4Pc}o<_|Z^L$9>q*V=F;I?Ow;GjUDi^6-fPkS0w6Xf(+po608Hfz~~E!^ct^ z4kohkbArNi-*wg)7alce`i?wodMhW$K zg1M5xjUqMY4ttxfBMjTYf#G~G9O`hD`T_17b@O?T2~bTPVU2&LlS2;F`G=t&5sus5 zRi!iWUcer5LTSin%uda$GLAdF4sZ1;h%M#M4yCQXEPi_Og1pj3UTY&SQm?hqN_156 zda9(pd@oYzg)zFJ&VMNx<^4br9{|xnWZVmx9EJvTc|L>!-SAZD`sKgSH3nWBI1yO8@`Dckwu9i`i3Yh}s)K*8JHK))bn@5_X}X zX&=WHgr=nH1EA{Tv!kmiG~b7=iwn(@se{lQ1==2;8Ffns>Oy#3z2oDGw-i``-_;Df zRlKh7;_o|`I||J^F&x3XF|g_jczF_q{Pfpy8>p#eL?cjWPCs_wTHdRrD`6&x2@WJd zIFe(&Sf2^STzPX(K(z^PwF?At(pip{jqmS1zgvk8oQe??Cg$TPnoW>#h2QJ~wqss( zDoftPiQciK^n_{XuyU$P-acl@sWhDK40LcCmRw3k!>kH(Ro;r?5(ucptX1N$7TY1E z#lua;>xN)9R@Y4q?hRV9S<5xE*&vb4=6(1V!LnJ7S!oc5^wKv)=nt6I$&_5?!!m>8 zn0&}~FbvIRZ|4d}w&w;=Z; zgpmE~3K^>?x8EoumB!z1%7>Mse*1Aky7rYu(MrfQtg9D^7V^=)a)jtTqE7ZZmj;4X d9U))~M>ix08N?Cw0y@_hW$VAKt4$@3=x-U+M}YtU diff --git a/.venv/Lib/site-packages/PIL/__pycache__/_deprecate.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/_deprecate.cpython-311.pyc deleted file mode 100644 index f441e1348888620b16b098fb43886bc42d510e72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2762 zcmcIm&1)M+6ra^fs}I|9B!9$lNjxYYw&GZp-3E#%4NaW3fz(Z#I-$10veu04jrT*H z-L)GbgIjV?OAnzm#E=+rN>kE*p-_72Q7%4+g@B=y;+sl(@~LljWlM4c?Iokp+nsqI z^WN{hnc45Vx?%|0n}2?{a5RF@?|iV|g8qx}A_p%I5J5!HkS@#$0)G!^f!P2NNl+8@ z;A~JpQAB!3fP{$jC_s8i@@{xGL;}}Qx^I^oN(*j>Vi=~a*s5t*)4M`rQkGXJvtUk^ z-%STxNhxpvS1M`_Q#3b5Xpzx^VpHOZmd)JY>Jl~fVya=|GM+XK>UJ<%)RY3%sbTNM zK&HW95-h>OK-}QGX=<*-sO>Pr4RW=D2n^l=@Q2tDjD;7!fLjkxImiM;Fa#1<3zda+ zh;mIbJ}V10ce>H+eSH|;<~F=WLQg>E*?}C9j_tEhJ7?LGVMoj8AtK>&2xw$8xE8j# z!;MxBx9fZrW0n4ldiG=*5Wpgs?lKFy%_@Q9s4r~y~KKe z^^`@HAV>a(WSAt%0kE6g6xT%K1n3PC(0lTBID|KrgokcVdnxq#Xfq2>mZ3{1r^w5dk@@T$X0R4Y=JiFuq{QDKUX zn+2A`(~3^9xq$5@)mX%~iRWnxKhvtl%P@zpshVc4VqLjyGTbQSh90B3xk3q6jW)fO zVr{P1GTA2VZ-yMcVpuj+2zM>jBAYsg7u6Mt6&of+BA518Qz{9Zb{*=S3$#mfWsvTG(ox)J*b6JAcI|0I(ayjmlWMDKV0DY zf}2GtENgUyYU!9O!Ue=az;Q!XQB!TV^JB-bRh?dD%w%pvmJK*dWZ8|~P&B78D>1m8 z)S??%RhR+0$Aa4o-rQu%A$8Mdr6Y_VgpA+Mj3d@^n~AC=yWz&Za7Eo(w74u!B5!+N zT*~DkUS{PfBUHz_V=43bY5KWc&`gKqr_5!CUzRj~-FArT==rJlFW$_5GMUY0^N_9U z=7J4=(R_9Szc+IwZ*zvc=&1P>YOLh1s`GhEwdq(9@K6@1mA`i7>bQKceKW;7ZuDTp z(%>3*&$+{(a4&sXL*W;JqrC!DOKK?Wa^WRA$?Ex^u7D^zI*rdC7V?c*yBGZjgo-S z?>L#6GzIwb2Y^q=L>e-&DLB{_Gy%t0bVN;@yd_N%5KU0YlukkC8?32m$ut5+rlOhn zpJ7>=Y^7%3wbC=BDV_|>^*mcZG;Y7@$VXwvvX3;?T8;h*s zC}Vh@&kb(*Ua%Xb2!|R@S+v;hw!5SO!h{~tddQ8MLs#b`nGn;j6A~$eG(sLSN(d7{ zD-wfl5XrN8xk*8lvq<1}B)>O;NuqEYS|IgC!-BIw-huKcQ{67_R=3`go$^MMTZbyE z7IM19n9o2KMAB9J9c2MD8G!^joZ_$OGQP#t#}`lZy#V%f%1r92ZWtIfeU~2by5onY zzUkYcOW|62g@>jUy87npjeWiPuvjeWrIK3l8@yvMsuxS@tG%+$V}dk8OFyLEp}u3) z^uXfue%q+qMw15moAS=uY*LdMQTCwSy-Gcuj{X_TLtF8W3cf=ai5TONfUz_}aY!Ou zI72Jfp9`e)CO$;D-o!5wbG`lk{&DL(u{=mD_k@v@!ug?`>vj6U+2WmZ`R+izJ3?Y& zWw>u36z3&3_iGae7+n?U0HwU9(N^1bcYM=~(u@pz=5+(N%{oF6Q#oM#Jz YY+>3(Fb{2iR-dDv@_JhQmBJAJ0Rx!xTmS$7 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/_typing.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/_typing.cpython-311.pyc deleted file mode 100644 index 3bb31bcf3a574e8dcac7e7329eef7e181cbc5f19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2149 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 diff --git a/.venv/Lib/site-packages/PIL/__pycache__/features.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/features.cpython-311.pyc deleted file mode 100644 index f7bd6bda630a197bad825f9bd4bcc581fa1526d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15266 zcmd5jZEPDycDv+~T#*z>eao^Xuf9oHl4Z*uIe%RwOSa`m@`vPnsLIKdb|urMNM*T{ zZHBxk2j5jW7_IJLHv%qK=!zugToS}+dxcxvp-FxeL4PfcZA~m7)ab$JrN5Nk2M+$z zzBju|aw+;FO|Ix@^mcaU&70YoH}l@SdHiWn+=ai{Hcht}zpCelK4R&r*ILUkOhSU&UARHGD0<jSK< z@GJwYZSXAT>-h$LJJ0crd=uZyxA3ie+gl|Q75skQ59O7BAAn~S;CH~Y8uE9*vj*}z z;aLm$UGUt(Kf`~6@4aT5sN*eTRN%npI1&L`bp<1ls1%e!(MW6*-Yr9?KBu)J+t7S) zP6${Yx=#-ccTa`jEfkqkJ@7Vs>V>K22hWZTof-{T5*4Iex)h2?f;crBitvJ{I;Bff zi-H&f!axEmWl79RYT2wP2-4LBVRsHG;mt>ynUASu;gBSS1xV(w9+nWS%fj@6T7i%k zW}?tw7Q?1m7eZmxq4!5E$u^}rv-EbW458qd6@pS+6jW>k>z)M7BrlZmD3=V@4 z?2xb`zrX|oza%NiD1ql9Emrb$lKK(#V@ryb0M7_X`dz?(KTGL5bbh@gwZ%ZBCM^_| zvZSmflw`|hQb~)sK5!SzUNa?OfAr8oi40A>1Y9{rNvx4eQIOx6VkB2C=VG>&C4m=>r2#SI$%ruyOV=(^nx&RDaM6nxga+m<>O(23&ptL zVlWgAPKSkVC&4|< zE);=6$kX|ii_UVVL*a1rvPLiAJr}tYiC&Hv)yI#G23XaheP~Q|<{DC+Q?O7LqM|f4 zrB;lPkr<6i$D;8FPkN%dhDfpY!d?!F5m;0)U`I%aRWL09n^*}C)jA)WQ|($CsujAX zT7)YxWDfjB?%``k4@{nm!3vucL|&NZ=Hs#8^yH{;MVbjmM!05;Q7I_Uz)0pBtK#uwZH~9-3SfB8!v5q3Ow3ND{gh zf-{$3ABauDy4$HwU95ZIs_G^aHl_7YY=w?h!+-2O087+{k7B(y=VV7c#Ed7f=8!!B zh|AV>Pwi^O8`0}gnXP|NzGbytDQ|lHxus*vM>iOUt!kYuU)h&t>lC(5X6rKEie>2! z>#l|kindkdK*n3S9AA#FyQ()R3lACaQd)wry0P!D^^?OkNI!JK&cG$P(P%^{z9n1(5^qvc zc9B!CJ(w3!%)-;KIAMt!Vbjv5Q~x@Kine z_Zd9A12Vf2>llC~>USQ>UAyW?yEw(gA@5ZZb~H2X16TRY1FN&Qt+(QG#olzqUZrC1 z?O57%P;niUnS;LpO4P#=?B<`q$h|y+??%AMgbvZa!QOxtLSHkzEq$ba9!reKOK zi9H3IV;_gKamxyZ!(1%BfSV6YoxV9~JD7=aaSN%yR(nXRbHJ`ISAg8gXW#<4^-)=p z{(>XwuoOqGPL=uD%zsB z7qAY)f2T|@pqlI_`^eHqd2F+{soTViQO5BsQu3^tM1-?KL z>9S}#ab*fh?c@8raIq>JP}yZWkx;@X(pv|Ed5Pp{(XT{?c>;aLgXb!?R#TQlD3 zKTmx>wK|^mHYwhwwOxw0^`3XfUGI)tC)3{jig*7VTJau`*#q}oV<5Eik8oG{)6BHADnt&u>W-5=+MZhk?qcAkDPlkn_EV5$IteSj-Bp1J2-muB`iX7k6J>C&i0)d zQQczjm3f2tjdG3Pv9m+{LjyyqcUBBdhxkw-me!jSeP@sLpPQIaeHVh_>~uVl$iqY3 zUDY}=Jk)>k^x*OFb7%WcsZ}5!P??wlBg1sGutGWM9#j|_={r7n=3L+CxLS@z7vYt7 zFd`MAvjqLcqy3|S614=48B@VXXkKMWaz1`VbxC3{5?h!eh7Jb5Sas+hrLso1)lyTZ z$ZM`q)p})S`k@QWA&)%*b;BO}N6}(n6{1xn#T42_csvqW3&f1gbZoLE3(AS*#B3qa zEGG;c&UA|)Or2&qu}jE&dbpT9j!9)k9vsXH#E)4R>6R1wx9vR82g?bhOqP@X-lSXU zr|YNHt_<|Yh_5HxPQYXnk7Q44XjR#CrhB4Q#puYFlRpWcp?ewiRV&ySL_dr$GBvAb zYYG@S&uQ{!8z6{ya2Fd8Y)3#WCyty>MviuCq7%JNZ+0g(o1^|>RH|5^4 zT9bA)Dz3&HV?8Kj)%yP~uzp*xY;F3_E-i#IBw=JXM^lGC2{0>PVC z0Hj@e6rj!Q(WVAOayH&X+fC<8JwgjiOJHU77;%y5I0*p34WfK zCHQ&Q5QWxJ5WYo4t#+jX#tSQN{eUrxdbkL&!RgMP`0JuOL7#5^>V#7km@9~}QlB_3 z5}eQ86Oikk*a1QVWkCK-L+-ku7!_FFIiZk=d4v!*jDucGN;#_tvfMPkWmcZ?nucV}W0G)InVLZd-jJ z?QMl4mCUxTGwy36a`~>cIRIL`6O@@})6BC9^DHDXF5mLr&HMbbnk+$KAd+)kjz7fb zFcZON@E;oo0NmlhYnv>0)UVE^y={uOO=jCn+>y@&Chllhy`1*8E8cdQZO^#8%lc*n z#Ipgn60#Y+3kkDofjRGI5mT`7tmSWG*^>OL5_28%)Lf!`UBnrR`bmFAO4B1P` zC)nLPja$xGCl`$H+CHRZ>u%~X~wTGewp!S3!1fsn`YV+rcGwrGA_^3NwPY} zRckaZJ@gEnBDWO!VNWf~neV|uH6N7VqLN&M;a+6~7bM7hW=gchyyTXQGI(Ch&S1)P zw|x;e0TRsPPg4@mF#>N%QibQd0t_bq?3TOZ#@qO!bq&(+%$@7j@&r~6!Q3;rqRa1@ zEotHHIfLU`UfH84JgQGX$-&d#wdAM`P%ryaR#ST{7*4-J8`lFSYQ@JUk3L^wnnkDa zO$#*deAIWCY9L>bV9IqHxtGZNiw&k;xlFiO3Xg0rzrSX#%eM1Wb)P&Mr4n8P=;5Nr zNUeE|RQ@wxUApKqO3ZuHQ}xU9ziu^ar}#?k7abSg3*7lR@mOI}HVKszJrw$qh@bLw z%ARC+pKkoGmf8(misH-6Ba(6?9k1K?@}vU|!cfn?Ka&T*3dw(De%?i9u(fVnoIebON0Wn#flcbHbV1TQYFxCo!)LEzZFKNA?3{f z%B0gwCFM%GUUwz!{I(>lBfdWA0#0BOpaQ4t*SDKiLqpQWZ%>va?PMRbgKUIegwsk>o}@eJ$yTP;@NB#(BumY0!}m8z-^ihvdV)4263lf5 zs1^F5pI+ms0z`Cn@uG4oeG?yXqg=BSjfU@RJq_My*JNni09;akitflg)~QM6`| z@K`FXPoUELR8-oYK&9oWsI)(UN_Izl>=*e9shDOx@a1Mb=`&L^zZIKLQ)@+6`wD&i zyLc2L$Dxj(86APJoPBAQMJ9-drq8q`P4i7pg@18g`BiB^ZZ;m7 zL4Q+jCK%zS1$czRa3y*T&eJNmr-$?XHRk}q1 zU0}|GTOgjn&GfjgE~A)y3LMie1Q!LaX_KPc#Ki>oq9~Bi&-7qLm!p-94uC6tk{U2edawZ2nMnc8{3?KLh3E&)1~0y}d@Pn{iv3{(kK$M|zYqvL~T;T@GVwdB~@!NKvDP7m&eoN~-@4iAlw4-Xz4 z8N)2_*#hSiya$Ds^YD@=!xwIxT=Rh^XJqColuRL-154mu6yCpum>z=J2N#57T|)L@ zL}T!B5?+oVPQ|IygQJ+i`4OV`QUJ=(fhpmcfQw1ae|q%z&WWMZn2p{}ssnPzhmIYC z_aLHe!P`~N-w*euqCggTFwBj^F&AqHh|z4i;N<*g@NP4d&~}S?0oFc`xU-1sgWFBc z{~~Z*REo|-!vWH1k;gKRer?%B?ov6Zf`hCf;MkciGf*4qMUS^Vka&)wiOK0nK5x%c zZ_=PWRPyKvMWb)L6&58lv>S-1^p*S@_J<{h=7flFWkEcWr~|JK+#2&7-HfsT9ED?e zz4dGOgWL6v6A*6)KkU8r%6t1h*r&bcLvl8MNOwc4crf}LjTQ;F?m5Ea?xNZ?S4}eh zfHn;n;tZl$I=P25m$1STO}O+ufs0=1OgM8d32R43N21Eez?%+z`xf|wXAsR3=)ey? z*srEkCb}SiZ+r~)OO-`91sk_&*Zl9nm_hue67FM~M?I+%XamRkt1;ECZCbkjR45XX zR2$h##1M23;qct6(|!^*tgfPKfZ;l+2PPez?sWY z8T>F}>s9GRaRMu3-B>~JN}(B*mPFuoO0_KR#!)jSQME!^r9=2x5rG&6W4Q6)zG@2E zO{hcXWARhK`4#-f_SlGta2v(CmR?==lwH5LY<<9#Ts!&t@U`KkVMs3fS1V+uKF!oC zOg$vlnG)IAdh_UwQ}BRz>nJ#?rI{XuL65cdnz|dW-mB@lTho=U*{Rg*l$lCWW0zdn zvUWzPY`<68b+@uBUAa@K+$lSELA+y?nL}yjkir~-M5elJ?UglgO;oBo@KWm;0+yZY zY^m(&Ty@^7_1~@ar)xWuTDYd|gm}AGX7{Jr{R+Du5)h%mqP_m+JI!x*%T0%G56RAN zLi~6}W=^J=lL~VZ66+4Bxs;A56*4BM?6xlbNA3Go&y>kSN}P3_JSa*$-a$XzFKEzdZMgZ>772m9Al#9fg=F z^=;U!Hv1P8fZrn6K=3=3vN<#CSYEXWBV( zM(HxMJomdM%3Zcn`NqNP2REpil0iDNja%-63&WN8_fyNMb^rc5-n9RO;y)q#S~C@X zxnfVI)-UgPHeLJd3gG#cudY{aT^;zr$c>Q|8sAfy#@1U6a^wCLPo|<~_0ZjlcDbVc zL2HM$5#HJLkNf{&|Hr+5f9My7ASc~%LIK!%LTNqm*}l82XI4ftZF}U({*}>{(K~)1 z2{iWo@W{%MO#L1hm#UovtkUcCowv@U>vt;kJ6A24t@W!%GTZ9c>eqtsUw^9!VR~El zYTqB$eN`*M>I-Z0x6j<6Keo!gfwXTx@eM!%;sd=je5XS89ZvfWE55^!fcOB$rFFGN zZu$mPau1~41B!b95)g|_@qI__7gW8iZM}+9syaU$Pgm_$s&)hCR&Tu#y;r^CZuO3I zb(d1z1sq+{M!*~J6N#0wjJtZ}mFpw-+}vF^w^osMw<_*dnZyTWH9xk!#iq*|l`^>F ztu1N$0s%})i& zO%OABU1!?2L-Fm9eLJ+e1;uRI7f^fw*%x?1F-~Fkz4G?EITm2h7-n~%mR_(hLa@Pp~Pwg zXgS%O+lILo4Fl~gn=$4H#^^X)_zC;ls%IvKag?vY`E+$%LWBt$+1yhMZ*t^%%I0j zAKIYIpn;)#Hz+dzSJv$r*Z|$&jM}t@iz(0j3w keBklYWgCEbKO#{zA8ImROKU0HJzyJUM diff --git a/.venv/Lib/site-packages/PIL/__pycache__/report.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/report.cpython-311.pyc deleted file mode 100644 index 3b09234aa2bc39ec9587676d8a03af0857fdb0c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420 zcmY*WJxc>Y5S`5>CPY*C1B64cNTFUVL_{n!sDTiK7=*BJT(Wy%$=&U-A5jazA0g;3 zP(*)B1Pe(Ou#j{@x>W8GEi$~Fd2e?H-muT5QV~q-ecy-7)GsUk!|5>$0lb>?Hw9#=3FZ96$}$=)2T8(Jpcqf&#CDmxe99u0 zg#5(tRjJdI3q^?^auEkgHpJJHNrl8z z5E{F&mO%$M=(XxbToYX7eI3(8QQTCTFdgIS+0iAw*zr6MS1N9khw3U26nho-v{l2( zKKMP&@PH-*TxT6DnWCF%(Cr63D)D)(zAdQryOrL|3I{PKI--YS#kjG{$s?0~9E8v( ftPdA4hPB}$#*n|uKW+@ceFyggTtns%_H%v#;*55f diff --git a/.venv/Lib/site-packages/PIL/_binary.py b/.venv/Lib/site-packages/PIL/_binary.py deleted file mode 100644 index 4594ccc..0000000 --- a/.venv/Lib/site-packages/PIL/_binary.py +++ /dev/null @@ -1,112 +0,0 @@ -# -# The Python Imaging Library. -# $Id$ -# -# Binary input/output support routines. -# -# Copyright (c) 1997-2003 by Secret Labs AB -# Copyright (c) 1995-2003 by Fredrik Lundh -# Copyright (c) 2012 by Brian Crowell -# -# See the README file for information on usage and redistribution. -# - - -"""Binary input/output support routines.""" -from __future__ import annotations - -from struct import pack, unpack_from - - -def i8(c: bytes) -> int: - return c[0] - - -def o8(i: int) -> bytes: - return bytes((i & 255,)) - - -# Input, le = little endian, be = big endian -def i16le(c: bytes, o: int = 0) -> int: - """ - Converts a 2-bytes (16 bits) string to an unsigned integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(" int: - """ - Converts a 2-bytes (16 bits) string to a signed integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(" int: - """ - Converts a 2-bytes (16 bits) string to a signed integer, big endian. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(">h", c, o)[0] - - -def i32le(c: bytes, o: int = 0) -> int: - """ - Converts a 4-bytes (32 bits) string to an unsigned integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(" int: - """ - Converts a 4-bytes (32 bits) string to a signed integer. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(" int: - """ - Converts a 4-bytes (32 bits) string to a signed integer, big endian. - - :param c: string containing bytes to convert - :param o: offset of bytes to convert in string - """ - return unpack_from(">i", c, o)[0] - - -def i16be(c: bytes, o: int = 0) -> int: - return unpack_from(">H", c, o)[0] - - -def i32be(c: bytes, o: int = 0) -> int: - return unpack_from(">I", c, o)[0] - - -# Output, le = little endian, be = big endian -def o16le(i: int) -> bytes: - return pack(" bytes: - return pack(" bytes: - return pack(">H", i) - - -def o32be(i: int) -> bytes: - return pack(">I", i) diff --git a/.venv/Lib/site-packages/PIL/_deprecate.py b/.venv/Lib/site-packages/PIL/_deprecate.py deleted file mode 100644 index 33a0e07..0000000 --- a/.venv/Lib/site-packages/PIL/_deprecate.py +++ /dev/null @@ -1,71 +0,0 @@ -from __future__ import annotations - -import warnings - -from . import __version__ - - -def deprecate( - deprecated: str, - when: int | None, - replacement: str | None = None, - *, - action: str | None = None, - plural: bool = False, -) -> None: - """ - Deprecations helper. - - :param deprecated: Name of thing to be deprecated. - :param when: Pillow major version to be removed in. - :param replacement: Name of replacement. - :param action: Instead of "replacement", give a custom call to action - e.g. "Upgrade to new thing". - :param plural: if the deprecated thing is plural, needing "are" instead of "is". - - Usually of the form: - - "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd). - Use [replacement] instead." - - You can leave out the replacement sentence: - - "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd)" - - Or with another call to action: - - "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd). - [action]." - """ - - is_ = "are" if plural else "is" - - if when is None: - removed = "a future version" - elif when <= int(__version__.split(".")[0]): - msg = f"{deprecated} {is_} deprecated and should be removed." - raise RuntimeError(msg) - elif when == 11: - removed = "Pillow 11 (2024-10-15)" - elif when == 12: - removed = "Pillow 12 (2025-10-15)" - else: - msg = f"Unknown removal version: {when}. Update {__name__}?" - raise ValueError(msg) - - if replacement and action: - msg = "Use only one of 'replacement' and 'action'" - raise ValueError(msg) - - if replacement: - action = f". Use {replacement} instead." - elif action: - action = f". {action.rstrip('.')}." - else: - action = "" - - warnings.warn( - f"{deprecated} {is_} deprecated and will be removed in {removed}{action}", - DeprecationWarning, - stacklevel=3, - ) diff --git a/.venv/Lib/site-packages/PIL/_imaging.cp311-win_amd64.pyd b/.venv/Lib/site-packages/PIL/_imaging.cp311-win_amd64.pyd deleted file mode 100644 index e2d2ad81fc0076ac0453cc8338c18a3be7af57c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2341888 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%0AmeY){; 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%0D|zGLRn7 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 %q8{TYtO3a!KYg2H5Meur#*soDQ1IIASPhu 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

M2~O9y}dIy+as0rB|8i~1W+9Pt|h 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
=9Lv#bNLxq<(b z_+_BiSyU-jfT{u;4poHQB_VbjqinzcC8od|#0U;a!%wi>P%<{4eT9YysFq0nb8C_~ z&3pNXltJ|NGtNE@d8h$7mwL8opo7{AonZ}W;;xuuaog^~U%CGhEGg7#s?$(w;raE*SAbcjv!<&#MXTzL(2O@{MKguu(}25jCkdr~E9 zZZoDNr(eU}*B2Ye`AHWvLJ^S2PC`wgP|@Y;0k(}^q)n)dali5{*k^#C#sF2zNDs2i zt#NH2G(paB2OnJxNviw`a5k!TwghfBxe`X**TQfDn&r7as-j9a z&&)?o=9SuCG3wzAP;m9w+tXc>Q8Y)i<- zXBvuCxFaBZ#kyQ+$oJ8D#~9&+(G_|BY!Dg76KN2GoxfLL@u)4 z7xgU|Z>+vW>KvPKYJ~iSN5DnQb|EW9<+9&&8){aMJ5!d_f!Oq z=)83tR-3d&`IK{H=mWaB_Yxl`=DO3qQ=krA!dn6CF*2X@&y2#pP@D{erz4vnjX9_P zJg7Op`vkfgY&;3yDV99SS4ip4W09u5x25uk?V~P|n9E|cF02iUv{d?nbQgJ@5^p|l z7U})}q(u>#n-PbcKCOEwhCv4Qj-A$`eD%;Km2Qt@Q8Eqj(A$^jl}a|i*}bHM6a z`u?n51yatjAJc1TS)5(haYeb0kbIoU0By?*Jvr@rMec9U+=K=QeU7_FNv-l~6}`#d zpqsta?_;r%A-69&W89BT2Vz?gfz}Xs*F`*9lR78;=sVKdwH~dlDbm^rzAL3Z9MAtR|>Bog;&WWP)0&2_lvT z(fSLTAl%#HlSmkUGU>kGz0Ih8=E=0%6UcnP;2;F zMP#2WQkEA>k$dhFql7JrRVJ11{im=vWJ|*wp=5DJ&>@~Vidg%^87WL+%adZ9XcsM$ zBs3r^#GBqox;=?ECEoJBSR$<_zSmCiJ2Dc(S`BM-ZwthfoVe204^f`)-saDmRF~5& zF+!O|hFH!9$uVe_)1=K4F%mlSZ9Y@vg8h~YN^&l6K|WZbMKArG_@3_-n671t=%o9^ z1U+hZ_K63IK+&T0rF?see6YX72caBkMBs;>!bKQ_t|7TjB2!M=^4n_W510)0J{t-rVD}( zzvUT}hBSx~ZNBqSE80jpIk#x@PV$Y^NXR#zjuz#c5Ok%apl!fUwGRy=n zmF5X`2=@t~VE#*(SgVJ4usAP4R5L-#-M76vTUs;MRh`O$GPHjQDNx82&yF(ET zvO#C}FJM(@GLmG5aNa&)gpp^AZ7gs2$S~i#%o(hL?GQ(Y;rw;DPRjQhlU+iIFny<; z{x=t^uDk|pzgz+!ood7zdg%0Ddc7IUy!aPbvV(KZ~(f=DAee=O|dme3N`#<0=;Z+ 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

ot+q zq2RBUqKhSkY5hEkF75R2pjM3EeE5%_AwCJ2Pm(!NQA8tjK~+g=gN;Kor7#e1!6rA< z?E5jv8B8a0{*S~?JH18$w^O63J{KU*wi!JN7UqQ!vowEW!r3Fj&`v~D+TCW%Y%|sa zUoWL;_{n2$Bg~sXVSFH7dn_=U;cWqODm-*ylo0T6%4*`@9kdbZ;odnTFW*XZ3C zXiRmt(Y}(XKenst)J1fPb>-8=PO&DHl9c|Gx`BPW*fsz8BRXXE2pMz<8aOshj4(Pj z4rJc}X%lqI7#q!^YFs3$XVvr!hmEJk=~-EKOhh{{B{p`+$euaB6)GIBL*vjJjSm|q z9goiD0lm3ExYqVp3l!^~YrDrzw-VyU>D~ff7=<|7J*8J}DMZx(ndd^_*k=A3$ddp% zwj%!o0X-&^2Oc=u4Ufd$`^wuh5pu~=K_YhUVDAl~KGG(6@&tbS5v~*ehTKb0vY!&E zp0NnyQTR`(hirn=lKzJPlh}82>v;hiRj1L2VuNeN;c|7DJMmg{j2pY`;})Z(Y_}=Z zlWxC>WsEA--Cs7782=8&9^&M+O0tew(~6VK1Y#NsmTA$jD^)LSA7f3!byKMfviohfz)?EeW4q+ZAZOczM-DbQ@G0sbrd`G=H+YY zBJ)(>{VE%KonP37KtVdfcj%Dh75d$zJ|9wt$sWVDTuHGM^3$30$o|r`H3ekR@wubB zNf+N8!oXD#MAo^imH*bv+mbV&-q8Xl$pCI=G^;2v2Exvi(H}DQcb_6R3+Sbq?*p$_PaYq zJEWQWQ=L@UfWW=yBw#3ZxMpOB%X&-S$LlbgXMMZe<*0_RtEU$H#yT8ThfCX1e-j;^ zXFGgDd4Fq1_V-;Pn9jcYjzXV`Z&5!Tx+Qz*_!u7LH25A+Dy4qqGpw9ra%{z`^9V|M*8Vhs)e6SAlUg9KvUCRI z1nYat$=}DU$0nB_dph{w5`I1#!+|HCKta!Enj$j@BS?GxiuTZmnp1L z+0VfN@ep$Mzs5#J1~of_d+(mYCB9(Jz)$y?l(bdW+754UdgUamsmaN|K#T{e^7Fm{ zF%}3)D~9Z%A%5Lx7MySK>rBpnEsPK$+)Os6$UQA$c8Tn_#J&^R`|qG!O>pCP-Zs2X zvwE$}K9#BK2xb^yT_1>u{T2NYQf`otGsayQ*Ot#6vmgSsH@S0%0C5urGh*SK1E>X9 zT0jb-7Lsp`f~6wcl*7|q;>Ufm%vB+Ld&b_cXKM1_IL>`z_aF;e$?jn*5;ta}&zReAR4iVi-C41ohO^tpDN;F7 zkK@%hwPC}VX~Bo@1yNExYUpTmE|_jdrv}$MkIr-Y_qE&cdHRjw_|#}*P(H4@*-xA% z$~$Y+vHNYJ=?$-~x88jyEC}R~WZN9>7_x=eVAU#%m&C>ezsm~aUy&ej8~n`3~YqnIt>?-l%&tPFzu zqn(}4!!|Jdv2eG~oxwlB4-ggOcdpP7!XR;q?Cwc9j?j){Y*3+fL#*NV$U3auEvGKl z@Wd6$IsQl5c^5l?Im1M8>T?FaCVRWvn{@Z2@Z|OFj$w#KB&l%rX=d=rjy?nVDHS`e z{VR;aq?Z;P*CVtBJTie-KF&olb{20ryKPdM45Kkh$78Ru<)9lF5`CkKQ`!ZtNGDj4 ziD{c%+fK8QFP9{N(VablsQl+l=+-6MxiWEB7Wo0?USRqtcg!A*+ap}9xR&xO*I0mA zn2Ix%z-kkV|Av4|7&HO*&~F8}hdkgO0z@FI09>}45^q-$ED*&@3?Ku}?FNp(5NH#h z4pGrSb;C|s*|ksAK;c(rUqubkL7sS&7ua{2ee6Ll0Qwqj9WfLxdJk^A%38pY7EvoV zNo{FJpM9Jpi-L=y)M1Qthh%}{J%6OgPn+De#}e+clTGp?SZL(Rl@!%R((o#7*~kV+!_k>nv1DdUz2x{tVDI=3hhm?!rLQJ&BG#M!?%MibpKdZ(a7m^u+$K7f|Knq71}r;cJ7thADPL0V z!Z1){f2aMr_%*r07nc+wg(t|*+haS%R63owsP1P<6&5Epy$6Q0qacOdKsjBRADet@ zPlB+hgu-7JF>?xt@jVM_#zD-i{|v+!I2M325<38u#r876k(8qru)hYT#=zPjXUyGm zBBrF$7>$^DqY)DYFX{gXUYfuQ#E$FY1OsNlNW7RRW72>!M7#mxd%^8t95IOA>wqbe zHMw%yjRMZ_lLGihBB*fJLkeoP$}wO)*BBa8_`PCgOa*3y!0KwWu&9|VUKiYWu^0YC z@`QwzKbdTW7D*iMAhg7nEni`>y|?OJcS_sQqI44HPLs`Q+UyQk_0u*j7!X;yR66^E z$azEn|q!+MnP38@7xgo;dFLRNo;AN2DKU4{jQL5F5OCE)4Rf% zn{}$qH0u=4)a%re`M6H)8OU+|U7eW^@eT@|)FfYbBJ0CRFS`&W#KL$YyP=C&fm63V z4RIQNn2(@A3A1Q03BOZuUT#|0;xH=rU;RBB6!K3J?l$T4e>Xu16jHud(_j22*lF9B_7@UrU#WDB&Y#2=Hg`Q0@T}eb=`Gi?LQIo?m~~m-~u+ zKs0Y-NJCUJfb=rwNP|{*cY7-PUA3F{=}H1cBx0d~xMV5!$yD~QyLg<+e!rWOiDsM2 zsZ8uiw*95uIgu&)#p}ob#0Dkx(Bk&y+(Nv@H>~FkImd}gn7;2YG5&5LE@*XxT&2%t z)^w!i-xAKO)~PnLLZ^6UiB2toc6X?5W$H zhByuXAJB)Pjf5-RVhVI-!c_IYAc;U3mPDWxZ6AO>Ae#wEWYRb!lJaEiLVhKHT%-~S zd$JZnCD|toh&@UXm4FJuigW>SC6mu>w8ZyhGWK&h354VaU`a%>w~)qeg7uUZxisfm z$uJ}uVNXMW`OP69EhHY?_^)<1E>UE0sk{ysNjB#fydx{i^@|b}S%C+7(*qfy^x&Lz$a7R%dSFSd&R}oRvXbNf`>4%&7^%U+|6#NHRN* z|Aq=3{5nk4VY&_h9cB#wqlnF2UY&ANl?k_*AOfrL`M(eC^}kQVXec_1jZ0z}9?x-8 zA=nJs=v?)sgfN(<`0W^K*`~yj2tC$x=cE{loG@W3H8_qr`^8oeL)qfgTjDFY=Zdem zL{hyO`S(bPwXj=Dyd`#$AUeLC38&dF&O+D}OxSWB@$K>TOV*qs=Z)e-B~_Q8ph*8F zZQ3}`5}GqFn&8ERnQVI|da8)+(AI zl*qfK6nTA3L@9bUA*Gmy6H{;Mczc9X6Z+X&gvVz0u;&lgq(F7XAI@l+qzbMvVw;xQm44W; z_$aevvl58!%Cs}%Hit8-bgIoP)hV7?tW!%SsZ)FAqdIkFuIHr;Z*C@{=-bQ--;0Q; zv$Cy$$~rNC*XE-J6C4A zq1xBNr#5v_nS>3q`ON4WaL#`#z*0Uc$FHi`Aoj6Zr|;8z315@^sY)Zsr8@NiwFLJ( zHak&WEqB-)X#^KsQqE)B1S~e?41Nl&1e@3=<1m48%E_xLr~h|2A}^j#YR*b$;8}j* zt9KoN^o*?s*OSTwre1x)-N{!em1N%-v2w9GDSd#RcJma@{t@c=koNp>YrVNeYD^_G z(Zn4}F=I7s==T3xm`4UvTjN|cxX&lP-(@b|Xm;7ySv@BkxDh|TSt;Ck+6ADQ27#Xw zcCN^*)#=*ICv>XI+@jOc%rc!mnQ7ALu1rdhmy?(vnqam>XiG*SI$%&uM%Ji-Qr+nM zsCVA(oeyyyzFuH}3K+4^8bT=GQ{HCl*Q+S_yn-JVpP%Hah|i^E_%wp5-3W*riRMiH z1jdsIjOG?ZEka|5i}<`t9~j~TpxeNb{$Im%a13NxIEFHf9IG=)jy0K&ah#QzmvEsdWP&J4bM|)80x{}-fU!BYH1-E$ zJ04XSYsKubg|S2!V@R=ZKu}&XwINp@HnWJyPL*`m`ET-lez-D4>cUSX=dY{G+{!VK zS(o=rB2M`!kH&N?F{I3x1RtR@1B$ciZ0#^uuD}=xm zGlm-gpqmc4wQdX8n?Y)|G~SM4mKNlR+^neEg2%bW7fg@sq$&gYs;9FvEIo@@d-GB3 z;Byy(p|Q=v14zO{aKfrA{rG7MRwL-L+4S$BraC{ zup@Y9cktHk*MqBi`Cau;H!TQ82hH`6xy~npQKHI6hxs2I{+~2gHLQvUS9a^-YwIcH zRTs*3^Mj3+p(;K4!?2Fu?$W*B>~0Fhb!XL6Iy|q#4=HPZzCm|Z4X949WL(b=(XRbv zH{1DLUI;&{XrF0&D%jdb6>WQYE%f{CdikkfH2-?Ab=&K~wr6!WJEVr_tGv~%ix>EO zYhJJQQpo#IJ{WzADvwd1^|Zdt<9&rzwTx;&C%=ch1_qb*} z=bVoOqfb*?>k%G*c+z*laIn?D;w3faRUMw8C~vo^T-)iRKn_vy}HL$0ObU%DvU;P&vOs=AUY zs%GnOOIR=0#dTcTuA}vjNB1Uiv^%)*YrNNyoL@%}fIs#wYcu!jPCTeQb3 zv`(FwPoXNJqELgMZ-svEqJN~Z=(X-Y8K<5A!N z+XmIpQX;?L>>+M+>KzKU?bmyTz7sT8O`*n<6z?}JT%&Tjq%jnH&U{WSd9=_H?hKi> z2{xwS7@|B*gWlv@r$mgww%3Ev*SG_Lulnd`A2%dQzig90kURw%2WQ!|564Xjm9 zt8K67Aus4ZRQCpNtF@MS^qHyzLomqGqrvDguIv0%beBIEJ*iq?L#=NGqc3whsNX-K z#0g!T)!~;K)4{fr!6+2S$PTtX$@wV%zzhIkEo1MBjw0zo_HitMB>rbm#ugt zDF^W=)ZpIDc9H1a$2fdxC>4w@9N@6Ho5QllIo#UC;Zu)r_{@3^-|a-m;r#t}&iH35 z(W1g*u@DWRnu((6FZkLtxaTo={SEokzQh9ul|`y9xaGkXS-T+N-{(c|FTNtZ;b=RO z({+QM!B{*!QmtgJT|jsDt`k}ruZ4xvmu`07aVkU&AeE;jy!JO+;7C!=U<~V zX^(z{i9SO(rn@QX?ozCo+}9?B`N5)$Fwc2i=TFVZpPrG(E<1ziW>#+TuS%^xFSzjs ze1%pYRI5KgQ!6r;al9h)I~?mWK^n7H-|?Gvf1aNe`ng7p-b+69L_C1Q)>HktOvI3hYD@? zo3=+x+moj4PpPq$#kNP(mdDf<+WVB6Us-BsQV$P%?Jom5zA_YCTMqT;=(e8&>gZe+ zM{S7k2dSf8n)bx-S~0pBj(jvl#(8&h@T4mJE~ zH5`|6Q2{@%QoH}oYj>$TW*gg4^;Hy7g8Q6O+jCh#SyV%~k615+lCUUXAvYt%hxs^) z&~Ao#4_@EfLK}|wH$E5qY6WXSt&;prxxi=n!X!CfwQBEZXR|w128mfxER$qI(PS|Z ztz$hg8x6))vI>46wQ+BTfOxo+muuEpnANjCHBfovR*Xzew|eL75@qKP1|er>n+6AZ z8K*~`VG*nKZTg#1`lD;jpS-ZZnpBOyGW{uIix}}JP*2;!JZ`FFcWHg4ni^?lXC$3j zpdQUtljmsp-lA4UXmgmh&ywQw;&iUAWHn-1!N8rJbYx|rscN3r)VysWO;!7qDR{!B zQpI>JHI>IJ)TX#t>K#9&BOA82-{!G2Pk&4(8u6l<<;8rn7}5q=V0Ia-OiBIF<94ab z-PHX}xy)A2uQ>68N=h{0x#)QlXH#FbdsCXfA$@UT!x?|@!D}ar!dj1YfVS&9=GSCC z)G@y`l!73llDPyr9D)vmBG{XTToPN{6d!((Pw+t8?5o{eL%c1u5brm- z?2mMaA4}S`--RMK@VK>wJKq}Ou`?)3y=8ezi19T8%C;u_U4N1?MD6b5rIq1?b0BjK zOb4A5n;*UCCv2YXJM{rTPi&w5o~e)v7bZ#yc_!fOauR+TFD*qyfwNLb0f2PH{td2t zdlIpe`BU1@%`elX-Ld}s*$WsS=Ej%fJk6iJ00m7m3gYZdVIVdo_~2{{u@i#WM*vMl zW-iB>nQJ&+n~8F)%Ur>6X=WCXIY_B_>+{n_<&Sk`u#?$S3a!Zb0n4!0Ql+9R$bSz%2H!e4e&CN>kRFiRL zmgWrW9fzsIPYI@O^S7LCk(;y2kXZhwP}@#XmEk+0AM~0sAfVcWRvv#1?~Wao4Eeo7 zl$P{$J3B>AdS!<~Q~7$G9STLI;XhqmszO|9rr}bw#riK-m{`3NJgl3F;(78!uhyZI zH~UM+yiGTWE3#ER^f%*m4j8vJ$*pAhb3o-8pegwE1HYYuUmW-?;5-lb%>{n7VtuiO z+`jEY0-mhZ_+c7r^LThk0JxQ*q?>sOVgs0Oxv4kZ`(Af5N8ILr7toRb zEzWrXK${29=8EV(2zXz7C!!PJpuA@-<-Ir(cq1sU06ar^CE#tF7Q%h6si{!dEns$fH{7%O0=`5)3IfD-Mp0_!C zod4S^NX$GHvmDop$YRiwB&2}-H8th-lLP>F6(0FJlJc0|MesT{sKt6Z$hkm(EwNCH zZI^an1n9^QRWModWypQenU4Iy3NbT&tn_>N8tsJcBNONOu>l?g$yrJH{OR*Cys99U zyXqUj1bbTK6hqadPw>3#ZW!SWB-oBXOFyQoE`Fz zDHOqvs+)lPG()APCJ>8hh9u1$#wQN|;rwPERwQx{>0!dRjpsn(Qt!drWq`wO*Tb`W zW^lMa#Nqat>}v^^VEIb}%V`#tZ@gDn9xaFE8xz2C$+6MEWTVz^5||{H@PO%osSKLi zO3?hJv%4JBV50!%6CNmitUC;BU$xs!KdHq2O(#6%uf^9zZ6{pAIG-=+^I!Y)DY#^`Ksj^QDhrUkW+TTKWup z95blgwb<)&JzGW-7p8 z35wSMMJ$KB_x^VW#TUw<`2Hdk4fyau6EF*191X>mx68r!vEMKlZz_S&K*+Yjw@(g} zBpnhIuSqyh8@lw+3=X^}Sd%RbQ9Y<6RCyG|@SSGKi?fuLvxLPWz={^V@j?Wla$YQz z)4BO^h2h74D1O}Jp0fOSOFhwNw%iFn-tq4l{<8yx5^#w1LU6O>Xvf#AJr8Kf_^#Ke%-p+-Mhq z>EJ)n0zKdZ%t1t)KlsT&{aCf<%(*0KEOXNNL%}Sy@JZf z9$zs*kLyF{?DG57hH)m4jRR+OguXt~twQkTI>5vldz@-EVb+oIr9WIzljgV<}-%i3@9k_RP=Vvhi1 z;}@!B>i4ic7Rz(h<*N!^et)6MA5oXp?>nzhm*vM6fthTNjC z#&>XwX0t7wL%}U;j|I2Xa@~q)qLuk%!G}6Dk8MfE0fNR0mu5=quurzfO-vWpL|0KEd$btKlst4RwsUX&QB& z>@Zs_uc1K-Zn4YlBZ_y*c~+x5`I-DDgIlrebXIs&gcFb6?@0LuIeVl-i-CoLsf8vh5~&!KzH}yXySXp>#+fXI$b?sr_qeCy^&sHahs^uD76iP z9NFu-bM!hwZ?E-weZuSY&1$OY`b>5GP+6~&rC!f1>$SQx0@b$j>a0ceArAl=;&i-( zXCbGAShKxTbZ)T<#*zl5TUsv?gtn~xrOJCCvWT8)yX+Bw8QS0)9Ls-89Ul+ZSJCUa zrq|$^>o>sl3iVoD@5G|ErSs*oUe}j;%^)x0`W<`yvZ}m_maEr5puFP~1s8|0EgN_@i_t^ zcMKe{i1Yc@?d9DsK_|^4109t=H%Rz&RZFx8k_CEWLXgDA0ZEGiNsC$!#4Jn-kN_=J zowZbX4wxkMCVeZx#86VpyaG&Ssq;5`Fqy0Nm0;2|9!z-Al1b~240zh`QyN7fhB%B* z69iHfpQk2Ls;VVzAR!o(byY>;96IS`sC})aFA-4Nm<|^RrPDyA({|mGUy&w86I#2W z6H6nl05G&}4R2SqBsqp!TJ?4MS)gb`Ckq6V&wDVrc_d8k_%&fN;iypyTGkc;V_?NE z+YN!q3>j~vsI~25z#`yzzdaBZ&Pj5K9zG1^*Rz!cR z&8xXY+~#vI0Fv`gC_SVjiwlj@&^nwjLhHL=Z=Bnq+G8U?w0^yLg1Z?&$2BRW7LOfU zq9eVJi-sIo#w8|03x$>k+eWgRZUHWC0H-D%QX?iDTmCYFv)w517&D%NRgar?^TY5O zv6=Be8M17KE|uUJHjv^C%VvfIo<{+Kr69BYVI+he91Wp0<3Y#+4AnAtEU?mL97!#p z%O~xC8IK{;BIvvbA-O3{3?bZTiVT_e;y|pxf*&{SEkNcSxG-}^Rh<5mz+*WMl+e~k zTTbZtA%W;I3x#9cFe%DKFXF}PHyPNO<_;H$XzeHv2|+u@r=7ybtzV_#K^jgT4;t0a zN(h|6X z(5DiZqK1loC@|^SVL?JJ03HMq*SKm+)B^H%AI7n0 zVK0ZpPjFcF7>8TG$>CGDTSt+kIL?irWgn%`kv<2l`W=z*ij`yZ>TK{>Lwpl=xFl~S z+(m2@z2{`YMZ@lXJmKEX&b80gpo*KS2)Wpv+(pDEF(L5WMeHMG1G<#!?xM7BLurL<_NFX4S_ZMh?+CHOKuoda-aW*YkjBpg*|A*p z2TKqm9PfLvL5u>}8zq1}DdjCn^8&!E(p-=^TGW{r-bQDx2dp3s$fPpY@8|8>;}LX| z+DQ~|$gu?Yj<6V|*2}|RvyJ*c_Gr5@CLt3oHhFz254j>+K zJN@oD!eGWxdl=J$n{F#WZo#{N+z(2STTq1DC~Y~-7z4SMGoG>>(8cdXJ#dXQBG%-P z3w-dsSscs?r(lB&G$GOBVOkdwy3O-_2*7LOP=c#870 z6y+@i_4w@tzomjd=DX34e-R60(Ozlz=@RY~d1^{L)$-Gk%oGq|TVuGNZxp6AsDF*7 z809W*SYn>W^e+Qrf&_ogHfhJKl2e)hY5V+_pghh_vu2!KQiA8zYKTA)vCq@0ojdvmomK`F#F-G<)yd znKN_FoH=vm%$YODbuE}O#SVD~2v?iV6mD)5>nNQj=N4&3e~t`NtHgmH#P5f4C=PiS zRpU#e&TKXTW^=XTBrd`^qg=LLk$hP(Hv(Lk76g~nu;Qb!D9&I}DpLC^R& zJ?VAOd*H>yG3hyQS_@7)`*7Nq#p$ij#A#;+C-*aO+I<|H_8lK5x)!uP#$j)11n3ZF zHtuAT-lKmQl@i1EDKSqmJ7mw7X6A?b>YO=ZGCVR;&H-j7h%;n|H9JAjzLPuyWrTod zVu?PLq<&Z?nHJ=h#tkwl5SN6QH+o34}_BBj)GNRNbHMyj0qZlSN z=AMYnSYEwDg+x7ZR!T2&YUnvt!1LQ zpOV-gWy{!;;~e{zL807kM5_kjm}D`DTCI>@X5hM&3uaTUd7<`WCkyLeikWziv2XCp3ERM^3##xw!55;0;xIkKM^C@+z4ztmfx-w z9He8MIcLyx!NRfqiSPISCkt>?5y@s$Iu_{Y6x(keN8u7@<(w}v9y`HK#qyVhpkX?e z?9OlAd(?`=cr1U}r~$@fCO`f8>9=fDAwPj-qYC&bST-uaPvNpr{rKs>Y*ao!1D5sc z1EI@H9?DA|%1fR=CXYWq<6k_9gA-x3-&ThnpF=}eF>>?V?>u$@5AdBftv=IMTWx2~ zG}n2s`=F@Do$(=?*MZ36#`y1xTwPCqwr>5FY4Y_7OUS36e+X3U=_H_HenwfU0 za3yge+YZ=<)xr0da1bP`O?oxyI@PJE=hdVE-Uhr=L$IL2OXS_D;kwbn^S#GX9ydMs zzO;s#*LW?^m1oqCXY9^)PHv>L1hLyTBrd&DP_>nW0@)>~720ZGdYi3kE8U;|RS@1} zch*!=N1l7TyaO^5*hAAxlZx`V!XJ*S7#;$<;!dnuKwTJD0b6a0sSW8XsiMnH_NEgT z+4;~y)l817+G?Bg=T6P!<`+n)!F8x)K80s#l0_wBGM!lh)f+>t{`mt9JK1UCot~TwUZMClHe{Dq%Z9WQCLYmc}b5^YzQ{%^zY@0i-^{`JJXJouo%Ct6+GftV3pFAWn$0Tu4- zlCe?moydSCv<7~ycfVDJKP%x+TM?{umypcvG$(r`+nTz?*71b<~2z2vCMf4|M)dg%Pw2RCRgl;DHj=1wY6!Ooj(s=-^vf<5p*Z_%sNm5 zlbk_s(ilB1rDGYAwsYlVxT2%yav7f|>du$bSM+?@A^ou}z2FP7zpgtVuwDpQRTG+h zgRM?NE~T$5)dTJGc3H0-*au(T_JVMxFsUb&xVly7Rqc%)$bI_I?C{#`j^;MW9CGWT zBB7$|d;Uh=cZTHTJ&n9@T_{eNYF)))yG&5rZ=<$M=-`5H=ijh(*UKB_*2n8-eTeNDDrkPp66VX}PWDPJ`-lVy-kU z-l#|mBPo+Tj;NKA(qN~)hiptIB8(i74l(syJn)YD%cuy5xO_*P#COv^VWyGDKBIinvCttr~=M&9A#Ou(Ebln+KkV&W7YM!*vuKLJW+)Q71 ztyo7Z+_R(!`7^3*>B||2su>Njz&be=g#VXD4m9O1j4*tY!QYq9hX)(F`E#_8b^}BX z_G#7gbRU6p=L;DnF}2NI$zei<-U$LIGjHmF=kfhk;b~$0&Kf;l8LS|_Lq_DWqw!<@ zXL>wV9Ps>&Qk5a)S|0|DP1z(BjWIC@s!D+bKY3_OS?9m#Q2)vvBAXGu^>(fd;fqv)d zoT5h>tuJKh$Ad?|CwOXuj?d}@X!v^)Xw=UO^SutBW%u)qq=!i2O%_YMrM$O?y|+70 z(4-TBx1O9O=#MoOg&xb#)QLim=e(>!uh=l1D)ji;S^81vvBt|#$)oEPtLE{K9$1^l z{a$K4kAL?bC-eB0e)PzgXXNK~w|hNg*W(ujWZk@)sldDC3;&dP(L z+lGNV;lCwSkhpJx{w~eE?YH_-nrnHf(%cKauTurfuZ`1>g5|3$Vt^$`Oq-@31&K3% zr5^=}9rx=;LE-_{pfpx9+e>3~at<$?I+&EBv~A&qslWdiFUXLWNhPkf%QSUq9qh!( z8IkzBo@XW>muVs|ae6E@ipj)6=*nyqQ)3&<^c4i;TU)tCb5>>Fj3p(%=2sX?iCm!Jqw{yq z2Rb*+}_k?b21pYw?vPmP_{d^)XmBeaE)LhRC>RD^agF1&LS_Ltz{TJ|Q)!TYfCJbk=?YFk!8jm&j&26sM zhtAXeTd~7jIWkO*YL{z&m3h818RQiOAa_9rjf~cXd3kx+GGP&Zlo>{uiuTUr?%{cP ztWoovnoE}@gIY2spF}-pFb#8R&Tx`Nq;)1=BU?4uI+Jep={=sLzRu(@Mv)M`Gg<6E z(VR1QJf=C){^o%2k#qM#^6Lp7U2j?j%bf2*=FImw$N9c2=ljg;cg-J~N6(c$JS)S< zXAlT;8vJn$ij3wD_Y$zqGDoZ-U0?30A23M<8so|1-?IhQX)?fbM@B3&GD@>dtRt1{ z>d%(kr)8=?A)bn%X|0x_6jM9kLazwYsH2~em#r{Yo@7PIg#s!oPnwS}PlRiZBTv}s zWxqF35|-^=tv;!IJN4~ir=MH_r1mSb08P{xRe-s`85LA!ku$1Dv|T$MxuG}_l?e}{ z`adGy2(_Hwc$ZB$J&`Q|x8k>+ykxc6 zSd3LYgkm&0Bn914K8X%$+uS0-l-WEa?tBZ|S!1Ys0eu=(YpqCQsHIlcLoqcTcu}@3 zwy|wzcf8Wy2o(%6PAKSSgyMrj#tHF$AtPiB3L7U_{lbz~E@=!fLL@sk_A9rlMu(bK z(STvj=wbYnI-^UW<}lUe-v1k#=n(3TCSV3@M89tg>+K#{N=+8&$f}b|mAR^jLE07L zN=bK9WKdqui`g+*eI@(o6D>6gD({Ri`nk*Uz?HXQ?ClfK~w|OI3$4 zs;lCF8EFm~OV&X!+0Li!Hxh@De$#6btl?=>^;m=xS9`SIwr@{}5}Pj-O-I$_0&I4s zvPxlxGHk~=!Vu3ZWga4`6ft?I5a543n&gAD}lC`YU zf-EVkgw!>$^ak?P1vbV~SES3<#GdW81KXmG-DN-frs>o_V^-1N#q(elS#hvXlD4wl zOJC7`^P5wyL)K~is_*>YB-6Lt#MNO-z594M=xUACR6E^=e2 z7q9A?eRZ9&yd%b8!Wf))vRp9ljAr<>CvGNEWd*D=x+qQ#VKXwhEngXwmtJR9y=^SM z8j6X9;TXe+$DP+T1rPBcWOgj%kU@j2$><8wu?9-mVfpFLmD*)Ngo=Ne}-6C5Z1 z(!TsQlx?oi?~ z>ErT>mm*h(S{QD}seiyR^}lhy)K8(lMm(pJwz|*AFQkyzI`S_we>@(hi|zDzH+^SN zt~&7yN!RBlW%Gx;{3CNeYIr-m`6_*0L_SFfRKgOAQQ;~HfLM>!n`k`0b+T~`%SjRI zqD;KM11K&$iF4%7Ny)=#{y&g<)YZt7xuG6RS64%Vxxtvm-MhqT_@I~mKEfOj@Oa+-D4EE%Pe(B+N z&~$8g>sw1Mrkn>V&DnVmzMl4a`Y{)x+(`4~;O?5A>A=r|pB|W+y3dIH)#26;Ov?_2 z*;L_AtKXvuCR2=wc58;S6PcesuKsc5MBmehxs56CduUtT+HluxCVNYa#ZNE~o5}Wn ztbFMAzyG~?aJPDKdrzw18mo$+dcWXX%$XI6rLGK`E2Zsq&b%%xVs7#c7N#paEh?6} zimzfzZgiqE?bP^w?u~r*lK9AFpyT_ymuHiB9TZb9xL+rQ&jnsaQir-DNU~EC=Vy~n zbWbHIo_cB_;C+Z#L$Uj?s2G2;`@z3;fkd{zX|Ai2qI3Kt?k<68Sa*y+%iYW;4-Y$a zkEa2q#-HOpMzRI*@23ts*;!&PI+S0H7hG~lA@iZJVpr7RrnIV;5|s>{Fj~yIBSV=d zH~EV0X7^ioD@gx6s#Q#pucGWuGp`ey))b6dQFXGZ5Mxz4jATCns>ZQlKe{Md)nz2# zg>m3H55U{!NnW5)w*=)}L{SDvt#YnpGQ(rMJr$5M(M^x{zmCE@7Zx zc3NXrtu~h2q|>;BNvExsd`l*imVC+Ha(q?&eDoJj5p|Y!g}29 z-Id&t+=)!21%bIC+d4fA80EAYyoj`CzMRCTHV~gisZz_ ze5|Hzzo#q7TWP5+5Spu`H#3QslTr%WVSS>)U4jSTF)c}r&v$Qoji&fZ48Mh5E?G!3 z2&TyQlVGTT-(aVyfNrGUu&f%RX%6dZkWkZp zI%NQ~STXc_E<6-H9aE+inV%nSJ|9iLSR*afrZ+tMN^JTDLBLiErLoRE!Ap5VKaYyC z{iLmaCJ19Nyv$y-Msno(lV*_L|05wyK$GQa8bem0nwjpjs?tq=M+ndCjOw`mF}20L z=e=}V55;b|Y>ELZ-DJ=w-Mxgm=1jdodAUD-x$qsex0kwE&DS4EJl*$@9Y$Op&!u(dbm!;5@C6dxsh z{mD@DiLC3br`VP!=LSPW;)|=f4NsSqq2!&F zBryeFTQW_DYFhj%Iep=vh>5e=owhrjKB#plv9uKK`VcCu>&t|$&|s(P^4)6kA#xg= zF$Kxqf(2qdd7ivJid)iW6;DQOXq$JFwJ@o6j_Lj`KdTeQ>IG)k6!i}e*g|bZ9;x^taQ;E^qMfFJ> zr}OX}lE($X5VT$5(RQat+n?{|i_rGEkga|q(4Uf4v(Rl&wFMn}`bDONTE4~N!%jU> z4V$Z)0y}kQ2?jJ=;Ox}*NARR-f<(`925=c8#8fpQXG~CGJ^|~Wl!?N2=Y!-T3;7@B z$!(KVYOqs(6SUIns-}gSe(Nb>BOp)P2RZ$)?EQ4QXBesP^zrx>w~17l^5FwnK+S>U z%Dqj}Tqi~0lh8!gs5$HwQ{8bkG1aaxu$tL5E_%hPcVp)`+TpZHMJeC=$wO-g~m%G$wpO3(kYU^R2{qi_Z zvrp1vpDvGNDnqhb*r%q!TSs$konU1}>d`44plDr6T{{3dc$di>TbEkYi@-CTMep$w zOV#3mnG}Y49Bmgb_x!rl!i78;AuKhHJQ41lhQ6J z?WAxH>I8cmDZ3?QH!1rhWuKfSX#OqR<*`K_(giUmWTvr4)izjFmou;5K!0Y5TP@r) zMaWv!N7k+Gk^LT7t39%^=+gX^5o!{flr@@(g=?4Qu+z=xufCX4;-J~D{4z@QRjm|jR(?J)yqaw zf*!I!T*!}iEQE?G>y#T+|IYF6$_!*Co-OV>yQoeKN0ShzTcT>c`!Xr9z7)c6pvLZGBE)4rpZ!{Bnat2R1S^AHy8pd4$MvsB3GGe6X#^L<)D z(9<%LyRgYeM9j;jrR@Kd3MasuOchpDM?$92vod956JkTAOz9f0id+M;mPcZr)&6NB zkFadPR(f1a@kk>mhe6rBb0<_ujmz&#u6O5=CIci@b3|?Ic(Wk+N}!{=KNr>|_vELF z##Zb&_%2cKhWp5A-x{&JW`_4Y2mOgg*3@UyQf+3Ek&w;Rr@V;%0=_bqX9=3KGld1s zSKjtXa}=6BejG^hjL;$>WW;pKK-XyIH(k|-k4E#sziT#1cBT`T_I;`s3Z(cXt0cO+ zwSDd&mS2N+cDyXW8R7>HWU<@qnqC8sGNXx+7dh95qLydOm$Wm? z-4nW%;wC2jG3#7#UXuYSIKRC&BQ=DgVVPo*jx6>N-1G_JM--E44+(eM3qoFXKYW|s zDu$=eTTr?FaWOq1BrspPFQ-H)PD&Q77_Z==hx=-onyiSDExFlaqp9!Zn>cTEyi(wP zlLqLFG9@dWfnkS3dl{YPK4ux+GiOuV zo=k1hGZS=e(kZ4$@dJx=uOuYju1r2*`4LCw^Yw1sdCVey&)L>@eXr+kqeNhIGtN zNhR{QpL^&z-L2)r=+-ULttH47uUFISn1BY}uKQHJ>#ll~;ytyQJ}o7Awr!@S=d0&+ zm;QH;-=(*cPbv9sDekD0F4ZuO>e6wa8&3&q8yJz>n(COiH#x`{%-W_f5Y;6WiGJSSKBdF-b9_Xig`f0_Pk5q1{0UkXMfF9EPXqNib?xrCQWAf8+Bvo@5$aZb$04* zt)|Hx!5Z8qy{F~RK%<{U{dyWD2-O_RDMQ9i)%J5QmSj&-rtT?`{Y8@dyTv5)Fre>~ zw9w5bS=}Lzs>4{mVB14G4@xY7pM-ISnChIt8Uko z#ikz;ol+*}Y76(Yz|*@m%w9|@a|*H4HD9cj%I<5roq6V5lvpuLy!amLT2vyf1qmsx z_9~i5Mb4d)oe^J-iLEYqXy~kP@=#Ipd6wEhNtcoo@JvkSQp(TB*|6*Ep09bCdi+d! zwmsr%9EJm$@*&U@K}4Oe^Fc~W$-nPJ&hiH+!n!B;8D}9o^GV zterchEz&p(dztPsuU*n+X$3S^Vef49t^oVme3eYU;syjOOGa3+@a=dWtLajHNc{=!BBTxphj*A(zr$7 z)@cQUVmLc45>O-PQQ)gm=_gY__o3e{HeDH`W2q!R)Eu^)oAQIS^e6xE1|8Msxqrfz z3<=gr#jBIFfsO3i<5Iv*j8D0^Sf_OZk3+euxH=?1 z8FhjN3ZJ;$NkaR~tuP(qq6gMJ_8WhRnAV;w6$q{XIe=ho}pU454*`MiDptXR(4 zzp_h3?Deu8w4d`uT)=!p7El>u1L|~pf(r%<(;2oA>3@r^_2@;Kw|=^|WOCp7$+zz4 z$y%&CR}%!eQ>1-^Xf@HzkV(JR;|S^tcG54BbZxa*-xOwV+w$y6g+I%*K=AG*FeZ49 zu+{gqG0K}Ud;`^@j#2~;yY`}}yDvYJv#4g=e{5yR{O6lyN%u=wj|EG`nuxZWVsILh+*dg|7T-o#nZa4<4bOL}p?|1ucpR(HP%y^|mHH9i8kx@QSR&x@0h)@56TkNt{Abg};H&ap%`kB|lPOcO@;0 zSLs$HzGI zPoebcs_zTHrbm>L3S~21w-cQ!?&x}@j#yv=N_3(7k5dMLo@8VN)A0s%KOuE7N_8Sz z)FL?(L)=RigOT%JAF zTN_o|n&)Pj&vbN}djZC4VZBRyuXc+I;s*Qb%1mbp)_<1N9?r@4O9Q9d8>fO}XNLt1yh^FL242Rkhn# zd_Evn!j$QXG^YpyyJ7gxN7a$WyR<6pb?}}}vHkoja%;8Gwv?8nJF6BHH2pJ!_QZ1G zf+xwu{u~wev(&!xa_eN1?y3S2D2)`x{l-|nC1nP5^$(D;l3g#UzC)_tktn5l{8@79 zzdon_0lD?llfqw`DkG)-I?SDGFq?!9Znx3$gqjuOicv&)6O}LTl5rgCtgDV1k9Am1 zba%9ML!t^^)Y4)@Otpyspbcj<-epCqgNY(yw}jIjRU4c3_24K$v|C-pf?%G}DkI43 z=*AW7vF*-84QeFpbQCDjNYC*6lOpxO#1Idh$*N)>Q<=EYB^QK%bw99F-D~L%r|z|? zI@eg7N0-Rm6Z!^1EAp+k5_8S8=3!6TFQEV%jyBTap?&^*;9h{~U4QQRw*Rd&`)x?} z+c^JQS@zqz|Hzd4BJk8ZqStKo785UIKXL3rR~P5Ar<^~|H<3h`-n0vtSenG*R;^tX zt~n|iyx8mGCBZ9Y17o80Uaa(`5fgfYUjJj9>F$$8+G-ll?3b~J5lSA(*LIt!(r&mw z8tHynw}DD45q~(IAprXpcMHiRn~0xV2W#9@qF>YNl85tKcOH$mc|ALoFBDg|e5L^*`vOuyE@_y-n0n zRU2x0E7K@-XAr)V$>tPy?Ysl&Sm#nnkbiy_W^EC~<+4>j4dmH>@S4k9gn4VT`_;9q zc-5U+s8GVFlQeOm(uw+!SWzmgq05&ZhTq}iobd8leaKia>u;Xu$YAS)WM<$D%q{sR+GMGOP2<%yMb*;TRm@a zAvJz!UN_vO2HB}A3LIu{-2-eqYKKx+^uT%z`=*kaW_qnv^_!A~z&94(#~9Q^7Vd_{ z>DZ&V1I_XEK6|4K^=q}!(Q}fM-oiNw*2d_FJj+PS31SS}@n^Nm%*9Z5(Z+?AeeyqNN|9gGoKLx*RO%>Ec z^e@3Jxu$?1STNFUT&x31T=w#bC<#6j1is$S3yW&Z!nBWm0v~E@a=+h^PVX1^OnA2y zG#cL!;t>ZeLpRJAx~N#lbLb}UFaMPGAJad3+x`BbW1Kz=IEL{F7<@MTqxvJ&2fyI| zGyHL%(*7*{9|1B~CHnLi8p-yykpCZ_*m$3xH2lw^|4G2#FYslqXE+@LpH4f5^4=H` z`qX}`{V(eALBRPuxN*cOnNEOT=;^uWGBPl97Dv4+pkUk zFADr&XJtJ3Ho0ebz+p^w8}O567R!z`i47#}H9rlW5h^-MT6twIAQr&K0`kz;@Wy-^ z{zk|UVjADrAW;8^I-}_;9rx;Sa2HVFiC1YGIxRPG#(bC6H^N3u3#Fp6x9!qioh0(ekidXD4Bj3fL z;MY87;sfYSU$4}=XX%RFA5%(wB(UbNK4qyf{2*Uqfd$1hOPVxi;K21($t`(mOo62g zX{h@x%HYt$rj3+J4S(5(Rp+I%o9?AQ@27u>bg#8)3)%mhWcPEViOV`oT>LF`bJBlx zrq`tYl3hd~Wc3~Q?Bu+Lyu@u}TI6TibAhy>R;vF2NgUwE^>mB7Q75Z~!g8tM_jq6C z%a@0}FJgG-%m3&vNwI6n$M5rzW9$tCDUjJ-UBP*Pb9BZbetq8~2ki+a#_G1%>WSTy zO^j4YfoLq(pcu|&%I))C%Yxi05Wgl67j?=K*k+Hpd5?@^L>XKJe9Q$K z*Im>7^jW$E<4^a<@=hsj^uPIgkkwae_AKR0&f}Fd!#ke4{(GXu$nny|)#!|#*_D;W z;OvXdTWzrKl~s5xt9G4L*~Lz6v7IW4u}lrPzY}0`>e92ooG5amjWj)2um@bTCIg0n zP+vjC^wbRw=R@l-)Ii`;;_wm-*U2D)_`*1WJ^LN{62Bb?e1?ulMC2pMhYp}N|z zd!{5(-*Eja;F*TS2$56iP0YYd1>%ux4I4T!KU&iwuv>S(}T?FGPRveLEVPUiQF zkyCppQ@ge%edCy#N!*dpHRHqRcgZDQ&5z$KD0nr8c{ z_aF6o@j&A8?0Um%W8A>MTEl@9DsF__8|5u^8#*Oy{$fvF4=_4yGmN7x;en*;s0 zw%ong0}*!5*AJWAv-ri{9iiH+JQlsT)N`ge^thd2c{MrYZu_oux@aV<2{70UkZy)k zI5UEf#(q_CK=TN`7tYvX?NY18Yj^c(C#c5H5y$mv$1YIg5f}O~sP0@y4gOn^y3>;u z`ddidsU?Y*bC}L!J2R`}YBppfi>Zb>b_ssVbet|x$}@&V{S0|^mT`pff@C~1>fE7% z0eeg^G+|xzL*#pv&1cG4j%v4_#g{NLgTP~D4?S7q43ud`Z#S!+qx>Ob>gQr}#uK#C z4*b&&98ubSScA3}#0wFRL+yhY(msg8v=3r29*fD|&&|3B$0OhW5QoG^v4Xfq`iZGZ z92&nrf_IY3CHW1K8SF&G^Ze4BrDD@g&MVH(I9Cj%5PX+xKa%Xd{?@O=r{dDI0L}V` z;z(nsYR<^aPs#>(bzp8S z2!q|$G~ys;E|Glp@%;IOQrhguF%&$5JqG~{)uwt^#Y$u1aF2#%t!A=)$e=|v(( zQbltai*S0^p0Tr%9Rp;r;mx>j><=Z}r5`4Mvq%3;YV20UvWZ$X$#!n4rQ7zsi zgdSfm=w6^dxy>_#amSQPfQNW-SRVPMoc`sEch7uACNR__0G{UKY@HUir@qkWjOdD! z5xH2bKg4(lYijuQgT7xs1Et=vwll!Sl&8tQ=%c%^CrH?>F_33Mv6gd1l;;Q!RCX@i z=-DrhAz$Bu?YQ*1+Z)*L8q4qY2K*wKL7n;$dcLxier4Knulu&3t#=%4XA~{)b~uxB z%TZM-_Ntd7SC449Sq5a5zt`xEL3>6oKjvhk{_Gv^PJ^Ya058oE1B{*Vi0g$G6I1k&VC(*~AJ&0<~qtz@Hb zbY*vuO-wQxYgwFYg!Q}61=++b0gmZ^w!poU&zW7e@{CKP+M|A|_tT@Ynee7%EPr3e zd5NlC&eo#UVzzR}O_P3-6Q<4dkLQv=D~&FHvElAzy~Tv~9h$63Dngb;$c5N0YF>Rhgwmn`rYnSmEN3&iA} zN1n*3l8tp;)2reznqI9zK2PH1avZGbX=#BK*ozTMS|EmYuMJJfIKwlnJQVO6mQf^v zTh2g+jkZgW&rzme?ypuaaBOiBx#!T35$v0?8azF&)-~Qmd+?MRxisInw@ zzp3Nkyd?Q!;+4D+W#ZHv`u=NuhQ6uwBAT|kuQzhEOC4!DU>f&ynqt7aRyJ~FJCzA^ zCY<5@?d_$Q0#;|= zab670DCKIAPyw`!<%>j?FuB-DAJ4!q)>1Rjxo3yW>6>Ln<1XvH0KEP~vR*^rOe5=a!FcKi1M`v(RI;-8Fz&3V9LDaE=lcWINf1M?<*blh zR^DX)fj8Om;!Ui#wxi+N$)_b}Ug9FWP)zl*`-gAA(K%LE*)c-mX>g)jce!sK9*7r& z0A@2wb#cymj#ox1VI&x>&%jxf(Up2-9;1w{el95$d*e#CC-NuR(`XrwIU>Zp*dcE} z!%kM^CC*i~LH8V>#@GoHh_?U{JtQb=1$C19Uw}(5l_pR)OyMvGBs93Dzo{jHWu|E_ z->A{i7;Cb6O_O&_$AZr38XYO4d3C9Lin2UkDoJ3Wvqm11x0V}YI_CarrlV0Z=n3Uk zwnU@d(OZaaK&^IQsU*al>Rwy*lRT$?avqw$n&!8M&2)!Vb%)f^^cyj#&!l2cjYB-S za}Gg0Zx!iVlEu%*SiGAZE@AXiIjFmkByTaep)#NPmwEvPu{PDIJ4xY)!5F}DsJF{~ zU|c@ifn0r!WuGtZfYJHleG}#sWSz4@l6)Dv*&VS)n@|dUfqHGpoTJ8)J~NROt~}^? zDdETKf#J2LY^sPzS(+NHBD0eB%kIEOt6VfjZ}Y;flq^n-E!6sEXHC6)a-Y?)o07$3 zmh`B*+Di!e375KepMm^>AKxH{lN1!m*nCpO2KVnrB_#&Rs*t%sRtB5gZxq3VvZ~af zZ9dlCc{gO*+uYyFlw2k)?yt}6$+DtcBc`oDo#Ku{FsvXy^5lM1N;@^ECGCmCj&{x?WnK`RhWhJakrTone(I4$jPCcc)}P zy%coO$F{m}=!8eSW&b93&S2qO8Y+{c*c&|Do!P85pO8#$3&&NUS%$b9-EVmb8RD*T zFFjooH}&t25%-p(k`j05n)JFmTU8E2==s*$x{w$;z4Xon*vP0{*i10^9Guq}%1-NB z-BnnEGt)XP=ah+3(!24LL}?^gC7u3yt>)ko8)s5MC|X0Xv36q0$eaB0v;ti`Mi(Qr!=n_bLSisoXgOM`s@v8xWy_dp!y<~;AU59$uTJG#cVTdbyv)j?fOI`HBA!| z4RzN&%}{srTVlN40^91EkIV2^y3bO>lZ8-7t#?0oN0+@2=Og*Tp?~IC;rqYfq6aL5 zMQwxICh$6I8fb^m?Re@k@c^XQ>6hTQ@y{&H^!%4Q^(}g9AuxO$8KWtII67NP+DVh1 zz<%mcVTik!BUeJquj?5lDSXI$Sc&zBg~g7<7(01OC@)bRo3V}q80+y#NzM-y2WLw5Obj^u?$iY_PRm9hIu32$WMlZe zQC?WwikX$CQhB;bp2F_WMoSBf*0D5E>t9ynH<~ycjV1}XEkL6c8*uJMw3Gr_tA;}P zMP!h&LnWie#o|<^Z+B$SH-AaXNp_To z$3ne}2$u%Ipu$O<1A}q8iK_@7>=jeAh9eF#>UpLuD?_S(jo;}+JJLN66-1~m*?I3-1mskc)CS+NS zmI#hMhv{`??5konNFe*Rx*LBhqlAMP?agx9<6MqnQKA~?o^Q%!)a#WxiO(gOlUnXM zx;^pKwIwrS>Kd#@GqA6`nmMPC5s<_)i8+Z`;)=rB%hcWRp&ntULbT6kV(f_*#G9N1?oLov zW;0XmwKy+rEJ+HQdVOOTdl8n@M_7F>DR(b?So%j#A_j=DTnU?rnS;)d z5#1jE^wAoLb0@Qh8(Sd+@0&JO-R#vXRV1H~()rC7C!Y|;%ol%LkyW+RRKG}m^B5#m z#4Kq3x*8RXn8D_+AbBEY5$8}k?dkrR@ke%35aU(fgi|?5CY(Qc6V9K!31@tE!Wm1$ zgm3=xm^gMm;gqS0uJny1d8TYQX&Rq@CgfGa6 zXsNe?{tCDI?mF5wbx8KXIj$BtH8Dzi<1_D`=yu#BbQvFVORo}rehTUhvF!L%VlQz2}{Zl_hm073^;_{c$QQGuG32;v7X6D zRAgaS0>QCK<_?0t?9}X;1eG#c*Xh3cE-!l%Usj__jO9cusV zf45Zh-*M$!)b5__!D5__t9J*=3n2q-=Q?J*>nh#e2?x>#mWUqGkN4tcBB0-~kT>^V ze6XFL%QMHPR^HDqlHMKrrdS{DlwNcH@w%klDLsk_L?>;~Nh?G&`$?JdyElJL`B>CS$-nYwgzJ)U1 zbS*>OvvR&+6j*OnwTx)`sZhlYcntvB7Wd$l0)Bi0&6QTWEB+$PKOXIKN`w1*{i2ur zyiao<-z6AtC9en)_X*0%Mu{!!wrYQiLAW%jox!~Iu&C`Srn%=-*P(b{di)q{jLb;;hr@}_W9)u_wZly9#;dzO(RGuDH4Z7 zUJnhFUGLk%FcCrErWCh)?I`|X-J2@9hAX!Vy5gy#E@gFvDEuge>r{*#Zci6}6d+=S zE^gY)*Zstn5YRs-HO`hqoj5$smpO?cFqyD_vqw;umf^`G9IN>|NUFDuNqdv8_ZpL4 zdxD&PJV2bGIS?Z8GSYv!Q9x6!HVtd?Vlh`=Q`0j)g@gBQjdu+xA{c42@OdOiz z%e5zvwJ>1nj+k}t?gp)hvGte!d3n=|91LIXW zkiYnPlraFl-e}ysw$YfiGsw&C%nP98Wx=b&Sz=`~jXA@r`sb`kYJF6FK=dP2v8Jln zjIEVwy}Y^ow!648sxC8CP%}O?l0AV|Xu#YTm@udy8n6b99oy4C2XB@tPI+uMx%)nJPIZLY^;>$DXl|VI;R9 zt|h0X=JzK6*;cn_fcR;!+moDM&ib&f;w22}iP05%GxCT}so}!`pbdKQa>kT(0lVWx z7ic|3-h?YWUFK&%ORuq0-zhe${?)Wvwx;b}~9I?mI2z!OwLE)$>C?WMRQbpJO zlTNZq*kc|37eDPjKTQVVpZv5XewvJ=Oui;bt2hvC+iTphUAhv>GxGN)S&neNM=w() zni>lgZK_NSUj{V2eAr4HIQNT`x0JXSE%a*%>y**bm|Oj%AzqTSWwD=hxKPTCW0^EpKt<~)F^B}mZl*Ev#esen{?xIo}s!?G1mirsuW!EebPK2U9` zS8c$rXOqr8Jm|kZ$tx2Ffi3h7L)H7n?cYET64na~*EI z%R5I^ibU%{U~F_JoaU`}e?*E87C8Y}*?#=J`@GmJ)y}rP&9$+rwJm4(Cb%OHY26fK zjxN?4SFiRIilh5%9|lG=_tYU-ka5{__`AE}45=(}tL&fAOkA=jluUCkIY%%{T&(AP zdTQ2f`g>eHcK2%iRw7xY3hOf=cicO4{pmzdI&n{}%+o#BNc}ot8wn^Sx{Q@A^9{<7 z?b6JbE3#jz1sZ^UJJiCV()94>iZit|RBXtRCpo~3Oocsug`w^pw6$V`sKD9w z`|YFhA}Yt0o>O_K`Ai0~2k(z5;KA&k16l}MrZx>+^Q_DnYahZNtKFr;$~$g7k*up|fY7r5pC_D{OJkZ#uz@+`W*@O+kQyL#ecW z#~#1+#1nOg>!#>Wxvk0WCuIC9JlAPkIkM8AOK+VkbnbO0qWcKj%OWN@54{GDmW(BT z?%g6$JKalko&>&WnJ<5%w0t?m`*K6ymuBF|mygg~ks)+Jrc4=Tclq+F_vH)OeSxjo z^Og8%6s_1mWA5z`$D!jmQ;3o0-e_IJQjKbjD=8|jYU?=nSn8rwYx=-F_Q2NBo3*2wk?( zJ6;+{-!%{M>h(#mG7L&>OmJHbYiD|R8}QoN=VC_&1pT5HZKv0nNR+H ztX|J;bkp~UfLGp1*9>~()@!*eKDs|G&x?VB&b}9eE^jticwNc?h6x1Ih^lQO*P;*> zwOtDq?z$MOZV!qOIgp>92y%5mvc0gUaAhGlaMpXwYTFAf$Nhlf-}fRuBc2g~S^qIX zA($E^mlWmv)9s0}x2|^8P1hmy)DGS5cpx^@6VvhOJH$2>C7?bdtoB!E>4EJ8*iQ__ zkd7zE>LS9#q?`A01xP`wcFIUhvy8`nEOR!?Aok%#8BZ4tT6m}?anZs<@x)mR57j4( zg@>+aKHoH!FBT7oo-^brC{HKK(}yrx50;4WVc#^36{BZbsgYO2QrF>9@&>JB9H;MkjWL~>zU$RW8hxi{6}t4SHs<_6Ob=V4BRTCy_2{$>u z%*EnZpcZv}^mUq(DtORdnIFpQSDhEkvk&gE%Qo8ExtM^k0o_CJyG{+0GahnTx#?Ur znR|!(^*NO5XnFb-BM`HM7d|hCd3n@Yb2f$pL7bl~SqMB%)o`Hh5w=$ zYihCT>*-FqtoGQ_5?3DW6DKO+#5o7w6+UFuxe;Xpc~Cds3e+W{oOo1qP?{jCU9$p~ z6G*Q%mQS1?n3!;`win3av?_X^g5iF2GQ+1iq?1$e3P6??%I`MIBq zyw62mVcwcCnZFiSGqmsSOu6~PSn@2uGVA}*#d6-h4#c7bb*b-Ev)Ri^oRbXwRU*HX zpn^`b%gRdPOcP3)=+4Mv)46q?9d+Oioh;VDCH`-IX;((vJIu_Wjw#1(8wVyp~l`$?ZPe+|-7Z+WS zP&bu3FuLl<_iV3O218AJM$jWl5GP_PFdC?qkj52yM`nduF7f>5i`5Z*P6t2xa<}M* zBEoBm(_DsmU}?FkFJeB+@>-Om5t+yti8}- z^6wK+DPJ==cXv8X*fqC?zZuQWk{V#Zj!f zqN-SZqd;AzzRiAXQ&E)LJUY4q4-PO@G-#!+&qqnzV=7`46D}bt&tj)TaB4_mFBbGc6T!MI!SW{TOo~fRP*;~oa{D7v?Uf>MntQ}_znK$1S zwicoJLib<_CU3!(71wY+Bzqqme}4;bVZdeK87nlvMh%f8k+S~IKzz1)m4J|afrpQR z1(4I#^V*-`)5`DcnXj8u35dk^`kF%V(=p@^O9$) zKkw#;s0@i2!s+$)qV+l$nONGyKGaDJ7be%u6?@%Zuq{>b(oyrL{yuId)7=hsQOx|& zU-Ej1 ze}9RLAsvs&SmB%zBg#e|8|xV34;d@AHxiw#(K@%+Qhyb#qA~dju|c*pCh=CjRhB(F z6U3tVR#6Y93LE{Xu8qmVgIi9c{6?myZ7Y}q8Sv0#llutLspl)k3gRvgdEh?gEn`KI z*=Sa6XgSYV(LwGLS7H@du~8SGXG^^;&Q0zu6cp<==OxYLp+JlHs5g=~3;F6yhM`14 zYwmAF#uX&aWp&K_NVdr6f=o^}`v4qvOEU%P3j7jvLAWp)q{xU>K4i%$?f&4$x_ZHQ zRUR_y@w@>Le^r{%XtX*Yhi=x{Sk}>Kwska*YP6~jCq@$fqllwIR@H{4AeK)g->e(t zz8}`VfCqB9ZW6)uK@!DLA9i)`rly{+NLj0DTrgV_SF#Pwg^{|DG*K?M_}#Hhoa{AG zjSf|4kE{o1RYtzBAyv#~5wj-&DD$y;4$CKqdoOVoXZP2Gd8R7d_6SQBJfm#R%NK6q zg-R@zF*LN=SW);_QW|+i$1Z$`=VeyOXdZv>Jz{nw+kUR&D#7C`?01X7UFd3)HrQ*I zd zX}x_ddF^V6OkdU6ay4037oSWN@a7M z!f#R7l6xPrl^te=hX0NxB-6;Dd>#6?_6Z1uF*cijqnBTz-yoGnpay7`St*z9t;!on zKx{PAJoBkMR#Cz(v+cwwnzML0lqhP9R(+J1&2w)LTNfxp8$b_M+KLyu@xzXa_C<$> z0m=Ab``|94^>&XsqiICX%@j%}MrtqvIHYi=wu5INaK%hsnE56PrM}pQk{B!f{Ui`B z>Z?$)GrRX?FD=Ssmq?e*f;Cj4lQrV*b3gEg$y54{z=RCay8)S{%A?+QZh(0WQ3CbC z%>%7SO2SnpKBwB`mm+UxiqIo^^xc{%R(C073N+lSpUQ!IZ6-r%<%uG7iH!oB^|@Ih z*(@T5Gg(f0ItR+hUKSb3Ps<>0EL*Qfcq3!_%#||Yr9%=YCZ7@~hy26^)X@Zho{*Q4 zr)$moTMo!I_iBQGuw1UF*+p75KR3@Wygbug`ugkCQ{AWQVTXOyPb>*T0brw|p zRqCG4F&2bKocWg9wkCd&+qUp|TuCF)OB%8h_ObSNV};4edDp7E#n4vI?~UhnG*)#q z&*lyR(L+#5wTEn-QoDI&J@8G;FrF1)8}{Pls&Yc*_G`W@rUv337BS122CZ}3W2&YB zqXcGxFdH|+)M{`2rMS1+5$o~69k|2TqKLkgYt~r~7P%UfUJq-f-#f@Y`M@Hvf#%~j zjESdtNJb@@EJwcehCKU7=u~#a0nz&*>fCbC{VU_C>$%gAm6F~JWw*#Cl&_d{%*drB z#*(*r5=F^YX!P77fxpQ}{7uq{>(sSf!K$8F6Yz=-^p?H+6dCgpcJhOQrtBSE_mnIo zQMN+9I*(P^?fP{ky+|~%Z;5E=t^SfB*zaYLmwe?oj!KNXoqVDGP1M|9N zl40dys(-pq@oom*wgaq!Xsuax#1t8kmzbIHw@Vig{Ew8(mP>~ATilMh(7v@~As=P6 zqc$fyKa|R-6^jPv2HV~10PklBxCH7f>uvrMW1WUre6iS?mePTDtg?fd{)pjl5NNj* zfusm0{>O6JA{)T6PCWyXbpf2fhjo!M%9*e`h?iNk>Q+wL9AJ|pLuppuG{Jzlm8z!N zscB#xpXc5PAdh!Dk^Xcm%ZPGWRbU(ywng2xMf+v};%&2f49@tTL+`x(BcB7@C-2nT zBJG(ahs6IBlQQPuRn@})>>W$cfy#IO*e@mSa!Fkf*}y?JEJggSLwU5+zC_~XM>yJcnVGwQKZ4g~iPAewaR>g~5 zwp2MJhm5PY)ca!iog7ci3q@vxS}tn5i+vLe7&!)^4_ZBg5P}DBIY6Q}gqn6q2}^B` zd^c_^kwr(&cphC(^mjRMrV5s!zfIHo;^_NhQ^Pn+WEYR(0^NM$gns-I4A?kfY=|c- zp9^$Hg>@Pi=#DLyk~+7t@=KgiZ0URNc;@0>tItOJ3F2?d0wvzm>NV<%o27wCXEOI|PCn4TT|sGr)akgb-D;@r>f0=@ok+ zSmfKGmMMMq4X<4}G{g2|RieQgG?}0$+Nic7DKzx!lf-KNw<^KIGP0QJR%q%zr28u~ zu(F+|`JsBET=?s4c$W%^e4 zYUUi9_-<@kcqbp@tc+3<-9G2}uTVmq=RFVaqwE2GrqslpT(IT3wE)2+KFOovUg}xeX{*Mwatk>=MHC&F%2_On(eb7Ct5bB@1H!Geuxvx1|u0KNho^?6t&v@xSA^lKhiWW1%qh2~ktOcaI zZjR^EJOgC{#bG)>-VCAdPxVhC%REudKDX%oxcXz)oX+bZTTSO)9!}nI6yRaU4zW?n zH9AqX&crwmxnj-qefRN{mo74pxl}CPV*S{vgKpWFvEqg zvh1H`;AJ!j9FN?G7@Le&H15;VnkpGNL4+s&h?2O@!brIZndu(;VP>ma&-xri6y?m( z0tb!jF}(X5r7l7Fq>&uUf*Hlm~>r zl}jRlb1xE`4%C`YcCjR4fYK1W{O6P3KRVStGq-LW7whufQ>Z*SI>=V$RYjR*)%A1p zbeqJomu&Cnj4nzZ8e}Xzk>bf-9wdZMpd;B^WGwZ>CGQBrt3rSze%5!>=>wxf3w4a| zgEXqUo6i~GSK;?qSK$7FOm=czVRFGRFYfbM&ycZQGAbk4U1&PSf&TfBCDF|7sEhCC zL&Zz7f8RGhW+1XfA!MurB6jo1c6uEf`-2}e5?}n?K7>u8EVe107dzz~^QbaD|oV!6h zBIrGj_P<9N@B$z)m1d(lXeEq`dqh8;Aac)Rt36nm`=b47j*17I-P9+s$73P2+MezT zPjQEPNsOrEuvC)Us!#@eS(7Tfp0;~cU#zRvL-ks8YA%RHO5k-MJ!LxLX^U%~XwP#* zWS{UIXcx!BH@zmg=WO#Snf{zQ)Qys99d4o1Rs!Z&0hj~`J*Mb4G0ER8S9tbd^sh$`1l{fdNqN*?+P}*_H(UK7-T)C+@ax0;2w^AvK+>!BA zb6D@s^!4vFY2$ZpqB!k4a{a8KUc&;WGy21*^EG@%lk0=5;|K#$P*T-tEZzyMvQEJ> zd22D})8f3}Wv1$m=!>`y?orV*w!c}1(-p^x%+$oRX^iW1tmn^A(J((@FV`!6E}3WL z^Jee!X796k@bwH7u6oMk`2-NuL1>Imt%WRs&(2ct*;xudDa-aZX)s8qCiefNEPWUa z`0Omf&(1RNv$G8P>@0&nJ4?}LXBl$*EQGT^oT2A4y=*a8;k$S=9?ZyvZSh%xuZc8d6aDim@K`-%e2~*Q3pHM2s?ZBCe#)^>V%o^ zM-7SvUKVCP#bf5d!p!n`UYb?7>GaQXHP*C(k^m-uBUwt_cpkQ8*Kaxgsxm``Gw1(b zWT(rmy-fyOO#>@8qxHT2$J*P#M^#;W|9OP~(GwIkD%Pl}MuSR)w#31jLuOz`CV+y7 zipniE#cCD9B*r%gOahF@skXkg)qCr0ZLhsot9=m^t0o{MfV}yNwOUH6Juy{LD-^=9iz&!B zPi1m-e}Qtp6XgDv`Svb-+wYWr-0PP2zs*)`PTA8(sHi?Y(|nqk-*3%#>r=MUBW%vh ztTkW8%m0P#sxWbmf7e3wdobN5?kX<-9QykX{Eq;)=XWa9G#oXCf3wP2okefCnUdba zRo?%m$*7w{U;b5y03c}WnKGWPs42LbB!-wv;4x_9d@Q$(m0jxM;5rK|POxym7Z#%B z&;Jfh8!=`nZ5YvGMkPcQ((gb2ZFbySDl4ZVxio!;&$`%ODdmT>=h;wL>=mCcWUs(m z#c(#!R6cuH+-BB$L;UMB1pDefrLR}1y119`zx`_i0bL!olPbgxZt`m>PQq6>1+)og zl3-Z1Z15m!+b|PZVN)P!u_Ls|j^<||qaDl`win~C1_a2u<@9Gdr}DRg`*9p>1!GcnAYg!-im)A^=d9yA4SN08__4T$dk z=6iG(&(BSM>#Z8D>70&*>C~a>RH&=z)*SgCM>G4wYWIb!Z9Uw}>~H^-h2qiu)miM&_ZvYFJIa|R+oF%b>xwG};&tLYGu=HR zu$hT(1DSdX4)iBf-%i4Zl+ft?(~p(U0{Afd2@r&_Gw7bblB-)P+H}T*|54L$3cN%C z!GHWr#ARY%Vi_PZxRCfkLuP1y1~#_~1$oYeDa_IZ-W^Ox-NXB>N5ME^62 zg`UGm&A?`>KH0-;WD@q=M#4KJWW_<`LE?>x;WOrM6@g|6LThiL)VYVf1m1>T39f?Y zC`IAMYOaqa%H-YhDl;YItE=oi)N?CA$i_i>cZnr|PFiU5o{&oV9Ey6AE2E+Ag=YY( z_;M}W&D^Pk?MYr@xMhrwWGJX1engTv!}5zs;45?IN~pV8Ck_|zr76wl{@ds;_+TC% z#Jy!Y6qVuQA<51H|Lmis$@Os}zE7^;)t#ZO=KIFn?|*K;m-xvyh1+6Yx4)P)dv!w- zW`ZW5iT`G~)X|SwU-S2jW#tcY>$%L*w2YV#~J1huNwE_=IEV7>%K zW$c&C_Jpf#z2~PQwQL*!s%hwx3cta7?+|=$oc8%_XS?fWajy5wopjG>k4cdCo)GOa zkvg2VZ;*11U<6-96?Q+=YOMMu6DypQm`}Wca?~vS1nF$$ilnwbp)FHN-1LRJL~`%E zf_baomHZTP8zs-Xuy*mj)>e9Vl&al^gRH4`5!I4MQ6O64?(Qf{3^kV(Rd?psRVF(R zMAKh=K7k&fewP_*Xf<2#ME1aSW)BRvPb_lU-h$?bCRa3nMJ@=N{e&v#(EX0@o4sIi zIc{D%nt}$;A&u5jld)Z_D-T8#_B!?9)qDv1yvq>uznG6FmY8lXFfV5GFl~KX1(Aqq zx^)*Ha!~A_$sU7?rTdhn==Hl`2Zhby!fuOkFek+C_@yQ9GGt%;4e=IDBh~VUtaS5b zb^Wfw?r3Oo?ZP6Wg4Z%_MdUYy27umQJtqTq4JUwmt>9jMxs=ScW-8l5(E8p}yy=xh zxAYfgh)Ji@KA5k%BBoTYf;H8G3F^k#suyAqgpc`>Mp!rNVIrI8(1=>_*$~tE(LOtj zBQ<*zz}82uD-VNgvM%uMG7B~x`A4!F)Z9YVsk&MIHNO4I<*Vea|Hw;RrRX)u$#P`) zYocZh=bFz;f!=Tbbk`2m);3f+FPP^csFdsrCgakG8Dq=stlgf+A#n88kj)~L<-La_ zckE+iT933X^mp0`wf99FZU$2=4*!O-xv+d;HhLfP;Sm~Vq_$@>ldBSb{)k|&9Q`Zp zmBe4JtAHw4irj{lTwK%xCeDr#o^oO$(Od5^)GJ$g`0peSuu%22ysRbFR3N%nOC7zd zNWDX4AL3zQ8xPV=pRSZ2@bJ7IQkLcsNHp|((^+G*StkgVVj)N552JTU{(iWubRZ2p z37C0_!*w*bzwwXMQ%cP}-+&PzVZjG*bEIumXS6S?Grw)@>q|YYIR$A%TL7#mP47^E zVq^Ur6NDK`4DT{Dm@hM>1j43EElxzQ+F;bui#tU}-O$SmPUU2A2Zg=WcSe&nc}-{G zyJ08S1`Q(6N9g&+ziMr=jh#-Mfn6^jxa4 z1~tKC8U`L=yPDD5n*HO4*Js+--gmXu|sg3viVm(YcN?&b^rT}DG3pPP~ml)T4kU~9Tu#b2by?{>Ko zka>E&p=)tT46~8C)Qw2*PnAw$h8D|GtU~!+i-mc5>{@K>%fPd)#Um)B&$||vXP<-- zN|U|S!pO&*Z?>7XnS{gInS@I^0vnyp#$vI;A2}Zo&P}R+-tFcm<#q7VWu8@)v(l4c zY_g{?@l9&wZaWg0L94y~wBXj0m`Ca_SQ?NI@keV>6?Y|7L{;=&M1KY^Jl__)F}L6Y z*@A;r@QnV72Q56omLEdLGrjh&$(F|mFfTcIbUwaXG=tK!X=ExXOQWu29%QYR?5Un0#!RPKl;XR>PfLt+xP7^|G(C%k&oGfTECROqO;wB%jvUi@NG`Nm*Xg z)ppo8{EbUJy_FOrw070a(reUO1{8DSDp54erDRa`2S$ z@ag0IkNh=7lYi$)rBhGKqR&f~(}AwK5&EpXV^IZ=-VQ*zOnTj0hxdc#d^8EYUp_}^ z3v~nP`MGc&OJ@H!UNVnbgX&(V955rH;BBG@X$R007TD^PW~#ejS8F!ga zk%Qx1P9)x?+@XF*9&r%WS23gW@kDECk@#nvm*C6WZ&w5DcuOZ$roVHo>YS$DUuv`i zcbi@_7xC0}Ro*hyn3^=&Tc**bCXIEyL8(D5rxhF#@l%qTh-=csQVwSPiB(8>KVv3u zJSnIC`P3irHU#6R2_%?>6w=4o0XJiKoCVa~wyfy0E&nlcH|3|8@&q1uz;uq!7F1HF z$^qVIH3Ex38~skc2-EY3cVzFOI3D9kGAXg=hFemTs=}!wfyj+tig+*Zm9MWfDPoH} z+m2!oYBXGb*?c0!f(Aa%Ejq^*m9$Aw!ieu!@a6uZXR!@s`|?%Wmr)U~p{RE_L0Z(A zmOU$54Jb#2Qw>G!?=2!M)F%2fOJ8RC^BGD##w}$501x>KPNY!Kn?<<=U$g~Jx4kI| z`OT;GmwY0(GY?ZTJDsj~ZAtHuT-o8R1w43jaVk^T8Qt?CQ=PiD1Uy*;n8Z$O%WdsS z+uC#V-;RCn0>ETk;V8O0w`h$mDy*>(-P?Rxf6;1~uPm4jH9ZUPE8;CI?LEfcAcFTC z@EXv&vEkH0Hp-WhQ)i(u+w8yiW$=D49Ofu*ir9d&s5tB$Y7iPt)@Y6m`KjVM5$Uxw z)zWv1iC~e4MzqAUvFc@EmV7?5G7sKg(H{`MQc8sE)fes@{HDE+aGPc`756QPee}b@ zJjS?2dkl>+kADIRn0*G`S7_+{ONK~ZmrJwLb|1O;j$;z|eV$;{@5DN8PS_h74&kXd zXF_uP9eGXD`Z_0c70J2t{L}OrSS}W)>f*hZ z;J$8TfNuZV{}__jJAtl#@?Wr_IxKvFhXD6B`HQ4?q>9%{OeBmG^t_R0*ym~fYCRBL znr`H!7Q~IfETMR`0E+B>O~y(uDLbrO`MAWK3dFth0ovZw_eIRSKVW2QqDZyz7E9iw zJGk)9XGyxm`RYJtpL|mLEY{hCWQf$9SJqr3IRi7=vIvsjRaIec3xFIk@g~?^U4}G27R4PU+EkHk<-O9GDrUM3Og<%^skZ63Zc!FM)Pcde3#%hSg6y?u4la4ftxCWg6Pt^FL9fyW@Hy%VUo$+OW3tTazI74i58 zkGSN?og5lni<6K`OhMIh!;y(Y_}$V}|5P!BddIKIL%`}i+5C{PAu;0Vz@~g-)2Zk5 zakzZLiM@l*k?r_`qq%f^u>Gzm)YUjN?dH3wR!s~oHJ$Bx<{1v>%)lNs9qlvdq(~4K zlr#?FZ|Q==ICbgkE9?wDg%8*cOo;7#eNchhRV$|2a8*^55;w%yGkg_~8OBP}1Q*SG zaGXpm5?faBfMRJ==$|uKZfLpTu>PF$y_sY)zXm^zHHH8C!%d8VOQJ~=c!AZ2EHI9~ z`M>eNw=NSWou1|`){qw6a1!YAFsDzlhNP5G*Iq(n@X4YZF}vGyiVQ$BMRxeIj5aI0 z2}P;JV#d6J)MB$nmW-s+L?|9jJy5xe+TC>R{&V)jI6BMfOzv&Mdz^tXsfUqD%oMETI}8Rb6k)vYo-AS9 z>>qkZ{Z!E>R&j5?&yGp=0$|giXVyBmagyRD#`+#EK!Ltu|?99lx~0+@bh9 zJhx|Wt5Hff>MT-fE-OzoMr$ssFa-JAx$XWG#UJfnN4v>qB!3Kr;eTqVK$b54Zf?mI zTQWjPH@Ppj*wWl$=i6dmQZddC&{C8>hCH$%&(0R+)(rHk_4Rg-;(I1_ec4Q85WR7GRjY!r9TePX^L?zQd&iO zPv)szPhIWe;ZOKr2v1_O7k@OE2n_wX8P?mDGd#U|{fRtPFC$lE&gm{tzUwg+{w?E$|h?hbZ!X{5%XVYF^I_y-;p?P?da)xuNy(-kqYg>%tv zuA@EYk@;mz+6brZLh_6rKeW+Vs`ELE58fK015)tzw4_9*>NTgT>tpANPLdvIR}wET zIcIKlmZ$~ijF)aINI1?Joz88K(U#NxOZ`3LCFhbqJD2p{G_R?FyqnHw8ihD|B}Q?? z=VnU9Cvc4peJA;vz_-l59?fFUfAjsvh_UvToijB5;x~;nJI+?3ud|=}A-?Lp!Q`O& zE`9*OP+&A-3e~Kp8uPs^kBN$H&@a|kZhu3c+!Zv$y`!crdHfNqT2=8a1z&V7d4seW zrV4ycjegNW9n+xKoh7TK5!u$;?)HuT;N?cjcsSr?5@V=k0aA8<6N0nX;s9<=?iCoXd$CdC3~*%;L-b zI3%xmu(qZ}y=9EmUwY3FCU#VJZ-KY*Np+r+hg4}<&&k59m1b#Sp@^>xK%o7|>zgHaGnDHz3L{jzC}ND6uEJV+ij`29s7yr}WG&S~2;iVP$^`0oD) zNO)@wh6M|JVn*Kdx}7uIOkbKEq-6W(8p6xnXJ*P8i6GgL7y)u0pTSa)!=G?@U!Swm zkRqqb60@}Xxv_5@(onq_m~FYC#O;b06;x0#DBvu6Knos=y9Q}|mfE0o++pytj^!1P zI6@2n+>!ScCPpIt(ez($$RRjgm$6dcrV0Z;)>w{x9x<6<2)!94<;i`eI7XCIcx&*; za))(b%?;kcF-Afg8ea=~B(>A|M(w07akE+_*KNroRE7p{L^x>j{e7K__sxgy2VSAq zQ&irWTJJaJ^y^IZtNx4i@MV8J;$wq)2>X<&=b@IIdj5t|yQi2;ulR1p9Zkn8TjV=@ z2QSP8J3W3(#oy-*_u*!KkaP01ma@|9vEdMa;|KrXjq(px61U46zm8x_Z?x=wU->^$p5>N4XamhSn~U6A6hC zOyh6~fLXp`w^liv@71 z>|QSAg{cB{$HU6U82(Dcl+z^#4jsS8tqymE|Wpsf-5>h zZKb#uL3W5FyhsT@EvSgA#B^R3@ZYVslq($drTI;tM2WTQkF+CLu4X;F&#cP)at6`! zHL9k~ssa8F&I+t>FUVg`Sfp5fTSwCeJ-<<##kcT9)cXviyM!lr%?C*at>*CtnJ_jL zpw~lcCv9Jaq34hdmRZYqHPm_wY%*?t^v|C&Lmk+KJ!R|o^1P-!QCz~Kg&X~O`wY}g zpMwq;Q%_GjJ6be-QNEGHqlGWYzFmcwl_SX4y*6(;AN83nNAUxkwtLAXAjvI3Eqm^y zmUF2kVm1D(9dm+U(oa$C9uZ1JyGz{aNFu8mQGC4aNXmo-Qf?`^EjEq~!EY21r~65i zx_Ns(bW>?@bnv6iXR}v}B5b%U2Vsu8n3c5w9e%bEO>VZ%V2WFxk#asSaip`NeF#r( zGOY!d?=EjQ2;-SX%!NwqB&J(_;im>@JNPa$%i}cMX{Is5XCg>b+;E=}j-%<{e6jwa zVTRdi<4ehqW`S^3p-Y@*YZ~F1wNYRA%nk}jN7>?X8>&9l#_c|<%{{Y!AkEg#&(QtR zmhNwEK80KF;NY8vdu?ek8*ZxY4*m8{AVFN5n+o4CqW6@b(1wGGc}mC@V{JQU-g3u? z#^OjSe#Zzd+zVY)(zsNXkkharaJ|>@ZSo>x>12`fZ2M3HKy%aEXC#$*?b36r_aA7y z>FN2o=a+~boJiR@oN?;BrWS8a^s23T*CdtIgijmqB!>)PNrX=uHzCz__QN8}r0V$* z`&_H%$L(`i&%fi@g}*7QiJumACh(_k&4kqLXKP#K+gU2pZJ+1qc{|Tx+fTDSVSA3y z)Q4<8(ar_d>*HXsjI`#xBvaMII{r3%>`7CGRi}Bm~oOQ_CKr&fdY1)E#;- zoiP{s`Wtr(Z)cV`brXAWJzqq44dRnpJc~p#5OeGH82gn}2IdnfIqJP-ww7*J{DXfkN;Hx6J)eAn zuR2H9osk-5rTNT$et|39EL1yO1@<&rCa-8IN7y=%iG=7w;~OqcFa_>208)X-2%U;p zR$p_6+H%@P8u*&q_1v0e6{IyyrB>Z)m+TnIDMIH?91Bdoe?SyaW7*2-lIz`}(u&4q za>Lb~OpLx`fW^_mZZuoP{xi1?0Te4$GS>M{aebk=43MyGCOrNy|5(PRYe^=SMNsEj zD|);(-L8p6>aWWxDRUm%ogVcBZ+Wm+`~D#Wz&s)?4_+J7LN4+4`A~pdq( zp&KoZ6+UNR$&C>7-pXscCMh0aUYBewEU3ciN&_gOqWN3(0Tjf{ z*d6rB+sw=q_)n4^4>Y>pCRt&>TE=iZwYA>r$C3w%8o!gCvcI#ZKz^g^)1@Mu#=pM7 zb*^m{YB`r8APz6k`|@kRUFXvEyq{NO3OrPrDS%E-CH_dSi6FRxpP--uHF6ImPR5Uf zHZQ0qQ?+{QstF3HPuO%XAii6xVK+@%6ZRXQ)>@N|<$>FWb=emGu8#y1_KI-o+c{IOI~tk# z(fpWYQN=^YHC?; zp;(3hCY{dGH(`-nxJbO6V}*$8Xz!9YR^&CEKs<885cjQrX(!vKU={Pso|3vdUw8;H zwY0ON=ZB_}&eUQBV&5GZjUCbnhGf>Evi^_&7}2@go#hir3Ic#c=iVdTZRn$0zvC^_ z={c~xb+FMT>6~wU4#;Ed))X`-%mpht^mxN3a7Op5gbig9P4?zHsn38| z?>IMka}hn?)_g`Tzv8Wi|LJN=stq*vs1)0h`rbT;rWZB76=UlY%IKyQBMFz4`>zhq zXG+#_q``lYkhX*+vaAiGo1X7_hDFq6#+eA1I#&*dwmV6Oo*PEXFxfquKQRWugLU$+ zF-Z?__7qs$zi|~nK-m4%`{EbSN`q+^a;UG}DY)d-YzRG%+rnC={_LE>RTPeOnHy!* zPad^a^@e_e|OxrHv-df5#>` zN;p0!^rB6B8smqaVWd&XB0cwgXr9OD`D31=gn$$)gd+b?|KItDQ~p%DlEmKS^}J=v z*Wo6Sh0&4qMi>1TvLc=$i@tJePVU~g$z5x5H)K37DRo_LsTXaj|Dsg?ah0)mw&!i; z4tuVlF`={LIPMYi9dm#G7$hUH9M(8A6XrTRS`*vl@4v<7s_&e9NLj;&yHB^dZw0wO z9*`S7*5-Buxwj0+9a?R3e;VXoJ|Oo2cyYDc7Ub3r$bI&3o7)iNo=C0<_g&ZDw|!%5 znF&D|IfFJNZ=PS&#I1dq0le~MTj;o;(CZZH&wVZEV&Bbn@J}l@`Sfyr@)9|QxBLxxE?8-!jEI%bZXL^D8jK0 zZ+_Yzj%2fc*?9&v{~-Xu%5pBw@$W`|x0nHc*0n!hGG74}x^K(=0& zM%1%J01s6YlwwLMZtjsQKQDC+_em%u>*~<-vc}Ds+ojS+jNYs86zlwXH)&cDH}~gE z{7=DV9sUO<=imBs#;>qBV{OhPtm4Z-8tlN)MCq)z_oq@kCC&(97`(9GydFa$=JAdCe~sE~Xh{coVY)@9Nwuz)q%q z0^mKZGKyzwVzs19h!}q;c~Kjag$x^LMwgm>pd1ueV<`1k z+jNuQc_rEO|F-ES0Xxee{c!&WHr*u9ywbg=4F`@#;uPs{#u07gf5e_+36$(AGyJ6@ z1JPWGKizzOCK(ld>q5U(G2L(GsRsXR%0!YG$G|L8@8y{W1T@pz5w>-k>Sbo)Fn|Bw z%&5&g{7=Tr-ccLdITFV*6z4FL@Q(XWa)#z|I*8sgHpaWTzR+pgE4(rt%*2#XSkt_jj;YR_ro*8?DP_P=)*`g zv9L&~-rRepTdmuS4I!nxN;^SmLQ3faqF(9ajS&K9Rj&`NSuoPuSlvxj`Oqu6J;IOR z&~YM-_J*t1_8vWEef1jU3?--9xc?W`PuKV|EuFgq$gIIY1L#i zOKxa$Q&G(sM91?w$Gqqr8t0G+MGNG&z+ZNglr5A`kAE`CIDcp=8~H-0-tyj_s594oF2c-+@`cMGuE(Y@1q6DYsGa{xPL(||d3*aveM+DV0VXkwcdGz)g;%U~OvA4+v@o;Ab;k&$x%f~?T_c6Gd8;NZF z4@O|*v%GTv(jsS>JQUo;Ek*WijD0JyZ(p`=rS?r%fQG%p!Fg_vDk9J{&{|Lx+w&2> z_yKPZa{(go}(xwSUBd8eYAe_B6xgKHKO4n?t-c9LtOn+Lh+ z^DuSpj-@Z?ix;ks&0T}KppYo&pPJa_8(J2G5fJO=ZjSY>kIsFCAn5gl8)Aho_7^yd z0;L2XPOhnSLoI;Nq5l?y>_gMEBh9kDNrB(z72KI%mChF~mNA_5ZICqn^9kCwd%H6E zZ?_K2Z@2mX#eV+-vI0hRi~n7len)0{UWj_n$5VuN!o_bofg=|GU28j?G%JxF>)cmdSR7ij32Q(GPu*^H)cH}M#~d06RIg}wRZ zct~AehQD3s+lBsJU*S0MqP|%AcLtF_=XCLNFiYlWc(=|{i5uQlc{lZYFf`zvE;L>3 z?ry6zx^iRdiz4Ix`(X&UVibpInZ#5?ybrJd-YesmtH1+Pfa!1L+tsLZUhfL5i_l?g z&Df@L{+hW<+Ns*1S~(7kp|VGjb7a`N95TJQRh?+oeHPdzT>j@mH{pg>hn=Zg5s*n- zTj;j9p*19Ichi%IjQ$viw>MlEON2w4T_;XBYYT~p^VstdFIF1n0}ew*L_(brC(e-s zn%}FeJp}r;qn$I~YM$y`q@!V=fr6rXwN8g=ZJjv?mt0wGPI^~vkrbgb}ruN zT*A@c<=p6g$%c=e*)O1H8p6UYf&oL3{_mNQM;CY1vZ+d&Rbek%CSb0!^Lu${=Jzusa)nqF~WS9@|uwM zm;eTN`b8XE@cZRS_V>6te#6eG;mXk;hdETL7(Fz5-VpKrBo69ld};Mlu2bfYaL!!U zd=x|La?bQWcAeqw2xh0tg*)2iy59LE+yGVH7pz@3^rEv=N?T+0L^Q?M=uLXUXPth5 zZgA`fr$@At8`z`Jts%~to0}_nIDbD)Y;mfvW|;N7fG8V^VNMl5owZT#DpQ1oL-Pp~ z#Bv3z6;n`&tD8%ms%<2^M9K4uC>kqK#VVRprxH6=G*fA;M75Tx)-N4YD~YR{Y1A|x zLm}9SLeR&9ViI&C9C~p&!x7 zIlKFy;b*_~4h_PXqDSC@7iY;gK@Kcaj>ordU%cl5uX%rVI32&*K!@1@mKaUONT=U}Mdq{3zh8mCh$eG=#rv-;ZH6s1j%I+Io zyjsqgW-F({QJj|$rRxvT(DtY^X**gO2zIUC{HAp9Vfa~uE}}x;UMYqSinpmAt!!uS z2t$xDZ1Dfc#*Z+v_<7M?clM=gta>i-C9#g9;S>wk`&B`071Wk^QT0~YU8Dc2etItZ zR%8E&A+xv7`+gO@g^*VzZyu4C7~z@^{iSCJVw0=57_Rql>q_c3X3}sd4g%AqCRgFM zd9gB*byb`RWG!xU+C$kS;ilZidqh96gOMPC+VeZ&3vCtEfpX%QEk$Cq@b^Q_kxcR% zM6MD`NC*P$jTCD!dCK29wN zqCrgws`T$C#r1SQL^1X#ZtBq8gSldYKn4W4x>VMpqfJz%vx4(>@9v*S-Da!n+{u_X z7vBAoQ6%~2tL{l~5$izv?TxRvr{c!I_rVTs;BmTR+RN%$4~4ZIK2qnZT3&{`+Cgx^fJu7sg5 zNa$Zex3HrWNs196QvS!inOEmf`3}uC)Gi1iL)dj_MhK*7wxzB*|~EV6&4=l zZ&1#39L7hBCWYb!MTsJKv|H=Ea6yS%Q(IzQuhnZQuchYo z3cYfXQEi!dou=0jypAxh?wAd`JM+!s*PxL|!lz*tEo_|Nm6p|%H2uW&ZZDADzs6|) zo9@t+TOCEj#cO=izy$g;!iLvT(1k7jHJoQbMNXC41~g`zOODRvLUZ8+iI5Rr|B9u`5AY{ zYJ*tQdlFkfQJ5`ZA~(kZDXxc(_N7asVU95C1fPz?QL*%SBPV!8Lu&GyMhh67C2nYI z<9jlsA8U)89!nFs)hjIleuo%%*&@9I096QcaS)(J=K=~G%k_}R0Ls8ejHwBN+aCyM z4s4}JaXfwF{HVPp79;MMy^2ykCoJ@6tZ>qNgzLhmw>oProI(Er++#ZpjUsLNlNd#y^8gBYl64QITgxA^1l zgxci;EVUBbKjce znn8uz!`@#)mrrY+OiZDu>%HtZoCO@%3dShG?|#u7m#rTMFPgeGYS@6(wbQgc)Kd`l zM80$OHe+2nFfp3CoZN|YcVSe!(i$2#Vuu~;iV#Nu5(`|)&YTo)NdS`qs2z? zj7K7h%U05&ULM1!%1;cN=q0L(+~m5Uy@T9mMVMAi7r{zjaUesqw)k(J)Yms5Jz`9d zlAc=NZy*VEmH1^?1sJp~5zbD2M{1PhR+24ck}?pLAH>u zdG}g^JT;%LsXBC%QB)A7X12L1ct2603jZjy@x+yiauBTPmU6h>d*0t#A@LYU#6r)D zC#$V>?&fsiAn37GW+Px{;}pd_KQP84`Y;Sfyzr?V)Ee_v3S0y!O_X@eMagxC_7*>T zC>ddIcj)?Q&0m9)XF^}~?_n>}gmRcQHR|u#%5lVcFmT0JHKkMee_GEjKI7acnz~_{ zHl=y16wnKckZ1Ij3( zHi(+a+4EF&04C<(o5`ZyFE#f#S;g_MVpp=}y2hTh8hh4odcmM*`ub?ZI}p}voE!D9 z7`^^_E~R_Kne89BNnB)M*k_KR}X#pSm`h8Wh&Fc;8rcrJ0m10T|y0 zquiVs0o~sq$<%=YDYHX!gu>DO8d8uzUh(H$DP{1H_1+66I?N{j>tC|a>I$HBuyV2g zx^i>B8UBz6afX${q0?T`yhkU7tR z|LiBK0}pm82><2&KCcxQshf)EKT_xW^$Pg?QLS^|+K4mpoxZiW%z0~_$0ih|$45Ag z*4Qq+y!3+W$2P5PLo=9X2zADi4r|Z#x1LsCt0)bqZuV=f3u^w^mcP(O+N- zay+2h#Tx$>9=5|aq$y3Ed!UyH~LE+H9 zO>3SJl|u7nKP2&z`9Ftu|35a$uyi-nig}T8#j{Ix;Q{=9q^7B?`5V#n zta6FjS^md+Q%YfcxD@i4-rQ%)_YF8@K-xP$a?SRI+cyoJW;`qvvdz>Qen*J zek6!&d2;PgupxBqv}Vi!fZ}WZC#M=HI&Jf`tW$-Cy$G#J41h%*y-Z)23yJrcXCZzT z4sVj+dLuaJnmWjJR>+Xw(4)?s1@5pJl|`L9!61KS=CdHz{{;!MFD4Y))S)_?E%WQH z5Rs(MChpMT&@rLbJbxJCZ%hz4>i`g7cjCCK!mxvL+)%q2?~p%yQ;JBCIGkK9krki zdylFBfr5*}0_dd%ps)B3Nv;Adxzlc#KX|>NN---(~usk8Nua=Zotwc{HGSQ@x@yf_>C01ArU>vs=2}oBp*x zo^|iE-?KkBDeFn|bdWxxWZ*8qswMsg#U6s_ z6{}_e0*hLav;OKgfD{=#G!*$l5?F}EW8Qlf$(qB9mAl=V>x!JE@A8&wzZdf+mHal} z8}YESVs+)B&UXjnt~CyayyF6S-C420S+S;deJfc9)+~<~k=dmC$zLV8aP>KIJ86!) zt@{a2CEcj)6W5*kFS57hbW?oOb0oP3o;T~oS@Ci_eO*Rf`g3yBU-(AqZ3q|cYI`H` zRUV`1MA6rC=)be#NXyl!zU%ar$VPKt>zcl%znHO#fH2Y}uyaf|a=PtOHTOf%E%iJ# z&i^W324WKWZ#hK$_IVtl(DaL0hE`9@rPW$_6%bV?!?O9WAgI9^bsGLGSHBdT7gt!Z zC?>YqC>(-NJ?5IUPb1#l`I5aQQn^=uGq`1zc4+A!OLWYf= zBKeS2g)tUv^y6y-*6qyGEgPNT-NaFju|52HhNTvJ3Nu>^k1EiGHOw5Ab&LO-5ezAZ zWt|;dcqRU4R%Z9QBC~I0P`ZEr8i>>Z0JsRr`tWe6lK50BHmtfLi@kxFE*=F2AmI8u zD`;}cIj_uJ{JG>caYL-YzP0JG-$fsYV1-uDPx(HMNvr{JinR z=K7q@mSehWx_zd0I}>C5N}X7;fxD@(m6=HiL|-#C{j6qIezz73Q4b4=Pose$xzX(@ zN<&7WX97t*BU(}KwdF~uo8ZL@jb47pv*P-&LMum*FDy!rjnJFE!d>Vz(?t;|bss07 zkzLZza>(s^TLJ{eOEuY9%td=Q7|DLB?!ig3Duuvf4FZ3#+7SQkr;7M5vfOGowFr)7 zGjWHs!Wd#yD-n)KlD&}*?PWD_?}lhr>#%GGJ=FCwwYtq=Tt@%k%@~H)E$Y~(HG*D( z%nvI{kF?$2uI`Vr-G9-}?W)T_OWJlKZ~7xx4H^-eiF)t-U_>_@YJ6_e(+gwiiN(F8 z=8A~)bTDn=pcp4T8J&Tx?&%^L^*0{g*LPmJv|5a(jp|Gg?G+^I;MtnNSP{P8wq;G` zo)&05lBW?n!>NaipznL{=u;zWW@LL@AGoUTqcTbN8hvPu_WD}5Pom~yzL5h$=+!@! z?j#p^n0l)M z_(w-TyB3_%uL5`ofN7GAuxWGv3gkUd2XOOY+U*A@0p^hufK1{#ayxNQ0bGvAZb-$n zw*|U?A+{5u=mq~*Sh$D=W&}~$2OK1}_nw?1wr@UOHU1N^JwqP*<#)_Y*tZRnKj3k zS;vR=9fBjKM1_xQA!E$87)wE@5N_Um9p2vbyg~lh;RATtDFyzCq;TqpJqhk{n?cgy zN+{d|U*T;IG${wbF&8})ozZb;km{2v*$07MJLN2)`se;P59M=W*Voj0^>Y}3`i4n= zh(Rs+8bl-5egj#5jc+LXt84i(d*RGM*xA!V6)iY_3x7Y1Pc9Cm$0ePBFz2 zq}XZoOcSYDSk`=%WRW?rXjYu-=a;8u zmm_P}I9Pn$Zz$G`B|tLmW%%Il3Xv8aMlo z4^uljVP798eTY(R^mm|T!1<_t%kQBi<<3ZB9axLwz4%6=D6*#-VI6(k>s(Ei>?>MO zAv*ma*&y8!r)5;`cS#29=vm6LT&2j%+P#8H9i*(e`w$>lR}xNtdw(iY4Uxl5Ry+u|E+u2%d%!L}$D8n14aq6ZQ{ zGTXD8Dc5_wLI|j<_323k_M9eMy+dbx+(3tN89!fmOLO07nEqDyoBmxVB_?XZZ&bnQ zZgNmTxaR5^HoAc~c~&@OV?+9fJuRDQ-}Dbi+)r^BQQNhpMl{>(PhkwK`s;KUXBcr> zMhU_>n+YNP+((j6n?`7|PBO#Y ziM7lYzwG;FI)W&Yx6KR2Eb-zAFTt*`R(5`T|d?az;trEz7H85geuPNPqo_NAxp9jv-{KRelf`IPsBtMs78mq z8%GD*(&D~fo`z^Fv9apJpf_SM?l;v3T*YkdF7WkQVdf$-uEd7UNiDosk~Iq911J!k zdpi(;x{!}k?g)gRK2&UB?}MxwSi9U9sUBDyqZCuxzh|Z4tPh+Z&N|Qohm9Wi1^;N% zgPw;qH|T-c_w-40YdARb)XmisWd1&ofZqN4K%3YYgt?X zNz=e2YBR8m86eCuTRa5ovmc2qg|6^itR+~h7nkqZZp>!(9s6E#?I7o|tDtBb{GS(V zJ6IP@Pv?YU3(nO3;iRAfJ}c(UgaU1bry+yQ$RnM7sOe~mD||S}?qlp-I^g;j zu;y}MjpF;t=czU-j|&b{QTEfZ#EIa^Pv&Cx zWXc&i$rjT1;f~H9Y4#IP-3UbPGvX20PR)gL{wW6zpl)0nOQZG1^2|SqcRRBrRghHT z7b(e`ITG>7SyIXRb(0IZL~hB^di17LC`8c`#r4Mi@tnL`RD?$}f`z#~`!ym|&mk09 zB}(J({GIXhpCu$!*_(39wyW%)DHbSqphB4G&P0zoWvJisxw=P181>GqB59caEs`SM zlq$v9P8>#US5h0xK+{n}T@)M@RF$4m>VJ*mB%umYE!1#`f0B~CBk?a@ys%PBP4hL+ zb;6rGGp^*0&xUoUZqpEBIyU2Ko5i)f@Wky4ho%;Xc`?y|#s_xZgilc)7w`z^&C z=As=FpSB7?yuxmCKSAtMxE_SG?3M#E-@>k%ndF1=?FaBiztS|_dyX|8?AL#AyfI5`8lD}KGte2aTwpBN ze?ZDLjIJ)PXxwfAC+0|S8mDCl3TN4(>=IP}v;2{9?hE2r14Tx$%Z#AMX|EF~le$>x z%X%_8 z9%=rgzk%){GgyxqxN!bf#^yLTj^v!(-;PRmx^fr@KT5D>HrAJOd(^=4vD)d*FVrrtlU_+`7 zo4~0>{*SVmkabdv8gy-Tw*AK24eWc51PJf67m89_Vd$De`@>FLoRMPy?KN$Ch) zO6y7#o97x_vdKe~jj=2jc^m)@nsz6TO&&Qc!Gb%+5 zOZ@Lp7MlY(hP`a+p2D5A*;f3?K@+Ql`M9OE{es`nKFqvSSE$cf_BaoW_%~O`qCAF! zK}|*CVlEX)_cvZS?<&HWg*QbDcgfKw zTuo5-p;iId)~@=K^@$>cw&jmL!ds7$!rnG2TwVQ#n5>fvchwheO+1V+A$tJtRcYk= zE+_$MF6sR-o%-%~z>sPl67;TDo8rc6dC-1wm>y2!p+^sj9le|fG54GOiIV2<&-reU zb4E626gk2X=1e@rJki~jfOUYo?>~qQ7LB1_hV5mQK(pAN(VM=W&<(fc*JSy)_5Mo; zXcqYb;{d2xktud+rkHT_kuMa>&J~oj+kas90o{{0dg!vDhnTMq&;9z^gTH1qL%xFB?sq z*?AQ@%xzijp2(c1G>q!06`fN1(ZV-VgBs-E zx30*vM&kz>A2qX$AyNb8a1D{r=gyKFGU~eCqa)_VfN#vnnalN10IdY8-R@sox@BS@ za}K7~PPhCo$Y<~o928%UTkG+xux!1e!q?k+VKQKU(f%hF5m!;AqM6oJYVyER&Wc4R zdR@4j5~O*73WstFe`#Q03A<5P2eAQ6xN-m4<6rgP8AXNDwvde4w!Xww(R53p(Z6O_ zN3B-Jn;&Wa@88%#9D-j?`rIsp4rMa=wZX2hOig!sa-siFHjk64*5oSdqy&&^L*z^DNH$+ddSBFtawZ1g7Tu&)TGM z*`xyhe@F^@Q^vyEfvmb;NA}0b&j&9E^aw-y`-}glWXg`7uS1ubk4r8be`w+;E3*HU z{UMN*w)m4MmDvMlju+XD(29yX?X#%;sY*uVfB)eOZ)oC5Y)}oF5)HN3wzGxzF>iF` z$%K&+j^^Je{#Eg>l7AKan~xjy*wJ4N=XKQ<hhxA zkpMLVuFo&e0ay88#Dp+ZoEud5t>Cwe-%5UU+c^R7CzkR%ir*3Zj^=kHzXUWyyh*KS z6>$DTmWS(>KFHtv9>pPHE(@A&NJl<5!H%MH;VoZDEmbMs|ApAVrL8=RJP#f7hW)&E zZnXWqh1@cqbH1O!lo^sSw)nSxzyQ7PnNRz=w3x;%FB+y3+R&S~ycD$Gdt|es0iUli zW^i{bN`&l2iHxPg1(@W1tk3NC-jJT|uk@Q}M0uYzcHsNCulK*ly+6iM)61s27s5%y zcTXrA^F}PSfbb0O)~7V+59?D4c5p98+^eWh-Mk%Q+Cs>*(4U;-jUZPnbv4ePvnvZ? zshcZY?}O)rfbKJ&BhOiWnDWyP5KNCK!#vhO#m5hY8I&F{XDH(#9{5em$j5Y?tqbn?^ zL=hjHvJquYShgUem!^(^gCo^6KcQdiv z89pN489qCoQdj0v;F|o=bhU56c(yI*Zfz`G6sMsr4b@wmmD`M6%1S|NL(?EOUG9qG zxx1-|=Q7ySLDA&9`Au(P6HX^zbXFD;$`FAmJQPM~jorxJgPuHvVU!rY7HJ!=k+w+6 z1OnI^Nn5C3q;KeViNx6X3fNKX&wWVzLVcNki5^my(V&dV2U6QF>X#%>MHNp2$yPSF z$(A^<6jYN>NyEm=PX*ZYk6QI3))@3uDWts%j-Q%IxRU;ZSw1Qmp&_+d`^;W zUgFUHyi+*D&n^}wZlElMGPK{LDifc?-U4AyKUf9jW8N@0|1RMXz}t<^iuor3-?-NT z)aL-_d9X~_FEwyGfoMWQ=&c1O$MCUb_B)-G@pc8%8x*aX4f3?zt^x!e<#LeCjc-M{ zw?I9HTZ?%u<)$1-0-FEqPeoZEVR3>138J^KQNX!icb)tbYoh`F>0@W*j3=mmCvi?* z^K?zkpw?TSD9Cfl3Yw-)0FRGy%FZj}A$}BijHeZNd=z+m-e{9Hx_2h)Nyh50&&+NZ zoBfyb%|@Ec922;+WuX9pdIGH6F-Y}No2^&t!`7?yVe2g$?VVTZO(-!DpB2RMFUW0i zlpYnFT^t3A34yDUQ3}ga4-ZvVg3%4VO1y$0?&Pof>z2E9&#r`PN$z5WVoY(M>1Gb46}^ z3**(Wl-p!KSyaM}h3OdV3X5@9@0C&P+xh4`Z${Z@6`dZhUhS+rfDSu?==UKX;6;67 zF>37I!9*c&ovCYxQ&6}r`a{<%U6vZEJB4DZ>y^x4v_z{6EHcBT*R;2W&>rs-MUh+- zNQ^XdTEp4~wU3LYuNW=CewbYn|G7tsgf(c9KFDwC(NUMdnVTNeq7rM2J{#RlDw4S{ zCBU+tKSy`k`}ruR)pW9X1ipkmPE-5EJ(@@U@y_?O2LJMA0;=aWEdrPzL~ESgLZ2q$@pwg^_(S(2o?Dxa?9uD&*V1fUBSaLB%4#_Rzqbf$gkx}4fu-{}KnVY?SV79aJGkWhN2T>!E zRiU$DCQ`tmt@{cZ4+&~NiqCuF4WUhq(u#dWZ%4W{BX6%ym)@Q@p%sgzk))qbI>B1A zJ^eS@VUWFZ+Foq>a@+dE`2kxHQ#m%#Y{79s!LO^PYQ?cXnW9xxIVC8Hq-{!@a4ddF zP=2u6l~1R^2_q6VNc8&#%S?o%1wvY1jhwr`=J=))-Ep(eEl3gPRc@Y`LVU9R>#$>@W;PghBEX4qT*2#RL{7Iy+OPndqf4rFeE%mhMQ|gjKg@5p zZ=wWF`!rz|w$sxhB7u`sB^DGjl*_5Vqyrs^OczQ9(5L!r%ob3lGsHb3auv$@&onJV%hR;q;_BR55d_`fBlBCw!|$)@fh z{(ssOD&6Qe@yUQWiAo)rouPx~UxX^-Z}hq`C;5;|s}dCm3;xZ_HZy%P7+XucYO@a1 z!f#PyXIc=;X{X-YufU<4Dy>*y}RywbSLC$L28)BPOoa zxv|CT!cY%82aZZRyw_^ng!d=>(<{6^yoXQf@VaWwhsU0@wZ#Ij`KA zv>{eAp^UpoPU_}@zM4x)oXG33ngS(k$Nk)C+X$ZF&W##RB)r~v1 zBONJdaGFV=q?%eve5DIJof&>|Eg}ll-&>-(Rh#+#IyO#+@AQ!^xx)?Zah9A71tr=H zgL7uQZNtt0g6I1~&WIQxq*&mILRo+=*k0ny*rB2g&Vubl=6T_cleW8|j~9%s_s*N8 zbD3tV9rx8(H#m*E+|dzSmbRPf3h=SqxX7@C_GJX6O3Riq^_?!xi`Po zxwp%|bLWA+le$hqv-bQvDeENbune8H+03ww2WcJsM+?z+)>>*K>J`wNGw(Z?-W+FB z2GW}nllZUcjeqYyqc<-qH6V@ulHNROKMm-~7wJuUK>io$&36ane}Udi$<5Bvn{i4# znBLT#axlI5icK-}rr1;@28bOXSEkhZo)zt1-+FI3FXtVV(*S!mVx+!~aEQ6y5el6N zHS)W^Y(zVprH2{wmRJ3+)f?l56YzjU{=%LC?hIF8(YJn*^KVl$p`?jSWhqpK&;-9y z^!=;$#kHyZXtw>F*8Bphhe)Dj4|;WQ``do1n?3*E+Rxf^K>0>)!Ofy#(8#&60Ta{cpK*a9);b-(E1pBF2k`-HIz`z9M4tT-yDV^O2k2i% z_Z$8Ugimh&*cSd^^Z`B0(I}QuJ@8M%veADnZa~EZ1^_gv zoi_Ej)~6qVs^&H6SnQCDa3ST`w2yPPn1M2T>(eqx$TO#|pH7Frgd>&@nZblj{<=mv zy-`HyR>W4?*9DW?`IUPN=OkESmMArS&ZQHibbI01J#@}r_@;#Py~({LPP;5O z`}MAKqG>sPZu()UUwCj2K!1kdLX!1EZY@=K^Cii+ZnU(liStP+;koZh*L8*}-< z=2dtYg-v@$4rp(hY0rJGj9&T|(Evxn(@-`|r^U@U-Ty9A^;s#ey)Ulgt zxN|^J4v)w5QFJd#7K-k3tN$bvYwr;#bpiPOJa8XU;$edBuVXw97jW|@zfxN)Vli;V zBv(sm*hM=8qcu+3)oAnF-H}8IkCbE$4A<1sRj_uGA4l7*?N?K8BDlbkvhZTa5FI zG>oYVlRt}Dhe&ZpvPOOkU&@70hW}(3zha$}_suNPXLnIw&rB3{b~2@ILo0se7yA6O z$^UDgN2t$>>k|RsQ4*@{@4Xd3{S&+v8Tc=#q(`KH=bh&UE2^iBDIsA!Q0b9tEzeDQ z?&VoSEWg7jLO$f-k~(yj9N++UIUP3sEWGp=TjB&rkZFH?d8@ zzQMWK|HMB$xv0Mb<~=#^-ESNC-m)y`UHg4t_RE&_2fp{WlfQ16`jY1*$5m);v1@Y$ zNotuoYbBdZ`+RThzjA#xuxR}&rZ?=`CQ`-g5pTa?G=Bo=G4}x9%Y(TGI4xpC;Kjb~ zbNbFjMX+q1iqMH9oe=(C!@IS^>8cA?K*-F=b?WN4|LfbumKkd!Zb710SDx~{NoA?J z3Ms`<9T)hXEhRHVr)@W6#G6#=y;41?C{;HSU)buwDXG;bm504r0zg)D?!ZIcE$m3u zRpO!7e7v%}4N^jfYr^^EiNRfU#(Ge(OUoMnjOM*+FffUDFNafeM~7>^UDiAyS3jrk z!D&^%5f5RDy&3rxTnm|BE|~^vs97A~;1(Y)Tn(l#FA1yK4b)SWIHap?tjHb}kMBJ_ zb@f0BoPii4u1-OAzy3R&?sNziL@~ z7ai=+VGe&LpfD^O$H`JYwMJ3+k@yVXDM0xe5 zL|KS`tetgX)_1e=J|Q3sQ<0aRn2!o?fh_qxRp!NHhC>HTLNr1`lmu(7*K?cZF{77o z+CJfPCeh3wCVm@~ZFLe+G|~1cUUP!e_5uZ+m6J45+3;ag+;C^0$8gir^6S&FLFhOd zBB}6@eY#yMP;rnnF?HpT{Wwc| z4T=*1n0ajo*IZdJu3=KDXlQ?3iSmXCscVK5^rx8Cih7UaclJT)vxgMXF}2xvZ|_84 z^$M`ECQfsEEVE~f6xcJ&(Uz88)>CPXIR(9xF9NmMX8#O60$m`VbH{P5N@)zXt8PB7 zoGYoj2hPUUJ=oOUtLV$OlV}K=Xy*sM+U)I*zMMV(%IHH7Mhq(sd-;(+XS=wgF4my6 zV-p`eo;1tkuMdO_c&8knnn1o7z(2#zS;ItFjnWUqhsT&q@zDO8<>H^6whksF%R@`J z@$YgieUQ1E(fOp0XdNUB@A4lGKJxmrjxc;=m!CFSiA3U2 z>^sV5X1&UY+Ut-Z@>_G8dx!f2nVvZpO9n)yEG5A7l_G{R0 zW9fxOtLDy~|4q0(Tfje&WT|Y&yis#`MRRr5KVv5L!KIhlb9ryZZ6%UCc57BMw!z%@ zU}|Q(?9^`R%!7I{U_c^46&xN0X8HI%S|$yLlAWlNYfI|Tw}gpxGn7u_OYFa~G&?*N zS&l2ZJ3DuLc$gY%9u067y^EzUFIv^`tt;n(8^HiwgNjQ{ds(MEXXUgK{}hvRugT#g zdCYqaq3>Y#EAvG`ZCZ|fg0pgM#z2k@#lwPk{1BROR*o3w?|4nPZW;*6cqJS@)=&tu zxYhq6w}{*#{~?o`?LtG}TJ@n3`bGOj28~IGH+}^GA(9$jnO*#|v%A06C-{Pil{uNM zkXtW7bz@_7p*q%``AwDHV-miSYlrm~KjRq0uxM1*o`v&pVP*~@U4etCa7c3(wG`u% zR|VqcqE(I8TnC6Z2OxfnWbdM}*s0?42tm*DUoa`Pq-3ITtuiU&NFf-PDf6&WCSeh@ zPS<5M9qwH;K4_51^vLWDYim1Kv;r5RnxAL{!qBjm`m$EuY)y2;Suvu}zld*a*jrPy z5iTYG91CFG!5BI~rdJ!~7xugM;W!ev(X}|=Hjqk>Y}a<{y%dJcKcr2YkqAsbO?RV%H5R*@ zba2f{X2KkpKoBp%D=jRAg=&NZ@eY}AIXzBG`_$Gx>(jN}?$evQ+SazzYMTI(04jl0 z#o8*hYEO(8L<^|sJnzr%%p?=UK7F43{~um2a?bqD?|%8-e&5Tja$z&(S<3V6;n@94 zG@Zz!l%p`yx!Wo``Q_idhtVG*fYBLgw8*MO-zw&1ejXa#4LVeW%q3qauItyW6^X+) zJw05*8oqds`L)y`Yu?;fE0q#Ry2Sn8`)IHlR_C`!XX2muhZ1o1EV6-VFVpnL)HG4M zRhT_h(6;#4t(%Pu>oZP&1>@dxdr{yAic`bn+xsadiH!5X@ zC`aZh;vcz59U32iP{w^#I{$HvM=;aC%hLHq2yxJxu(X!}P5!m1$V}Kr3EqT%k7;|S z?Z{95I_cho6nPXB&fAxt{69=i+P<86gW3LyT6N*=@xep%7Cry7J%}+jq zm;2cQ^levua>CSb>^&_#9ardS0O5g~Ee0y)C!eEU02~aJfNo4ZCNGP@0F9UM4q?B_|4vM0Os@?bMxxz+4_9i?jDs59YnXXt!yR&&^N1OMPglc9%7;>$>ICqP^Tadc;jqKN4C#uIsw>C4N`r zC;v0KgSRDxx1NTWXqx=wIV9lqs&-k#`r<33=wd#W_WlffG3PLI66HT>N`<(M9vgFX zZ2yJ?$0KOL&_O=EVdx+`oE`t{>!mYG)>q62R?gJ4-~0*{&eBa|IcsyG`N;$IDy_Fy zO@`h6tE;u@L6d|*Y5N<;J729q81Bwb{&FGL4suCHzdOjyOpmP?&b6$N>)-f_k1&{s zs$^ni#JWxX-*mOkK*#&*Oxal|{-Qjn=_UBX8fJnHT_5p3r?2jfH3Cp*@(cpL&>5jW zY40Dnz)*jH52H*=@Xw~M-Tpb|$p#tf@iS(GyZuvwFKp0!+j+IuL~f~KvWx3?0@`ZT zRKK^4w@h^;zc-Hy=Is@UYa%!OK`v^ZyiT*S+uviJyZjyIY1lxc!lW$(u@l@P%brHM zgmsyPFS4=Bk@dg+rbvkf8i5`d&E}K7mjO9fs4knG@ZJ@Ng1sXrSaQt5v6^y%UvIkQ>ky7fd#?_W|lNJl}0cWA~z}IAQm5-R!sBJ^_wzG$Kx9ybZF9NI@cS0}u z{i}-nY1?$DrERbW>U8C;zrigMY+7nOuV(aJ-u)l~nPd`MBHvbNinW%-tAadgXh>sHutPUJ#t%|4BBy zzZf;O+J?HDKf>k_{ipp}JpW82%1*Vj>TY7c3IHrsp;=hwkG4{WB`lE51Ju4zS_I4$ zUkjL^fDZ(ZjnJTAtbKh2yXAmUW`9z?y5_<%_vRln+))52>89b=fU#nP0~mWQ0}9x> zw!bMPR}qUX;-6+d9MBpdp4#od-Dd7%?lC1faq9Wc&p)wjSwmzI!h1kkqM`Yg55H%; zf8+u-_;@ShZJ=_DR~q11ZmdC+>#nSF`N3k$Onc||%uvUetCcj+7|GA7OS=uc&Y`VY zv=y{kYu@I>{2HnbKK`vqdepy|P7Z=v)VY&MD~z5)a_kh;6=)yG6o+*N*uPB6IxcB6 zpx5n9TF$}zv-92OCE8we&(K;&{II z7TymOaIy0)CYqLZ+ye8+@y2`v`oH$mZ5Qe0dP_y3`=*0L=i-K7d_hkt_6XPX z@0f#hBS^Dwf1j#d9Bn_#?rBuK;$WlY8|wUNDlB}XYh8RQaCq3*(AnnXt)vgM_^4^| z7Wz=+4Iciq`cU8v8YBMiTGa=#{tHW!*Oq6EF{JpQs)Ik|qNgj9| z8COsd_A)N;!TX2&-)v%HS|7j|j6@_vV ztL}e!$hT$}|2t+T?@fp6uId(sQ+7Us9+4#YgNMclbGTSxI>vQd}=ya~1 zLjFG>GGSQlAfQ7Ob{V(*#fB9<08)z}NvjukfM@cZaNZc+2 z`>{NWXtR$M`5QAp62|xssUC_ysAp*zoI@2she2q=uGEW`O2e|;R@-|`k*$|Ys)N}v zvhkfs@3GvKd4w&!bT{b@=BEFY7dVapzGUCU3&Tbd(8HYEHIrlUc=p)?zlfL=!JC|Y zRLY=R7F(@dD9dh%F1Fs~$JILsPh`I=gq(7@|lL2P)Ki?1!;@$SuL8{(HWdBK~nc1Vu*i1rwk` z6tFLub+8vOFZCQPZtf`2msiF}%%C22FT-M0Ge|Bs z^UA707)|Oy4A4(UfqD% zQl)PWE|9FX=w%S=L16RK#-U6fM-s)MCU;g$Vr$8P9rv;b#={4sAKs_Vu(8~gAcgzP zhQ;=Hf5v;E$z6tD;|KW;ECaW7r{fP{kKBjVOayD>UL$+X_BC<8b z32Fx4Bu)^y1kTbGl06q*t0HyMIWptLY>(e~5?^vuj>W1sp(51e5w>m%*a#}(t44ik z+Ft)_??xCxFdvBOWF*H8Nw|`zr019F!w{YNNN}x^4n0OpVenLnXyYB<&=|9ChF4sJ z9$uPFmdu6M2^Xnw$$hMrJu{9#xY}HpbkdV3KSmKkc8lWMn$LV;Cy_+-;izpk7AhLr zSSG1uj|nn+AK{L#t5kFGJ$9V9yLHqO4UbcGibSi-Mw1?&v!SNY<5;Nb`+7Fo7C^(q z@abl2Bz9XJe`{n9#XCoN;Suwj#0N-|_d+JVNX+(b#XQf1o=e^nX4OJeUbSFa`5xmdt}S z9|KgTA(%AHPRkxM!e1m4Ppph#RFaA-TyJ6c^EJD})9`}eVRGtGJHNwBfo)wGYKlLj zBbwsSz04qFj(w(KAc9>hhPGLU3WcyPe50=TjKH#XR&K^o7MadO@KD^R#U_zEh;s8B z_IKjhM=(B(x*?pad-h9(=YhiW4f8aXspu#5tQa%+aW-FZ_j*s*@jlFJH+sf^bvW;< z#bZP)4SEf>glh=4vW&;8wR^E#$+$i~< zdON}y4-~rlMcs{ti-iU(7cTo6g@7hCx$ybsig40;IYQ;MbB$U4D^W&OXq!^XoO%4M ziOk*QUq!JYM!&g)L}k2zC}E^?F(@wMZ+@86QUFPD#6XN|D zhm2$^<>k};_=exfu-OavIU=-JAQT3=qd)i6AIimdo&tCN@NVAHdv?pRK% zJw;F#DJ|0k;Zn~Z7EWg?n$BIvnOj~N@pd_(Lr(r-C%-%0|B91;Boq3R)BjQ?ly~}H z&4gZc`d>Ec7q-Sqt{v(AXEULlDYUZt2kib==%d~L0)a8x73ubGm;sxc%6xDCEB!A7 z>b(8WrbAoO{eJ)c`1XE3l{nfy1_&~EVk-V9mD>FSW*%%8&&z2u4;ap~aRT(1Ohi@@ zM+v#zluCrUKm_gGWB0fK2WLYEKM}V&zG$eBz^tEo46Sspb9Qt>Yy@;@exOe{~m_Sz@m^7+v@Z*h_JxNW&@N) zLvK@V)^oh0t-3EzJAR8_oP^h;c+6{z=e<1j^?N+=i_&lx&;2~_@SigvWkzdy=`KYJ zLcuj+-P0Jg?g^Bd_0&j30R@ID@Oo&>r~%-Cm&5M_p-iCkB9=3;>ZnUO?~^@q5ZEuLM+t6fJ59Run;l0R-w>0T6T%hh7L{pM%LiAj7i^ z43WZ8VW*X3v=i2q#*2e0OmR z==k43KQkT^$7u)c?6f)_=CmgP01ypDh661UU0fl5Sq=TcNx!>t4dv27$OOeTYfUCv zIniZ;6xnSRL((F-92t3>kGVguHblk2%+hCc2qA4ju8Jy?Uif5Fs6P|Bpmp7j)#u24 z!UAs>#&6;$e-@5TZ@@f2mnFII83*HOlP zwQD=7cv$OxLaE#=L_a7e86WJA`=4dikq@rZoM^D6#Zz9#!`f}&m^1NUH>wRXydxS^ zD4qBA#r&=ae%I*t#rYkB-zF^*q*W`ep0qELc9fdvNF`|l*ty}xxFZ~7o2qQ5nNF#5 z-s5!5-^r{>Zuxg)HT^13Ktp32F~bHv&AUiqT7V`>)mLL|#a(d(P_oPbMmpyH`MY znErL#E31sMiCh(ZiE6q0lI-nje4tEw3J+aJYp;l|nlU6Vau9f;zKai_rEeLWk~_E8 zNbj7`gCeLr9MGms@60_}+uwRK!uhS-5+tsOuGr$N-LAoKJq9LRd79ay1J|30%Ha2n z@PkJuh#nf`29VJSvsD#t!WoyraV3M*M3$0@fl}68j4$bZCW9wwEfa+tB$fgWw3v!)+4N^aE~R6QnOdP9{lS-D(qG5<4f2-M(I7JPB1nM1TUt$Vhn zdm1Cu4>*_;$#+9VlY0SV3>`8A+~L=fq%46-wl*vi6o?icqd&)0s(-=0RJs6YhD zDI!)4grdtrl}!YR7RO(lPum*}z3k}1XKvIM;;jetLf6;YkyW1-|2Ps~7WqYVurG+h zFmegy*1zG|2i*E2p8bYfe>9b_BP;eHF{*H~TktTn6_$8#RQuNob5=60>^q~Z_0u^I zncUa*@epPdQu1CIKA#!yDl;8TUi}f~m+PXq zSExvv=Te*GR=e#z>w)E%T{W%C#c4QRxxBR+tW2K+Upnr!a4&Aq%NY@OZP3cM)QW)yzaEww zY#-#hUBG4EMZx6s@eFigzs7-;=xSj=HwWI9gu;RteO!;Emu@$wFLcDa?R24J|6eeU6iKs@7GXXy0*<6ZeKvf{q>T@+1z%H#&{-a)NaPu zdAcaAV5oWnt~Dm}LF$0qI1LTk>g=En4gF@)G;|O`VdR~si=1+AJ6%+kJ9~MO4|-)& zkar4ihhK~DoVJ$;m7|jGY|V}-(AdUjyg(|(q)oxH^ zP-V?*cAhSB&27}A>P!0fU?quWwmVN3P3Jah z()FfXX>#ekDgL+@4Ro7+C7^?8DKI%1ZicX(-77-Q@_v?6T_F~w=SvM|Hb z_Lj^#$Tz-)l(?o*8`LZe+wwLu$;zo|XMIdg@)e~7;rT4x>L}R^)Q;TkSMZbhwK^{hI-?n+ zGf^H^$CJSlX_iQ<;IU%S$PV6rQ2c=D*d#uqPF9$5hV8mo1r_T%5*qrKFs6T=5IZw`KyBF1*wLbSMlMKRSK^Lt~JdU4_)aeH9s$C{yhke zF1-iw6viBkrGTPHdk-=rO*<`sG}`R}4AD^;feMe=03{r;QF;3@TYR1gYlNBsItfPU z)0_e6h8)1UKA?ky3t!{K_267-;W-?WqanRo@Uz|F#gY40OaA)jV@`DE=a zM=@y2Zbj&5j7%c_uQG6N*d@r8qbG68(G}dDo#cPdr2b<%U{;Mc{mtS+n*#v_g5x@A zf38(FiCq~@m2JFTJxtig3=)bVdMRK}MIg%V*l?pHw>_=@9@E}tKZ}4 zKR=7o1vXWNED!M;FBX?VRw+(wl!my#0TNXjYMZ;8g))?;J>jb$0#5rWD(RV;9`Un5 z4HeYjc-vBe0v4PqX0z|*P>X~n%;f4~BjQudkj1{DJ0&KQ8O8t&)6JQ@u$DUSmQW z)duOk$aolO^44oh+C%*7a$cWPE(T@07gumKxF*POfJe&x&wb|CH^s`@?ib(CqrlRp z+}TqoGKu*nP7EJ1V(Ok5<`)e=yTkCa1%6Ka><~ZqSMaml?y>yrFh94Yl%LfY8Ntvv zv-tu$D*rH8ku4GTx=QqBXp%X6>c|56i||Lk50{V@6C8 z%3V=zyECVZ;BLPl?$%6!sP=S$uT=#QGXKx`*}@tZ2WQs$uV7_0X9~?=trL2XpT6LT zeJ7wD*=|+oV7tZ4vml^hn;v0&ht?RDwr#%k^HGble#r1b1FLwGVYld1|-kt$F{ zsz4Q~0#(#XB~`q~{KI$*G3Mm~G%DV!ya!wX_dWaad{_3!nCs3)!EjFBD|xwb{_2|F zojs8|%f9@x0|^N0fyLwb^R06JEQh}t_&X*7b>An+)W!dY_`j3?yZQec{+FN=-A5r; zZP6vMGu`&qK1@+q!tAesTSy3M?X;Es3GdQ$;TrKlCQZ6ATt+RELd*gD>ibfLk=Bbe zUhLYr=eEbV`K`q1G2-yKz#;t3duw&X(+EQcJ_k&&-MK_Ja4PMDL;Z88UwqA8r)RB> zf&Lv+%FFadr0o3zJ{gHXk$=nYNO@bF?)~9Rs4;4LWvEP{-o~ZpIn&VQ_&wJOLzkql zb4iMSA=3n)Zx=-87;|53yRMqGy>uAGCSvN&j;MxDs)mQ`{{2A>x-&gcsKS68#B`-q zC=D%Fqbaz@>R8ATw6ni3;|aXz@Jo4M+pp9Vtf?()pGtQEC}y|u8o)JsIj@3$$k|r& zx<7brWm4O0cdZyyJ7KT3vU2=MBH(hZA0)O~*^MS~ZVgk6Ce_6eE?H8w1QxUE9n{OL zY?|-hCz5fLW_NnOTwbGx)g+~Q-riM zd)8W)H2vlRni1}YBd3ywblG$mTM2I8KF;UCu|a0r`-LWyOg+xwH%vu^5#wQO-P@XL z-DGbMD#A$?VKhss`Yjo}Wf8;;ox6F>-dN6>Kg3%yf%r0TIi5@qAu9+6p;=a^gO!zv z>_;>gx(DlG>b+TEbFFA|{$_=X-*V=gDH=dQfL~Pr^=j?uR(1@X$afj2_ZIbLuRpg8<4Ze3e1IPN zTvEygaZqPh=IyE8+^LDV7p}O`&a)dhDo$0xPOqr8F@ZopnXr>9Du95VU7fJ&tn4<5 zdUlP<4(|8t>4=ieJLXvUlnuaRGLh+vWO9@GR{jw43N+2bPUwQD;KWH@J)WHGO6#8b zh-+Wy&24t)P90ps!p4+Lx^ z0$-?iMTDXIT5bd?ocKG|Iy{Z%?OHQHtMdw>i`pOQ1mU`0KWfhTFQSfds^$2oLwghK z&1SZ;7Z;GpG1&P1aEs)Ze+_Qg&q$7oTcqz*fVBV5aZ7vCd+7f-SgDABitQ!}vmYsE99WzyL*jah4$TFuu4xz!$<5=YSlLIvEThWKjk925(qd z(F*c|bS$#iS%NH3)$J21=Qefa-RPbhY%%vQV2h6b8n*cK@v%i1g#?2wPUB?+w)p6O ze=oK`e|4DOD8U!9E*`=cKQH17@falxM=7(hY+sS#usZ8mgZH3>N14I`O7Pw+y-yg% z2j3*i`{RR8K>hs}(E%~ci`>KiIXV#kAasxxI*=rG2p#;lQgk3|qW>FoP}7wAvf(7y zsRNzNMDdi0X0$rKFTkG%4TzBwD(F~Go&vpBEILH=P1|cON9#T0$Ox>?JMo4P#2mCcyX`q#fC_zTJvF(lE5>BKn zM}hD=Gsxhbos9Q+`(SW}*qf`O-k;N`powNT?9J)qOQL)89!^5afyYHb+YNhj=zquF zY)>CPA8H>T&u;cy0;XrqXq(0snfnPRrW5Q7sFgEO_r;H*rIU~a5+V=2Da zJ=1&0a2*BXgJZZ3!-*IXd*Gw5l{*ey$^4QdxLf5x2-R{-Zkq$_v9OT_bYS07Ef3;cATeu1nb;%;1I_If(( zZX^OD${2So;Njk@LzZ+m%2##L-Mrd7?!8H$maK7GI+Je8Mx#sd?-_48s+P1FXpPez z?3&yb(M|Ny=s3f!7@;zGe0vNHxQB^+rn&f{o-CmG%n-?YB^b)saxx2d6 zZEbUxtWJ;lDpQ_)Yt*Xw$X~tY2=ykKyWU%E^M$t6__(RPP;ax_Ox5pGZ7|VN;B5ba z=7K8?Tt#YrV&ZAJ5z)ke4`pg5k8s{g*q*JSFX>zgMMvp*Z_ebJ4)Ak7YI^*<7j1BU zRrC5io>e^W;`toUJ9zp$H}QOl=SKgddvz~3q!E6obCi*cqTc4Es@rhxojM?&icK#e zZb^G7Nha&OR1J?BFSVaXwU>I1N0pcIdBl8MFyuV%V$3PGQtkkW%|SVes~p8uj^Zju zah0RET8R0hIcgGL2vlw$jVw#8x}RLyOy(Xl1wP-0HH zXGV=+r}=D1PpzYInp8A2DsaT+xE6d=)N+Z1<$ZgtQ6LQrv@_=*yLL^mDlEb;=MpC? zZw@^THL~9>R6UfeGf!WaqUuC*-nBJ4;dM#x+B#+>?cch|kXZ6OBQM%=yY0$T2R@7% zrt?U;4Vko?a97q~i+^$^7hW}OFS1f>&v*O(v^~Obs5NL4M>N`>xXf5trz1@RL%kSc z_Ic6xDgxIf-h6g5p`@Q``~2od%qPkp{!DDz%iS-IMfjEq;L}?}w~4LQ8hczu^T93U zRVG0#&r170{*qQ>856R#*=WS|=$NpEvn%|+HyN*{Ju@FtW@g%SfR5Xr6`svZkd?0Z zV-eEM3A%Db{`<_;CLwKi`1{X3ra!w)g6R+b1$2-4V32~vULmgGuZKJJE%WVoohq3y zvmfLWk@Ia6wNndNgDJd;-pRo2Sd%xm!fTB-A&DhwCkwS);2bH_6&3aakiuo&yCdk= zP*d)*IuCOZr?q<^^gV2<>^qYX&q*uUjV^a6WhJ-Sar>+3g`$e?;B^zeG!RyUcJxSx zo;1_@QvvO2C-JnFyQXbILCM@EMD-PfOrs;K)43~RD14UN@%peg>qruPc2!y*vE!p{ zf}f}Fz^tJ6Q1=P)TrRieG~f0CARfNKh0pv^ZN`)A6vvxcO|-?f4{Y*A%cjv>fnv^s z+TSaVHv=@GSd&{?xny1)U2&WCUY*&OL2p!CR$H|pY|ohyRn_Zc-$X}$6F-f$MJ`<5 zl$)QQotyHFG?E((w|~2Gm4k6LbF(p;ddprk}P47E|&lZMItdCBN!(}F2U;?_-d#t{1nW^662;f#n9iOR=n_uel z%wnHS%20QIX1aSTFkRgp?(fgv+h1vvlrDjU+NS@)2*EOl?N4JThuK`|DxAnFSlOGj zM!`yK!UscP{ugKvW(_K|27IW;al^<|RMdvp9yK)S>SGPt*Npuw);(K0kX;|9?rIA&4V*6U37se&P~_5xDSs>`Xvi zVAc9buWtIZz3cMkgLV6s?EZJh_qp??8)qW^-O4Cr0xF#>8`WQu5P$}{CR9~$x>xvR z=of^Tvd#cg*%buIOX2jx!`(}LwbVPB@o7cs8d*P(hVVXJk(3X<^{)UUuy&rjZS0A9 zez@$_3B|ib?iE);&fK`)$!$ItAjlOXQRP0{EUsU)ZBy=g0x2X_geV1~3vAD7n~>jO8{bZL|FbeO z-7Ax({4U)BJxCVgXh02Rf4!gEj#238N!9w>q_8gCf5dr3FZ3raZ$5_k*XR(jd$-(7 z6yGgFQG8tkI*n(AXVRg513mi&7s-g{DlFTa?iWVe-T^A$!k_6JXPv!s6&36noNAr@ zq~3N8e)M(gtZrxF&ZdRCG7G!X3s1;|x-bU2X&jpkw_}bqX9t?=0BECuYTsQIU zKa@c>6afUEoyVC&PhG)S%E@lSR%!`wxD8P7UUmS4ZOGjMJJ1r)8rf~t_7w%L!0cCH z=V*W*(;gV##sd7R;-0C!immbyI3Z_km$rft?+?K%^zlJY4LIzXRgL;GKS53)CNN!} zo!xAv+FJMDnPoPy?)juuh>~!0#kKMy!*$EdJf2{7=uX6SggBZAn{g4IYMksJ4lLgE zx^)fK_`(-&;e9};;u--Z^FvtT8k=(*`~uisV^nWZQyLu*(;`NA1idt>bQaan(he*neL@=4PmXL-ooj48P`=FhPXo@oz17W9oV6>C(o|BvO zg%W(~jk4oqK(a1uy{YhZIxv(F2@*I)#VqB86xPTTD*OZrc1O*AzL!p{{D>3Z8@LP@ zneC{Vv*+0dvaCWl)+#USY`(*WwE*xH=x26Qk?GX_f;txG1?3eh4U&U`bYKYNJ?ZLZ zZe=>Xv{#l;>D;o6=(HAGHsNJ{S+mN+WCwP@=}=lFyEIWQn=Uu&LIdW&Dc-CFw)?>( zmWe4$se2k)SkN;6`j4X(^?>oZV0iR}3vBNV^uai%4KWi<2h$RN8o2_SC;SPq+sV)* z-78&cc~1=O_h4Rn!it8*J|>L!%jq03c+f<hHYb(EIbv~m;y@rZudz+T+Yz4^Mn7eUT zO-z=i&?Oa_kW+!o&-P|=bJ>;h&fwxYN_7FN9Yj4J5KY2B)%|(!=gEM z!oO~2qVKv!>2jQrilYlMNSM|3zfZ*V)CLfSo5+;)bkTU8p=XFI zexU>LjcdQ_X2BV=56g4pWKY7eQu>;7VousxFHa^!GpcF3D(&_9?_OWvn4i~6fn%PZ zaX*K^=yP>R_j4SBG4AsP(UrEJZZ-T%I>cvYa*|4Um(@7lvO33GnRdKC25SB|7T@ZB zrKHNSncC0Qwf}^E)eX;?IPU@rNNAFzhjU4`Z=F6J;8PP0F8GZVO67ij^2&4+k0>Gt<=dw!_!9GXn96sv zTI&>X*Z=-oqsj(8%)GMswS?F3I&|L5`aO|Zw%4p5E0gq|ak~FFHWQj#(G+SCom5;X zopvsc*`l~gHk({~v=)ViUbgl)E;QYlExHKs;L3-;*M~Xw_{UfwIjOtia;oq+&?OlV zuXUxY`g&Zgrri1kK@}I4=D-O_FUMo1Q~?*I;6pkz5BSLH(6Bj=lTzOAMB<77F?#jI z{h9LWTkQBQXcshm*r@np$nVUAwkU+J)9=eY4g^$FXl5+st`)fyR91hvDKwN_`8Y_f zA*Bjg7Q9cE&BL`UGFcqPinVusEA0lgh&od($;6XZ$9&eqY?vM!?$GL3%7z)(3CL%! zzWm3+ULBZ2g8%dp?VE;*g4c~VGNL9LsvYCr^IlP)ShPy|?LYT#+I6!aG<*(VtzF(8 zIn;=!FkHD7VBo5&JK7>%Pj>p+vNnVy5_0CgYO0cXX%#lCh{=u18WGKM z`@x=5OYDyi$lL8ht>{Y&ZwaWZxEoAB^L2P`I`fBOKVEKwV1C5U(XF9^R;L_UWp8XL zv(_0cD{o#5cazy0aJ;pC7j-)iGBx^l{)qjW^xkon9S$}u9Bb&>3LMX{ie4r{Fb>>q zdb67qMk^hSsFV7&WqLgb$wwl`G*q!%!0}+ zQ>(_r7ZwcCnpoG~_q1Ysi8(FyA)t>RSQRrM7E}{uBLQvA*;OsIa4Lg1_d&p!A-G3Qd6e>0hG+w#Vo6gqgyS z(9kEw$UOsastBTI6b%Slv)4xeZhw$X=RPVij)I@WF3mJ!Lz`S%?Y))GEv<0p)?i|? z^a(@0gqm9&_k%e2wmSc4nofbnU&wer&~%~<118EKyt8XpPO{eDq#R3My@QAFz2nVU z5(LU?%7xFErQO0#aYFNAUVXIQO|Hcm=$s{9{iJ%gbM2iJ;uWnVtjXsrNrv_}c%8Ya zTuJI{40xzyrQKUdlk`57m^W#~*CDbhpjN7#g)`2*KSo8)!Z|fYKD9Kz0Q!eX)-V6G zDVnohq(t0++*Tt?C-Yu=pLw@Bdnv0){jpget8=sYokEiul=ArsFI65-g)%OgGwf9D$|E$g}{IIe3=hTG!9jB=W1{qzIA`!1p1oUhB zSSEK-^(M#TD)RzvaC)`n+%Q^&O;I55iWf9E?Oo&B@FZz465)^=ae|*xZ1!Jv zo6Ww6W2ZCay}~^30t~#FBV=HpUE3aAm16Tx!vBOf7XJ_J6O1AJF8_b5qO?VSK2S(_ z;I`ltNIMDdD6M!X&~eE>WG6l!U4b#&jn$mhQAA|%HfVc2$U>I|Jvj$$p25lfsd}8G znediG$yFu_8?V}+MWzPe8DsU*-pT%4%!YJ64;zA@p$b=2f<|&wkBa_v<=M^jrEHY7 z{slAO1_m5ib!Na04#B^`iHP?2E`QTU%^Xw{hNLwj)0Mz?pB#P&GAH@n$5UWln@9~s z?4B9rOsjgxw9Sh7vyf5*tB)cUJ@e#~2RC3s9Zc^$D3Rrr92teoE9*h)Tcugt7B9qK z{A-7Kq(y=3SGD}8lfh1n!68Bz$m?ND{Aq8h9c_h0{wW8cNDhF|ie1e>&1f!$hX4^2 z^j=6?7$^k>qTZN)=G0)t?xp;Iv3ovdyaOL#E&ZRoHY&Jo7;worEI-nrc$zU31UnM- zg8^)IE~0)`M>nyD?CJ2Z6V~`Zd-+Jro%Q^m^m?P8wvq#4;ps`MJQ#O&k{vRzLK=S( z-f+ohdr!lZEirt3g3rd6Vr~JSrPXmGN4>lf02-Xa%|HCX4}M@DUQ`+Be(?nH?{_f` zncVftHZVlcsUebz}Pd*M-zMV$DOZK9{xjo=bnMk&hCLRoY`q6EO?c_oju9w zRx5lc^_BTQH3_@;U9I2w$B;;Ky@Or;ZdpA2>=Zyi&sco|Z{VvFp~&sd+MX^F@Vtku zf-XyuS})P{K&wXJcTlFuJ-5;(QglUG+s7Pi4a}{=hy3fVCL$24j&m&BJcx3i6lbVv^~L77qV-!EFU{i6jPCxWtzCUM9?@hbZta#jL6p#*6x75=v$r6e zo09Z81iX{+4()aC3nEG4Ul1)aI3dZcLozaOhw*Q1h1N_aes6WmrVo7AOfg*s6cs(Hh_l&hni$+a zbUKXwS477_G8;u9wONvx6(ExgGeZZkxI*Ay6n79)5+FhoQz9>sE6cxdf8#lK=njV| z!~3MODY(bkfnW<l>d9+}WyBc8i2?M>(AR?SHqw9WWsK4v|Gn@D$Vj09JC9b_<6jW;pvLQonmY+^cl z1Kaw8Rlk336T-_@t?zhKzST!6gn@XS9CL zI%D-6N$ZTdjb^63tDsW%B63)|(~vhFxNL^;P18raa>W*q09Ru;^_@{dLM&;nY?@);*UX4xZ287P0%0;)vE!ystGp?a(D*JJIKDNm?_A06Z48O@tbAaBavomLpWT zHS9Lx1@~fNb#z%9>$$0=i1o!rllECJ2WGbz;eNw(dS-_09oO2?PIFL zjsn+PU09Hp1JXA7C$i~j;)~DlB5)BdYggdjeUD8j8+eK|1nLEj=Ak68etNR@YD6@5 z^W~rw{nVG&T6&)MttTdw9mGxkm?b0((Z>tN6J(?^y-;!*iA}zdKKv#ED!lF^YiJCQ zNF`-FiIEYBa?r1=<)k9oiVjy&Zk(c#hIPS(m0{)~K4Z0=xMX!hZc3e1-vgWMrr0h` z&Hg%=HeO;G_w&u^o>U7nU&eERc@kmkEN>Ul9j`i>jpn9e2GJah2u1g}S5)b!_4@aH zH&SM1Vest46;-Rw^!ojK(2Fv8|8xTIqNz%X3Gr@IL#P+lYAr=5?_D&>$t5eNWW1YW z1>5NsA!58H++DevttY&4p{m%KtH-(YZl}MyIDeUi7nNbkk8mNs)7i5Fu`uj0rjcFr zyeYH?pC415evZ}?Dfg80!Yi0hTqZu5?tj~MuY&5lBI4wCHHDsZ`rl5uS22|-O=AXg z3v5*S-%Po4%9|GA&Fj8SQOz*IDepU-B9`&7>}_FdFQI$=NBZ~U)k6@V`jBV*D=>Mgsqf#GZaK<<0=Sag)=|CBmNv5#Aztd$|8yh%yW?^Zfr30oVMl1?LsDq$&5BCPcm7Q2`>BDgtsLJYF8cy|Z!+`EgEf=mdC^cqr73B%f>I7k2oq--$><&&gMX zN;+uG-+j=wT6%fuK4@LqCC9@vs=SSrtQbaf<860NCH$V4-}X;~)&HJNLYP$FJxS)m zGbAdrI&T0Ua!i9G{fB>xz|36*sigUn0;iEQ?ypy7Jf#`|##`cYU zVdxL~vRroRt!Z}JT};vl{C&2(qsnnm3u>>|;@zE#ChMN=5c@O4`NK$U&WrWA^3jqd zsBj}%v2Hx&eGWXcEosf!k0e=mA%dA@rkf794UrTW2c|K7N6O0dvc@cD|2zH9n-h4{ z?tjj7^R518#od*3@t>*VY{%bV+gJC$>%!3Ab5JL0i8~L1?mpuUoq zkf+&AP0>6i6Tzxj9oGVcCE3|T|H1H79y44AjGe${zDu^xt?bjn4rcqR2lyt@)}){| ztIiE!gE|%!xWzk2Ggwmnkd6Jhv<(XofI6LfSW}5Avf#f+0UR?y=Vl7fum~L!=?bgk zd8Aw%pQ*`Q!>CMda~G9UzDAlub@Gd#1aX}$NlFW_CljejR!0vgNUUl=mj#5Dvv!*V z2O7b2hFM1+0)i}yWVAqx6^Sz~*7Rfo_qEv`wZK?K>J6NY%WdeQibqhoeL^lKepMhV z{K@0Q1ARW0bU$A;pm`x%_rt|(UnkqZw}aHvh6=A$szeIp9W#`=j8s7}f6IyD->#`h zx!1%7m+0X5_mD*98Zu|xWgwenF=P91n3jyPuljT*6%6Vg2y}m?orC-kE?yRg}A_0lERke~0RCVLNlvULLTReQ*GVFuw{po2U?Lki; zc@I6EJcgdmc-1iItU=%(H3QVx$D}ykD(LCE-%C#qlhbmmNN(ZKV))!rYC08A)5j;K zancY_(;vfh-B8n~@={7oi2ElPkHAhP>2PLYhz}yChd)3=&yEy|1SIw1Xz?p!u)Qn7?v<0gxvP;shT}W!+Ka+g z{q9tJ7nbcV4F1C2riI;YlL5}9mx0!XlNp3A1k;9R1+<)x8l1HOul3w#hl8s@xS zmm!9)gEaSFL!5=oAeMHoh9+-pVL;I2jSI|kh$i1PR+ynNpviBe5x_k@Q3K=ZIiYiPWLC_iv4 zQC^l=_(4OCSC1se1s;we$3K`}cx5R$ekIFsWhps+CFHo_YD&oQ*&@fG!PgCu<9DwU zIc`W9Lv9ZfTILbE|7glxY>4s?3=`$h9ahIdsBgUT@6W(8 z2te9vj|ODT}y;0zTi<765ZEwxr)x><*Z0YJ19duV&Oe>4hH@ zAzbhj4Smd7UtCI?^J5_~_=aioiwm@QWBK4RKn2>iy;LI79C|$CJwf%=1@gN8StxSo z@*$$!R4$_2;yrSzAU0PadDViK11F% zM!iRlrO-Dq7luN=uW}8qBGSi}5b3+_Fhn{*420F+mq>3MCelyBfe%DFaD)T?kMf^e zt8L@`-v8rhep8ddmA-fhM@bk+gXow0YW2{00L2SvyxAP2oN+>2h0mHDviir20vhR~E;R z<=!s05vqK)p~@Hb1!VbdHWViedfW;1(;-8P!+5`A_dhQV0s`HR{|5M8F8ZAQ=KKF- z$KNsZcz@o#1>*cI9joQ;#SrI#o7T0Q`aHz>i-tI#UEw_gXx8GK!)-($6>&xx2pp`; zIA)mR6oB7v;ipuD;2lf=^!b&d&-?vvEGVo-J9Przi&Bx|Vl1PSdnNSw>?*Gja+}Ts z^m$J}pS%ANklS!fhCbi%BjNW(==0gt$1TuuOo2Os0@d6@>k1$PIAKAKq0doLB=J4; zdD^=L?ILX14zG%OFUn!Rb&n6+dd&{KlnVVhoxLf+R?1aY&B#qXr~Si$WyK=K?;p&+ z0iq%#gyA#yL$fP$v}{DCM+%u3a+lTlOEM+Bv1kgh0T8Vv6BXXYXe+_y&UxIuFfoN& zgk<6m5b+PYnMBNM93tuCy=1P8Z-Md4O8=xG7+q-)$u1I{trN7kx|$V6&^rx zF$xbDMnUIO%!1()T2*D6+zocoJ#7=69GyLb4;0T@&8#-uf~fV4e5MEt!*;_k+{N#J zVLh9SVtks`C8&qa7`n1#783-XF2^pVNk+r@YB4wMBtQ6uD{cm|@~Up72I=zi+M3YqDOUKulX_FycO{A7|K(ptR|IMj6Q*L2(IPT0V%6NZr|S( zumQXMO%OZ-JA%~T45i*sAcOop?`Q*E9doa)8u+&$*DFK0E>u}jQPj9^DD@vn6*Tp4 zr!2vcD?m`O!KIv(3crISGLP?`!0EZVLLaPYFKg)s)1+^uk^=F++dp(U48kW#{imU- z|EQ$XN&3OB3+%%6ybP7t#^+&f;jd&CxW_=*B{8aPJZLy!hucDUiP|h|UsRWTxUT4m zFZ)si={sf@&&gKNd(v6DSNvOwYd{b;EQ3+#mIrwtTAePB&>@>zsSte0=p^ox*=ek$ zT_KGLPIPwL=z`9mBZUr>3ZyNV2{j}AG5S)rw-hae|9Yzl}GrRK|888kVymg zq*G;wp|JVVjAGSX5WnbaOq)~&x6l9$uK{Dd`fEjc7nKe9R1U#zhMR&0DaY@3YO9@n zew4lEmAKzNKIvg&dvM?jOh>MXYoUjbx|-bHBVhl;k?X?K@`K~!N7DJ-PKY=cuPT?h zNRg1iqr{T{tEZER{_BWgvv=^MWE=;q$cvjoeGUqT);*6Gl8L8O>M50aN~Mq*<9KN><4r{^J;;3yk^pLV()yGotH>P!^62Bp3J1I+6O*BK+ zb&}ETL$eR1gpyw+cVT+vnm9$+JfySoeO(CCP^WbVQ2o|6`xQUeNivjMRnI29XVFJ6 z;=YLEF8_VCUHf^iGWr0-Tw$E`=&vS}S(iM;O)|HlfkUzMvc6UfkV6-7H+f-Yj9nGZ z-Y^LTsKu1Qo{Nh`?;&%gh>n^RaieayGD}o#YyCOo$mGIx#yuDX*=flLX5z_6%<6oX zZLi-rNlHd4txm4_%RGA$&Z6(JqqNj2VEv>Lw-E0$v+PJsQ|P8hjpV4T@{CFP{O^38 zm7Bh(L_V1Ew$mI6b2H$cTkyZxj_$&en#I=Hze{;(iZ@SR6-jzK2iCF86rrSG9n%_} zotxA|ePUzm+`6g&w=YzuT8fKEwS@>CeKssk=y~fNNiBg~CpI zV;cDvS9^^W(0heFtxyLI!S7Ivi1g! z&>66C8GOz_9CDH--}%c4Ww|-vvpXyAqGBie;+pibp4GydOVm&lXD?~8sw=dZ_p;%*Rn@i)1jFa*_$CqIfE_f z+}ug#yjtsj%qjFf-Q@i#lY5}@tMr@ztz%*CI(bDN^AuqTtq$phIi4M3>o$2OC%va} zXLYKsF)$XwXX6;mZ~`SXYNT?A$!A z+MViD?y|r#VLk>NQ@e0(^svkoWnK~PFa`)iANu$(`gk9H!-vrEKJ4Q|_;??F$A>Y; z`>-F24)(VB^o5blKS!Apj#tL#L*#fLUdn|pI9~bz3XD76hd1~z{&*jb1Q8@2G?XU0 zjH46Ny&zOS`z-Oyis*n8F+|Vb%@Z}A;pLL2S}iP!acD=ga@>6smMt0LM)oPQc(Zch zb9Jhla^}j3pI^ydH*qj#Hih%c#nk#uD$mjv<+D1uqJ z@>L+Puu@lRvscw8l4pRT{*yzY-&6G)6!lGh+g=JP=}!Q>R8;M9sb_Vr<3mCJ3AIUp zMta%4nwg=?&!|CL&AO+-AgfQ4NksUPS-Eo!mjQ@*hnT2ijRswDJX+P1w^cYS6XHgP zg>1qnLZg?dtw_bwRRHxLW70ku><-H47H&%>c7QcAeS@brc*&oZd3)l0$wco>7N5DO zDJu*0S?R}633(Z(6Ez@}N!W&u%T2n#dnCK%-NEtRW8Nc!V{+lSA+#`5WB6d(Wwy7Z zhJ(_CVh!$H>ejv7eiD(--UQhk6tWqt0&BgAk4a6f9WSR;=HRi|B@A{c(@KMy4n`&G z02McDN>KmNtZ0)rYp)~|`>c-9Fyfk@RyKwhk*GGt>SA;-=AB~OH1Cs45!ekhL3_CM zA>J^jMtqm~B7bfyGK@7roGt>je8`|9wv*XuY`F?mAO+>(cGC_cdt$WJaW}iOuo(k5 zFSU5G7tUg_ggKQ-U~swV!=+%Q6|i4omJHlR<pq-r5YS8(%BG$mxX#ytPs}kFPZp zV>5>}al5c<;N~=O`w{alAMof!0T9=TGezgNjFcv<6}Y?Sgy1A8VK1`Q^^%%c`yEr} z0p4wIjoP*2Yl4QM)7PkF5{8=YO=G69?u+F1I!q@!3VFQ_)5(rwaxPN6rnln+kx;%x zdAW^5C;RINsR_NuNX44y_A{tYO|uYc z+m3HkHb>1l~m>YBNj|vPoqx0uA$p&gbLE`-HzWfFu%y@GGrDtzm3tAR< zmj<$(jx!V>E3Db=cd1TkIU7xFf6oTwYRmZy%+cqrq0iNf!T+&7H}Q!|K2#_(R7q2{ z{}qq#XYoO~hl-=_ngIL52@0taCJ8<7NF(63~S`*vk`!&W(Kv@szVn~3MM)~S4^9+J2iB#3%iHz+t z&%1;BOLVbg{6w#YB{?=iS7w>tI<2cIgpDX!H&MjtNi9)P zyO!JR^(Rqch+Y*114E28jT35$sWbb@NI6|3*TPAx|0$<$*q;I$w!nV|=0K$^=n8XA zhgs0i^4qhc)AqutOe&E1Lhmz4FXCr!i|CeR2jE8A#Emvi0wpyXDquX>Hl^@GNxU{= zvo)JzdhPV=yU^D{{^&qPb639udy$(5>E20)X>TU_JkbmKq{jtwSyy1!wu-sj8Uapx z7%d}l%4w*rf{dgIi%Zm|DvW{qYm5R0nzpB>X8#;h^K!6^Q+ zcsNLpJ5!J`r|&?G8vXE5sU<^8p2Qb*#{@%L1e=gcyp61=bUl2ntQ|ExZ*eDy?fsQ# z-(au8&;~Dt{Z+gMK4|ls4|;*wg#lLlbxC#aAVpH*yUeo@P7Td!xt+w^DqRuC$ui?A zxRdjmplyqbemOg7eiu~1>J!8T>=?wUL^s!NX)f5tcPokg*Rq4zkXl*stO5;M_N5X! zupO5os1{vwuW7h&=z%T!_$?P_t;3)LFvS>vO1#`wxh8n|PGxiOa(882@N!>eb@1{) zWsH|J#&?d_Sd(75FEBh}rqiJ-mbh7k%|ZMy6%*3o5lzenA%&VE2EqRDPas%V4xPBt z15!-GQRB@KYrQKtgEsD2pKh@P_@2{`Pd#`MDh9lq_tFoMbe&#DPph``e>ci>(Y6OU z%xAx`YO;0dc7Fn_G}AM+i&3gcg)YI&42JF z+);Sz1&GiZ*>x~wMNt_-0@O>3mp=)`HdobOcQGZ-Yr7cL1_pkL8F-%t4rW@C_QIUT ziPMh+f=#RH39hM8YMJ~Js!(}r-J)PdqR1o$mhq09xBXsfJ-P}XXR~9(Nbyg_BgV8t zgkS*`m|3}zdUN5_aKOw?2W2V-DnTMqDNzTV~^vZ@{hYV5YH3m-vRg)5y;89Wz2 zduSG`>T&N0tLk0f9W()>CID_uH2V%&E4H(UTcB#SOR~Sv9AK33Fc0hJCl*8E)o(6i zxfjQKO`yERiQZM!urd-bMN`#-Q9YCIRI?pBUphd^#YyYzebxqTe67;J*LhJBcPSw^ z2YGCO$#DKIO@Jj3{R=pByta6fem5g)=aE*v@2M;q>b$wgxr{0=f};TYiH)mP4e;8X zfzA{^V*cMeWbC2V3Gu1}gC7FgER@DuKeZVvUXmZ>|Ks_sYu{c&qSb+m?!5d1C9O~N zAreFN2qvnEfTJn^C7KLF=)fxF|1cVH)18$fk(k(F?W}pZa9L-8{x5-~+CO z>#!KtVg)y0fjq$*i)O=Lw7+@S5aDaL4BOxQpIP3NYI|d7{x6(vNRVDhr-wgbePea3 z2|g7qaI6j2kYKEEFuTnTTj7Y$k=Ui#&c20w$st!N@r1RZju!wkWFl9GMW;gO5#dir zI44<)^K0QHx+{0_n7JB6;~xq&^=0P<+ea-*{i%Y$iSM8}wyCnIXSH@Z?;fK)!^; zHNl#-p;$67%IZ8wF1@uaBz1KAr$jAO6W~2}?r6e#jt(65_!$ok?0&HrU8|6uhTe5T zPa6R}7Q4&|6A(j%v(CXD4Cgz6x1A4~8Dmz=#vb?(kkZbcU)ENqCJ0T_2j4pyheC@t z(XE)bbC@2rejZ}#!;9S$pnpaiXF@MIq2C(kEB%9CQTg2eb@_og^viT4O+{9xw%BlG zMxTfNd}Ks_erEc!@r1NYvW-8uLT?@$kb5*!&k=yya6MFUnzyqc@3P*v{Jw#1ib1Qh ztP3PBSt98};ZkeJ0IqJHn82h==#?8tI`5C?`rrN(yW+`|f_PFe7z3%d}OCiY`syN_G@w_>?DYu&WNPD4_ z31EY1MLA~Ejbs`3W2)5DLKTzviD2@d3vE;cUq3k9#uQSLiFs8k?sGy% zv)dzyl{MD-$z}uMDMhNl&A~M!Q(T98MStKt^iR--F|&QuWdqkg{YHs>Dex~^I^n@& zpJpZ-uL@?KOYYM$3uhr_Gg{$O;cCWYLgSN(hKiNbhUA@n4Y_h@KJMkvj)9J}qT#RC zTNA@4TG7ncqr7EKjH<|r-=LD6@wnz~m_l|uTuj-JUWhes_x>@NcrRH9`LhX{cBnp1 zGg3O$N}d1B)X7`szYSL!Tfq&*F8{lq6A!y1Sv#w0)%j*S4D*Zf<}uYKoCi&&keOoB zLW8O?LMJzV)=tZ5coItuV}8=m>z~UNju{n z-QWHOY6pKCviY7Q_A>q*J)7c7i}D%=R_xXEDD6ke+k109N<-Mh1zxeX$y>wLnU@}< zqo#?tEib;b7@s3yZ_4?~8$Uj%{){IEN}&Pq;{#DkKP{{`D6M6=Y zVETqs@<#aN5PWh4`%JS*OG`(!r*J#vYT>*1pW>Q_Z9wL{+n(xakvB&l$J{v2zv-qk zkM73HDSd{%HybqHhf1+T?Sv|#``1I47WA8z;v}Gj}`DCt}lb|*mAX1C1Upz;--B^88ll1M$6e2viD|35 z#wTX3>hAaqeU&m+$r$^=Fdi_9MzqES_xM}dN&H^Wah85q(C9}`a9flhWu_V=mQnrN zyZorLBW@R2;GyswS5XKI>Uf!98>?U7zp2j6!lCGF`{Yxl7N3og3GgVudHh&`f4Aj5 z7n_sB8AqQoKiRI@{F~w(1%N0P*t+B^)dC|;&q)s#(C|=a;pgkta41kj!h0UFaPI;R&js*R9T zmN)PO_}b&z6st=D;Z-5L3MFFCzJe%@HuJvAfv{(7C~)0KWBJQ4_Kpj=j%=pWbqY3t ztdQ+9QePmeJV!n7whRS!N9!(4wNH}I+y3Epvd+52d|d|<5>rR3>$+m<)kxi+NVW(k zXsm2!I#xb)%OF#-9ABAP(Z&5-PxV?_7)7?nfVAg5J;Fzb`@OYzEiD7Z4x*Ut=nl# z!dkd15_oP&MZ|xcs7CD}7wI5-=`+r`Zgh_x6MLGl%RFLILHHsQbtu072dE$#cy`I; zY;WmLA^ll80K>hvy3-h6huXV|-gi?!>8cS4JiEBRe&gnan@Z`3>1x*9!h5fU>K6Yx zR)>9RD6rMAngEj-IJ}rh=5u>ub?XQ|xa1O)=k98Ma)MQ~DeNLBWH3jbs4BZ%M2xbg zdfL14E75lnUObIQKs7erRt2@m$80iu+#+9A17tc`nD)g2t&0bYQ`3%hfjMd_0N!|$ zTji&XaA5o50dTv#a4E83x?1?Yy(`+&oDYN8;-TurYdR#?Hq2P#StO<=A633yc!~TD zBABo`!J%r^S{- zOVYkT&FRAW#s3+r<4he@JLu1nn20KS@ux5x*szqb#g6G2iRH|QFA~^kkFGndrvw~f zR|j}*dpe$8j350>j$^PdP+Yy)F2*xN@|VwSwd3>ThDN{?s~nPXOv3C3F@G~w-iqbL z%DsZ>B*9)SE)u*NZ3f;otalLtg{*N1hzPI%^aP`)`_gAy?ia+|KNM(PGQe`bqpwv- z)5>?Hz!V>wtz97Swtg>rW=It^nW()@H0qXDPCa>m2Ph{lD#+Aaq-$oO_tvbhvo#l` z&!T2|NX_7!$<*{#Yg$wCHJ;v?sjpbq$8OhKpT5r4SFG!khfaNTKexVuKJ`s0(e+Wf zw?2K%C-%tA5?!A>bm{|P+zdNdpwfbu))bdrW6%0f0D;(~LqInl>Ftu6uQTR;>IXl@ z=*6vJ1FeYEt&a%*wyz&SGHIt1H&k*@&mB`w+wo_C?H^Uc}VZ zftWIEnXbUwx;nWORJQRldNN)Hfv%SsH4B(unZ+6hF9oQ#|ANj4Nfc@VnSar+7NQ4J zF9wb-c3Ic4BY-ZkW4l%L}3lGd)XO9IIdk5e=ooB66QW170q?Vb#2D9A&*^d zM|HV+l4ehsK7VLt|Sv>Q~fGt!p%fEOjYKk)D6h0 z@_9*)Q?B~isCH6ydb(ba32~}pK6dN_ci?uIQ7a+PQ67MO`Q@MKA{8x zA$19xpix>^rdfpdHTBI@CO0{i73<2J61pmzJ?q2in!d?a2dS2I z>lD$|L5uA*qWL=E5%d~aZ`}R}t)7bMea_?PWbnm860fZwh)0BN?r347)lH=spkZ9f z;iyAJYl%08z_!1-))R9bRpFUxq1Qj$ztD}UW~K_yLYaCipQ-R{9?TLyGBHdj<`E_W z%lI+J;PZC~=8$(@bIdrmv0@*0#2XNg`!Y(TI>(6s!M4@WCfD)z^BcbzR;xw!99G1C z`jIVo#^|WJCamrkOO~)&B_=Fk|26Kg|BSF7QH7rn)X3sOjBT`Bp5ZvHyIcsX?Zjs9<2_E+cq{9yj3FXl&V%L6X`nzUc%~P%#z8RAL8j5g?dNBG_0K zqV6tvl6Y9Fw3nP|_G~rdTloMlFZ-FeBF&>Pc7a-GCC|l{$TY%OP@04^YV)@>eg=)4 z%pQ(tl-D!78$vk?ayye|AE1$rpYYEq2Al@yplRtM?fDS1=Jja5;6Fuo9zsP4u296S zjyvxo)*^WyaUI8!*Tun1dosVN?9S*f1zLPLxI!!qq>c22e62S6ThtB>a?)pO z|C~&(r3_W!c|o9|p0>0ryH^#cNT^nWP%Q(WWjqG-fXNf0Gpw+0{WsT3r zv3GnjeJ18gA-*CzHD6&vGahyFdXf2aWIL0ZI>%ey^I*9~gt0mv7Ph{fuN{OdF~T>U zI);X&5wYM%U$;694?=?FK^&-AD65S zgh8q+eqw;JO0t$(b4mU2W_>?1&{cmv^C)!Fat{imjOCKXf=zfZy^gQuI)u2+vZJts z{M*-f0I^dJcD=w$$gYW)htusl3T~5}`E6y3Dh}`CQ6Q2kLC&vRuCAO9HWR z3fbQ;;<78&dk3_isVPmJ(QJok{U-7}W|7IX!7cpEwD<;(HGY5uqZz~Yj6hs^9ynpd z6Vl#fMzzHrm0`I*8)&OSZn>&tfG+#|>7FTPG>XtEXp~iRf%UH|k&tito z;k$;*MeMy&p2AY-4hpefX66Ud;&0_mfyMs0b*{4Lfq{CoKvgz2QM)brLAHD57o@4pe=sR+vy_&ct^T08b-%oHA#rYdmVH*MGi$ zDT!HL!&l>7a7b3RGG|k&R=Cd{0&zIe#KU@v&>U!@4+nZPcjEIU@J`)0RsfoU*=xAk zjCXU0JRR#vY@`~QwV=aZ&UV<#jw9d$QQO2?Y~khfL)b`n>i5G5BCmPcMhq;rrr!LG zaFC)dlQx+*L9~ogUcBZscOh{N@8d;i%!8Un8LOsII|1~Yc?gLYgjB6;E;G5gRc@X` zDYh7|q>vgWpqT^@xra?G0z`;^z|{kk5`F@p9TP9OHtrpMl6r^_#->CuS*t<<9^!Y2 zk;7-od)djG_EY6DO58;W*59lpgL^i{H=gK8%8dkl6U5ALmBLLDy4K+)FJvw0IeJGH z2GnyG2tO?Z0g}yHGm`8%SOUD8KFj9ANLqYA!Z%9bMjWe0Ow+uPdNF;b&GcD0%%M}c zln7JeoER_dTI^OeBf1BlV%@m#e}h5*LYhurpbP3Obi$5iI5K(XRGTw0zGFxyGm`^> zNwd^dZ(7k_w(O0C{VO)A4lHQaY1R+Iz(nqRHPW+{&E4sk>y60HgSlU|EF262e zteWQD-~~DHRO}6K4BDHad1Psom+N5ogzVHvxC*sbrS(%7K4AmFapA*Y4`CPK0mFg) z!siKtDmQN#RjK%U1@)eI>j?}MI0J~b9AlRT4zD4xjA<^QYG`jSzZc-R!&EwU$FVYG{(~7TUevB$6F-><-mu|<+4DMz_yT+ zw}eX+4iOHM+~qLbNuIQ6u`U6@VCP^5ThqhD!W+&|Gt4z2xWdhBd~0BXY|E6Fk~i2B zA#Rm70T|-(2cEAV7`RV^ss21#hGY1GxTgu+5CIi%9Usdz$Bp@C!dmCodrUM;;e_}5 zXn=nQjAZ!M{CvJ`04=h6SPW?ZLz)?_J05Xq#tAMC=O6F)9UgD1W|p4#CAmxP(j*oJ zoC6?*s3+pzo~epWS7tQ=$%74$ebK4t2f89a^(CTV&V$_R3cn>4a;#&gl=c_NJZb`N zBM*dIk_VSlWG265{5J4gnrhllnvRgou0}2QBNd!pwgEFn(JGAs1afa{rX$nTci~=y z(HlsIM4-6{@X}i$>Tm=apQ(P1Of350myG2W5+a#iGjPa=i+`n6^bZuyGoKJaTBNQ8 zbB0&tfey0J;%|xEjsNNo90gnqOx5`BYNLaU-Z^>0O!1vaegsaISH@Pu-7>jzujD^q zcLR3&r~o`X}T96wOqbsn2HoR_H!zfH(g_Pt+Vq3mqG=SkITU&oK>7FPYNJbj=bzpiF=I z%mIo#iNw#*r<8Pt*OSJ+nieU*@SUfEMX+UhaHp<_H8r|v#gE` zLvSlAZOgz=b3A16sOd8ZhmQonA0UboncFvY`&&~7|2>m+;TS<`G;`Q-l&fBju&;g4 zANol@w0+POSiMt9jL7>6EOj^mSx+(by;4j|RAq70y4I^Ih%-&XUiGK2n(GPsKW`$e z%vixzsvE{&+d6U#yx%@P6(fxm<7rGR#=gRDlz`h`|04-WHiDxmDRDTTg<7tjYq(e& zBxK~(5$ngzyjE4+{;DHT(yF8y?4Q_$`EONQyrrk{B}EW*&SY#X%ycmI@K6yevIgyJ zq{fPW1}j9CD2r2!O=^S|{*s5b{;OJzD|Zqt5U5O~nGm(tWJ8jCIipQ=whYfib{O)% zAw%R;#fgl*N-Ogmf#Cow)Ha>yX#u@tFv81eWxX~UIzdX2K}>kXK}b7P75V{hIsbBwR*0nN?q95-8*=gnw7xb1gqY(2n9xTFaok$l> zVzTii5lF#kGNF~Se|#pSx)S3@3i%GC8eNHnSf0j!(XB-SqXF7^;z}x(hB%?|?)0_gQJo*6hmDkK^w&il8S^)g?B{>QIioj99f=NO@8_zW|oFPH0QzH=K&3 zHQ_ius6E|~2K)fJl4;LG%x&9o>lp|II_3{1w68M-MG_5cUCtcbZ_j~a|7lOfr+=HB z3UOr-$k!z1^_huTA9*I+p~PHgD&9XcI~7~#vpp5R8{}_b}Ts$4unoO6GRV<0O-<>B-!%Tug7~hKQr4FLQ%M zomrH*;m~3hXKwIDGfOfzCF!NGbdA@>B*Kq}rbz?-g1ug=l=~i24HOF-e;cx`iS8Vl;?|_T2jX^oTbHwg zk&!6iXJ3}jwx_oJTJUId>eGc8DT5|UO>2d|>QkyMUl7(@b`L(io=?-{FWQ`X%jX>Y z)9W>1PjC2Odfm*&kY>nrM739|r4a6MHre(|4giN>&&?s&4MMO-jfoI1{I^;_l}bMT zPLI$)h{4rWO7&xxBWBw9{`LREEQ zpJhBmURABG%hG3^ouZ7jE6Nn{!Gc^*Gu7wyfQSPe@*fQQC%c6@FAA&oL;fzYs4o|) zUMgIFv0%3&dbTw=O9u38MQ_uyPG%j)R_c|hkQ2Hb1>}S%%$?k8d4Y4#*EHq=YC{}~ z3*p&vrIIKxNLo*hWX-Sd6T*@-j~)rB6j8vsI6xXJl2rD1kbkM2k7P;8O^8VZtLCLX zVPxq+kf%`dvI@lQ(-;Lr-lqq^USuuEC*nPCOW6!OWE4nDE=o);;ifb(zAOaQk0h=v z4+oAk7J*7KZit-m$olwxmW>GHwuF^|0kkTL|og!Fk9_m270AF+JS zW8*H+ySD878GC!%x53Js3)Yj^EVb~<6m}k^?j5c7NN5^<$7KQ#LIzmGM^`WYmp&)> z--sUF8^x4O@a!SlnPiRB1_A=EYO5Me!hQPr1Z$LL#^cT1)vhhcR6+FU9?n#%Gh~fj z$#=AA|K{vZ1SaUJww5j9Eo3H&j>`W`#J??3*=?$2ivdo;J)zv!6G-2r6zd7AI#cb9xG7thQ0a?uG)*YJCU5*~iLcyX&-bV~_OG~Vo! zoaM$!$ynzA*bE%3AC#^Y0AHzPgxj!^X7plh#klc?Ssit4thU^@v+(>|sf;mAEtQ^D z6W_^cO?t0elMCG%sxmy5b_jUE-70 zAconJxz8*ciIInRv6JP*?4&;RrR=LzqCF8@UjVGB`96~zUfY8&7z0GMv3 z8>Dhvyd)&kI^5dc$hTD)D@SLRMh0-&k-}6Ra*Cg3`rlxSz~W){2)Ehv3Se6%N6&H* z&~7o~Ti|82CILU0-)dbBvw`Kq>=Ct`)MiSTB5DEK3YO98wNbxBNVkajGz8{cEgB3N$m~e zO;2{iFnCJOrg5km@0IOgg|p-R9pQ+tW5XzOwh*?5#9WWPWsrR!l32)A@p|K#DmDT} zfy4m08wCd}Yv{jjg0f8>ExQGnr*{f#)T-3#3fUoE4=Xk~;AJeI0-Q4?*dBg0%ArUd z;(!Gh*agJ9BIHc8X??XTTDK*l-b0w*uUZ{QzTt}ak5wCwyxxNY)hM!kffek_2-Oj;pn@@&m9MMc6R~0=BB@e1yA1vy-fk$bXoj9ST_T@SJNycMSNMVkOL57? z^UBp}6h`Sxo6e;EvPL#MYVoSQ0lkv3@q!14O$ zndUM*U)lPI(AYv-#v|*1`l@IhHHg<5_Wv770o@mAj$PE|u4y*w-*8HMGiXmY#inz> zhFgl`EIk)4gu1>dQsFY$hinQZM?eONy{W`wXJHQ~lZ$A13aKgTIvTNV0bT@@d`0hV zPDLDf#`ZK^;}BpuoGy}6kB2ro+TL-nF0G~Cg00}P7}09Vray zoUpaj6NXHGU(E63fK?-A|Ft^WVHTbe4JlH01e9!ncbnE_{r5Bg>8O&n>) z*W*jGK|^xYc74i{Xpy3Y5vy}T9|@?DvYacB4Esp}R8<1_z^hwjI-eh*;g)*P1>IEQ zL|QJ67&AI59@PFw!7B)$nN1wHOoKTZjHo>#doE8s{O~(H>gFN@HafvHN5AXYj7d=B zk16u;)@_I9l#`qI&qcJET*Mj~g@q@4Uj#jrwNm@Vvv1EL0Q)EJfVXL;IN2xt1-5ug zXQ0&bEi>NS)A*v=9Z9~7fNQfzujZsS7YM;;|Iu1cLR4rm&Rw!0(BvYKZb@8r*&Sv< zk5pq`&vwq{{``;%yTQX+wZx;ot8T*mB2SSp&WIY`O`nTMYeQxq+h@jK;ow7`{*5{+ z-o5UQ$Kl@dQqTTW*5EGP^u7;ONbaYzpTNH9^=!As*&tlzdVo1t$vqr+=!uLNK~5R;Bha8F| z#OQzpmviomznc&9d_O!unJfhuE&J$6d|~oh{Te?WY!$HD4Q!}?PL6Xj9*CAS8+d8{ zC(U@L{+?uis0|U4uan(ROl_bRrKubF-f1_dJDM7Zct&?yi@Ky*(NuQ^QX*`8$J9zu zEo`&}U4&9X*!Td&MA)cjB=nQ)jA&@yR0;79rZ2A8%N9}wpfl%#Ryl02Z`o!&fPYo$Av%Woc*b;WyAPPrbN3gA#bj<-wY99 z|3t3!ejzkz5u3#_+OszcGHqjlkh@#Rej)DFnS|_cUvS(9Ihes;klsK9Uc-{BbWMwQCyy6Yxr$nJvs1dI+1)a! zmiuyPK!sFy$f**iOmQvZG0s+Dm;1JG!o3_Z-#_}R#&b|Or!|)gek(@o!Pn|V;NS19A<7;mJdv*<> zz+t^M2nH2PHlmFR6=?vyrYro~5tUNaXd@ADnX6ITcciT~6yVx2Nvs zy|OKagxr)9LaLYneBw)##{^!+@@07jIoyY}T8(XA$dznTraIx+ zVF=Wi_6?@13!>Hzz`Oj1g;7+yQ?D~GrViI2?%R!i5sj|Ayq|y>gXhio7BO8xA09>G zZ5Hg*r}~bL5=v+(ss*_LhJ3r=1`2f z3KJgBMefxU7zl^SEk0oGRTtq;8HB{@2L+i2gPjMi%mc6Uz@2$8#Cgy!^WY5ULI2DH z!+9`3KMHrWAtrJ_sEsOKj2^mhrhURmo-lVYgS@2ED zPb%f#cgwL4$-qzTaKI`ZsXDW7G0zMP-JxrcGj3m2(ROSmzgW#sX&crh?=ViWt6=9Elg=gT&uQ+(? zS9k`V{0aiDUwKb`)z5h~UC@EQ#vljeuVg^p zwV;k7*V!OH1>j!bH`gst*GS7nFD}jv34-3@{ShxUzG^7z>F6yZpvSqX{@*mRt`IZs z(?GoPqEq0kkv12)`av#C^@ChU>Ib>-(+_f?rXTde3NYfa%ffv>f5Ci4c?N&7aOZyN z(rYAK;Rml@jexQ)PY}FM14ggXENX+Df_8cVd-X!sxTq0OV-z^}FM@+BpFL^$W|1%d zl!cu0?&KwX(yQFXebTGkWq#7D+y#HqtK6l3(yLq|ko!s`D$5w%no|Ceh#0MJKW>VFsHjob7RCiv6vXqqDuL6YHLKZf z(;V~NgT?f-sE7J3Tu`NMx4I7$BJd8i0pHR#cl)4Q5MFqDrkIs%9SP75G69h4Bgh ze5^a}BR*p~nb2z^ojm6sj=~&^t%*H3=MTeI*=*DnAYt8M)K1`o7QQiREBA4Su$14z z3G7fULA~dJDSNd_A>Oe^AITAILBlTr~tY;1Rl`CPRZ|_n7_; z6ceigBwyad00S_3&tMk$oJdl!5xjlGGCitfP(;8+t$VffMLI&ARSaph&+Z_-lb%gr zJje4Fj0;;6`i{q>N630vEVa?z@tBM!%2)grMj20%_vIE>lt<_>EL!;(s-Ff1w0 zFWV|_-DS5DV9a~L@ECu9Hb6lNT@k(f`l#;vc`s5ZD<0kCqqz?Dnj5 zGAl1`PRr2#s`BC`{n+WOe%BF?A|s&8$cukUP}C2T7ysexzoNW&KW4=L6M6AZ_#Os9 zz~=V&RdBgOYhq|lS)#b0Eq{sMXNXsZ7o z%Zpp-h{%i6iHyA1?C2{m{)sLj^5W0fZ?wGlJg)x&c`>3Qtr6cyPWv!f;ME>@8nRy= zcP$ugl)b!$19qNKbif$)ip}2}WoyaRXH3tB+7m9$%?{@i-85=xxRO#6_4xB)NfX%0 zhbVz@=ZSY=Sfw`z`!?m)mL2ee1l}>qTG=Pxrb7OrZe&&YJmT8q*jpHN+b^SDZcLB! zhLc%glqo0&W*R*Kr4*E8q{rV}=6=HgFn%1QT#8^p> zF8^XUuzCJK+Bt{k=d^|cZSx0lH$^%+#f|J8_z|=|97t*p&0R3Ou(?keE53;oopRO6SNA#szodA?-D+P#hRai;lzZN}L`0p@RYwWplrYhch=ggGY z;CP#Q`*)_@{8T20&e6h7rQ`X&95FLZZmr`p}2;M5}N zleXRYF`b(KnUEj*HU{C7HckgW%}~806LfZ_RI}3)2g=OPN%BTJ9;DW%v!5eqR8z2= z-i;4?;Enm0bH>v9Ip>)%^L;tHx%MU2Iyl+W(E!WIh^<{+F%sQze4QuoM*X_L@%hwM zRqB5(^R=kkU{jY9QrX|nla z89%(J4*ArlOPp_2QZk6fj}59HYOcYeH7`Ac^XotzOh8-+l^pJuAq7Jw5n=09(IMj5 z;ND>?%Kq~2C-nKADfL|;F>jmRTt?&OnjrsidyZJ{AmEoAPilX}WujGRQxT8fqiVeV z8gjPpfUa&5&qw_0Qa@_M{fX1_qkK&IU-Z_E-i&H*<~1__J&CRb=JVwEJqHz@Rse|> zqn0$lD^@^N?DbgDjP=oXs0J~|Gt~Hi)Ton)NdhdVZibrpLfB#(`{ZW&Fk(oE)95prpH8sq#iqjX0|7#mZy5sWbK ziQ#RCY^Wg>EK+zesCgw}|CLxvj342j=L`AgkpggXx%qAq-4%wM0L#vf6~*nYRGTV< zTswGO&`=_;u}dKb(f5Ov3D#ZX#%*2N!Q-PUhZWtboyIhKY`AXIcTxd0j5A z(XGTl-7;CDDeqG4skM}`ND{sAMdF+IMJ;TxVFM_7uw<_ENx+H|7=XayJU}fvt&Cg* z0N(O-^1`(^1$>iNX{=%+-sM%}wT_jIvk z3%Qb8dKxZ{S*EQI#1^=jMoB%`ZTcfeY`YDWXZnL(+MGjtl=kN6d{3fpS33FVN=e5W zQ%^5Mu;Gy@tY)~vT$!&-n04yu!^cnP+wX+qs6hq(B6mCAVQC{cZCQ-Yz2v_ zoLbqubaI4Qku;4Y!9f{`IkQ&K+VlXu@?eC6YV7$edON)G_ySi8YF6ri^bBn8akKIa-Hxg;&I=J?6X3`3)CqM-8-!x@l2r`gcU@n(ffcuI-7~Dy;gN6VnK;JVtt5 z*Gz2TG5Y=@?qxiUMow(yPudR)8b3>HWsuE|tz4}bS59o@D2gsSw({GI-&lQ+|9t@B z9cJoe^QKxn%&h@apab?g<1$rSqW{r$^OJ}io7p>4=#^8^z+nw8)K@jl?%k^vW>YAmCzlc0tA_Y`oYQH2zZp@(Zg z^&ae4>)H}Ut3@M^k$HC=pMt z&Tf{v$)oXXinm(rbCCliDR>rB$3@{9t9!{;axM*ZUv9(Djt^wj?<$f-79NyK^{g(YXV-as<)g=$q^vA0T%B4a=S z);of@WN$jSG)$iBLa|pmTWzaUqy89m9YY^|zctRDLjMjhvmm4h#?8_YogwqUxy} zc>z+3)#8X;fJJFEuzB&}v?tS;B*GHm4mq!JDLRN|a5!_-4@`|gu-uWL zlndO)|=ucMr-_UER4cQom070f6b-2vF(A6M2koK~W z39!AM!G7bBr%~457CE|GEPQJ+L``E<$G*fF$+aQRLvl@)Ahlqnjgtc1eCM6 zKmwforNK^u0kvR{t5)rAo5tLWa5vY9806+gUsMcAOa4oiD+0m|Ix7Qt&B%$yfA0t~ zJk1?)ePXS1KPL^WKcel6g4F(x8o`9<~GYC z{jc}AFipnl-wC=|CK=u%J<;|K%xX%bJxTNpYmm>{6F(RKgQ-F3fgn~r1ZlL)6pt@K>0WI0sejC(UW>(%x$$hqhl}EACP>{y}dorF5flNZJIhk zQ}wS%klUA~q8%c!H&$NHgu*|OU${APH_t~l@vouD_iigX81WG!&^*1-fB<2#wYPW0 z*dTi&@N(5jRd_OPC)vQ;RcOa=6DtHhn9DKfme`&9GX30|sYFNI-L4@E1a9#*$!D?K zP=nf*33p1bxAC5WjH*ov#hQHS;ZC!>JxuUldDlr3H{7{T`c9;3jA`~R)&6^EU`63q z3TSWP%sV$KK)z*yk0?|2c}-Ra2OR8cbv6o}mm*}8X*4PGj^NZ2%-w(@>_720v1+dM zum|}v>5XHFd0nP9v?BFqO6Czp#uhze*lb+1XctHqgxS6*vIaCYi4lfPpOo`9@vumv z<4_|w1U7mug8Y)EqffmZX8zALKl!YLI?;e{h7QSKiK37}M-3rHjZ9$f6~4DY>ew%U z-&|*+q_7QNnz~5<+Xc{`4zZIKi@-T%Vo_Vy4NdJ}~zu)xOJyF_OM&)3=5(A!fU@8Gdu{d#^kN%sY51y5`|5Of-^E857_WGVf&EN84W<{p=e ztunR7N-?k$0{w?OgK2^f|Ak2|YZXCO>q1dT27nobkEul+R>*oQds@ z&eZ5V?at2h1=0oG24y;VD`k&Swm}zJd}k*ZTtvL6R(@kb@W5xXt-whLl4~Ao4vM#> z7v8~4^{$V6ZtV3DWqoXN)<=A8Z4LZuib zkF}VCS|2ium2Yq>aWC)jaJV24rB*q7LCRdeXKwT8vrou-^XN1F9o9_+Jo8XV@aPWPnh4Jf*L&vm z&F>$T07qlxm7j!c?jQxH=`Zz3bERw^JStW@jy}cj2>R8{?`U0%e+QQ}PH8?~c2ph| zQDLcmPyO$4GfH0R+L!S<=9K5h{RY`-Xpw}=}^N#-;654G1owz<;Go6rxXxe?i0 zX|61L>tpBse5TqWZoZhgp}n5WbqQ7`%Bx_@C1aL%Idzn0>yYt{%HB$YqqDct;MnY~ zk7SiR31*)Z;lAW=766)w*bkw7-Y4av1R#c7+f~wTmFAt6iFKCgm(&!?-b%|g*;{FO zTJ{#JVmA_>ENH)yxnZdJ@eRzO1Kq$(nD6Bmg4bd((FSTN78o(qL>vu4K>X_3D9dR= zKVG%Ec89O;IuX8p-}~nEsqXOgsrRDR*m(H*&f{tTQl|4k57<#0rrkdTz>?3*MvI(l zBA>YNnzLVcxf!0h@u^k^I(+LAz!1j8`(v_w*uZkS%qQoQeSCGtBd|8oHTmsb>AP9! zta4e|Ah3Hp@kbek9gyef4$TSiyv)>BYh*o#UGGY>TD-?AS^KP;JeIravZf%p+;>zW zbdGfGG#NWrzCX%mx)h6_2jW0et{=+s=cY&&oFP#NSvU8^ z*~(-7W{v?mtZbcrc-czk;0f0G^h7d?1k*v5)P(qN4?MP3+6S(pnD`;rc2-y1& z4JOHBXYnwWE$QW^3Co%J+{eRy4VUpyas)Yb7V)ru!v#DHW*-*wa6p6Cs>~3B zCrT(V*19<#`HS>Z`h)yR_fzaB!3>-hPVVLCY>nAoj>u1U4TtO&ZDz4k9wg;#1gwu2~-oQCxi)8fo~CH3W6l7JSmWC%_ToJ z=}EmO7%wEqDykAHR5C32vQVIV1>y}i=k)Skdnj|Vy}Z{R%GYvwd9OW`s+?ZlYmcQo z7oPXpgMpH1c;0IdWC*PlI3u~Y1mj|%wLnfHi%STV3}ubfRl?kysp?DBRVB7R{0`x4 z>MFg+4zW+TVZic@=pphOD)?Zb!(z6u;Ac($x~ahzW!oyv+D;%jS6iKD$` zi`ZUBLWq(v*w|+>pFfCxCV`V^5AjfkXy~ zquROVTCzwBTuQG*f(uGS(dAccd|X7#)oNGdlgR~thml%Ty%+PhkbF{dT_~cnpw}WX zsbevZ$O2QCxo$%QPemdpLU4qn2AQ8oyF@mG=;lPo=oH~$C|~4+Q#yHq$;U0zj7}}& zc!HLr2>QkLL>qgdRZMFG`gDhDczmTy@U>c6^@;7q^(d8961Ri|Elg z{%efIJ4RvzI0Gvpxt@#!F;Zq|Im6n+Lkw(g33=>saXE8LCrL2tf5%|vS4I31_~^En ze^0fa=pF2@A>|pT+{LO$qIi(|)9cZ>Rgp9lBx0^^eg`FLx+@d0Vq8A)o!hR@lQL3Wn%um&A})vo-|2HHa1O z7AMtN=*Wx}EqbBAUu5Y45~HYkMwY@i?4^J)t*58C+M0}Ze+StD^_u7nWOYZB;5+yU z`fwsGMVYG1UFefi`iiJhkvH{KimOhAOJU@Q9^@wStJQncUliMc&(jA{JMXNv+<)MJ zOt@O2=tBpCI?t*8$_7n`6wjkL8R$dS71-gw9aR{52T3>DE1wae*amO{&D50}Wf-@R z{jCQaj#`r#M~I|Cy<@OhG}fvqR!m5%F{#2F1_7&Y0{AdJimg^{n>@mJ$tM;}Vx^WX zr0v9fJe?r+R9rZPwQ2rCGDdg$^A)tYSzC(xg^XYkBe*tQ(uDGx`^A2HPy;Y(=1n06 zXe24odGEQD2vMahRJ2_8OY{!cGhXBuZt*zny%QtY3fE><31iStIiCZXui${(M=NIxsEJj4rhku{pJC{EU z@HQL13$>(hJ*NFQFSG);0x=hyzJUk(jhSsm?aRi@O-A7$-jwpuRTv-nYV1$H!4FpR zIp0?DL_U_i@uUhS_<$Y{3upNN7W6`-&-FmZB;Jjv$=DO$Mpz)kj@=NYVHBp+SpFnk zj#|?p7A5yq^GojeyKxs^I50+#^Y}mMwO`e!?E4lA`fQRMtsxp5uA=Lqjs&ViO_jG6=S~j+)dy0HWSRN=lR_vuP5p{iiT5D z;Y_KiMd}=Jp44}q)NABaCvlc|_`$UewmamO+De8ymCZiSEw#;XpQgIdc|85#`X)+E zjL;($&Kyoz-M!i8d323zs;6`?be>~>`T^s0sv@FWE9fa0`6w%t$(#T6m>)(*wgon! zjnZ(5Pns#pW7RNyAc+`jW}w?DeR2!-XMnrU0WNw(fGgw(0FQt(Y)0#hzW-rIsRp8d zkWww;2;lzw{{O9yvi}$AJySM%x-qu|F*OP@y=jUbRQQ48T8UJ^#U6?{yCs?qy<2Jy zU`-AOaE{)EPQwBGN|xS-asa{-o|Xfs@8tmId;kZ){>)eko$cQX+cvjEv@^2*3l}4Q z3`vHghs7F))sg*Q^ELK}j1SrWk*E~8Ldsh#3;_FmrRm>clJ3bb3Fu|tXa5fiFYuA} zf0@7HuVR2GT!65(!rH5juzCyo8!R#3f)#+vxLET7f1Dw<)`_K2RJAIY?lV z3QsKLv4(&~+O}|#HTEG*J-^PJKr@NT^MIa&D%da>eGBMQs)peBrB0l*p>Iz!slw9aN9<4(`4D?KqkYOJE$V6@3S11Hdf z&18-}GaVFD<>{=!kxm|)U+=OjbwOU)Pp2^bVsA36Bg%u)r zq$e@KMv^zG)zeY+g0vJ>1+YWa>V;5(kf+?&4HR^a*6HXCQFSIN)3!)cGLK_iBzbH| z{vhq$wJRDg5Q`N!3ru;4c_JJ|BReR@lc`11g_(e}aF_`Y<7>Xx&55HcQ}$!T8n?_7D!IkT|7DjjXl$--EGvqV-&*U6qZvXY>Ka5NHf=S z`27p3m%5K+tDg${(o&jfk$9$=`Fno^iBo44tas}JOD z_UpGN^ER8M7I>S1@HR&Lzod-tH@|g~q`cm(Cm>ongf+fLL;q^7;dtcw(tNIAfM9)K zfHL?FTt+$kPbsWWvF3mD4D>?3tlgOYGyvXfOh3vzXkbnUpwnMC{UITxQA zA{Q`EkFPyLzxkZod2{LO=kuNBqAr5%`p8_AtUuY;8{nV#se|cxR(AUvg#CGuN3g|g z>ii}FhWtW4YIn%RUg*P7=Ox>Itr%EMf0gZims9c(*GDL{ofn1EXaJb-=pDJ8p;@hw zn$>EMwzf*Eqcp4aNgGF{I$_JQJ&+q(rTJ{jugXK+yws6tkWR?+L&BC6ou?a>#%cIG zdvuyB8wFRU+ikG9vO0JwSsn5zel~j8dZ=>7`mmN6rfxl_$QwFWz?QmORRUU|iNF{|IhB}42$4I~;) z{ops^@zz1E7)|tM@hfrN=kSX-lboWGidby^!|M4&d18?p(j{XRsbo$(xA)ZTE97xV zf|tcspnHF$y{DDTN!lP2iRM4?GOseR!Y!r3u04`DQ@_Iw+g&Pt`U`&-PF&*=-+5%+ zo1ZAAT^~8rHzzJ^%icqn-66&^nXo>wxN#SiTO6xHz3YH-3vRuhGsSEw6_0YQuORgNJ)P z9rXS=7e{KVHI8Ul36A6rI{39K8EZtKsrr3|?4miuB&s;=90PzPv2O0@uLVB$X^a#q z5#$@K^std~Od)9i$Cz$o#l5^p6hb{h#BLYLao30k=%^@kOYgvh50&U&fnJ2bAfXr7 zW0cHDzU&HITfE@fh??wEJ5&GmOT7L7^rcXZvx<8O-nP{J@`5sg6a!P8)sV)--(mE+ zJ@pFL400fSSCjFuY7KFyNsK3YLmR;*BQFogOI%y5CcBMCj0nC?F({#|IU;HIr7pJI zE|ReGj7HU)5SWn}0y7%|Gg4q-%}1`fjEg+AZRNX*K9xO>{Ez9)ugK#QiLY}LC$&DF z$#*KDmZiHk0g?fP#{8XU!Fi`AK!M4g`i=7Jl*OAtuZ zA6o>nUx<)Gh8W&tssbZC3oevqobmROyOt0U{e|2GrqEjNeut<}oY$xTiH=a0hBHHB zf}W*bibHbbAkuiKw{)-ld`7yVEiEOYvkuKus@}lPh@Bu65@NMmy-zIsg22Cb0{8`= zj;O>gE>h872vTfMO_AS3T%Jk0S0#QS5REmSD+Q&ue$j_YxO|@~r zANf3*K0AKAz`l;82jh88ZG`#@bTzDY-1IL%_)ZjI zQ&n?;@mW-bgXDbKAq`_yHBWg&%={!EHIPXfzstxnXnrOqX}PX*vyp;LFo2 zRA@!qS?xksENTvon%enuO2)0Si?;<0r+Mr3SGrxD5!C+kh!KhB<_J|&8uABA{58d? zaj4+w^6xucEmECO1; zv4-3~Y7|w$atS#uZO(}=DnjD0o>J;4QNJ1%IqMHG$kibnxndGr>5*1k4bSVdU%?9a zThYHap>%iQBbpdg#f@A{5aW<09B>nrVxl*Iu#LSBw0=g**Z!z^og?-CnCYY$c-x4J zZ>%W9bfQYNK1ZJLwg$t$&%wF7MZG?-1Wv`1_%2M36zSWui~6 z5ZR@4Txzwr4wJYuLZDG+OuhV_9*>*~aKH$1$EWZZnLIx0FRM1}m`~g#K%F=t4>>-v7qd#q>T8l+a`}$oP z6zgPaSt!+7ygiQ0N`k5pY(c`KLw;xNDAtbIvymlL1A3Lq+S23{RG!0iP}J?eVCed1}^HP_Q2#;nWMp>s2^nR&JH=lsr4*O8R&nx4Ld1dx%8z=2D z7f?n{L4u32b=<)(8A#yL?&iuiv4HvLxM^ID$Gy-1&lNc#m2vL< zHk#^cOhUrNrvK_9(;xP+9Ci_79aqcEsr&wwb3h^-5hCzqa#08EzN{p>A9tf+045-8 z(ClaG0V&&Cq+S;pPa2T&4v$B=+$uz%Ej45BfV}jXGCrwmVCo`1t4=gVqUy@xC|jqg zuGJI^9=RA5KC}uQ*u&bEB&x{Hfq5UVN|6xvSJU!6{vvcl_lWW?U5ZO&vA3pFWYKe{9=CpS&r&UeQ0vriCM_qo(_56VF7t_P_NGIj)l5K25M zgw3I5+fwD!Oog9zK2F#l->W~~lKKW;WGZ>DzYw7DWijw8VnRE+WyaKG8FP?nuU1!% z4k@b)VjNaMA9FSuq9#KxN1Ls4wtzsT4+R^BrhX1DK&wMDb^kMUr}~lYfIamG5+FAc zR!e+gb#+k;lqAFYm%{$5;1er-At-bk4NG?3X8B#QpK{h`j-O z=Gnp-ttaOSY`Qr7THbi-GrI?nMT5}#^~7^#h#}f(=9_f=PO_~?9SyVe_e9gAim%|k z45@nYx;vnxqP&QcjpXPaEC5U+(vFkkFuOxLkE@oWyTk@5ii@}V?;$=R%rrNdJsZNb z^_xCzNjOOXpZaQ1^_a#8bdha^R$hY@FjmTp>Y*6@7=FAP)x+<3geZCFL%%r#fIJ;P z&}r&04?WCPxkp@?$Aj40Ke#v&%CG(V48@$<3LSdn=-zYPc zNTojY=||5%o=)6tqwGzi?1-`cV4ku5-8{4`3#xkBk|{SyuG%mhCMLfz!)45v=rd+q zQEJSXQI0y+n7+-J{;WiJBf6V0{Y9gYSA{dQK1I6+ZxJQoESfU?>vd=EW8K8NeD&Xm z?=uhp_}jAdAE3Dey2cE&*ISLk!91wyy_+aducBf5<-}6CE$_Y6O_KPz{&C&Rr8Hx= zifpz1JI-Y$91!saidNlmo$*~4e-qutjApGR66xG@l(B{KSoAQ36Wvn4drATOrPj>o zVg5Em!otAQ2)4nqu%FCYZ*pqD7MxSS!e^UaVG!%=pXQnT36aUZB{mh#5hM#oWv< z2XmO<_&PG}@XY%QtD3A6MT!^;A?zUuY^vPK`i}dakb24AQtf)7y$g#%l6(C#%z_q6 z;UfIca68G~8{|qYy*FN2=Km%Mc|sZc?#y!6%rZVn6+|l{Tpb)c!BML%_YboCh~@rL z&jz|71~|G(iAEndQU4n9qL}NTq&<|OhXY%T<-@`Dj%$Vc0ePpE33CTnhtByW*ju*8 zSijd^(O;$n_F2E=Gl>85efT*N3TTpJtdNwp@e{uK8_Dp1kgAFE6)6PT7WRw5n2;J) zRE)#nvjiVmiZj}5OvI$3aFBC{;*mQXz3i77{p?3JiponKwgf|g=KBAHQWr_P7qwI@?;BCq7DZ+MLlSvuP){AUa0CH zrPcWt;^0Y^3D#Mk%H8MknOo!TYcbbWQPdeL_aayp%O3V(dk+`M$)ofd@z5fhX}R{A z869iCY%?vQAI4KQ6C|kDyC$Z7y^oJ{SdgE{4ijx!@0EE`zi#GEfq_#XCxp-5q?r-S zG)MD1Z|4Dyre=FjXz+1+e;_ZPx)`o@<=4-k66@E}6~snrSh53N?_4an;0KL(TpqJ+ z26l$k&iRCCnczteso01K*Ih|6&?roJ5@#@<#3^bFMUjIUk4?!Z3QGR6F+GhVnvVZ~ z?-va2mxo%*>@mIRbCU-KRwqoccU}WWk(V}-2e4O`NA{)=c0J{SRc|w!j^{1Q%d7uc zhwyg@Ym@tZxH%b595CvastMAg`9sM1K@v<5<*wFrf88BmMt6cAV}H^v;2|b#yU)>p zTSNCw133Dgr@nV8;CcjbNa!@+K1Qg?VWltBZg!w{Mn#VewV-j=2EZnr5wLxHodIOu zbAwv!b$yUa8`OUoa@qD+A7AJGCh?2(X@fU6luD$56~(fv%f$t7xY}Rh)5Oc_m~ysE z@KUmkT>41MK?LKI+{wcQP5blmJb6v8=j9dT4L+7UTxdLY`xi^2!(qXvZ7jn8Tuk(^la`4+4^S+<5jK6KsrdMY-Ej{c zIBAXO&Dq`xKX59X^UBB9F`KwsLqGe6gFPCGESCzx80yuMe0`Yl#Nh!Z+@=UZ&8A7+ z@;msjES+HPa_IjNmV@3eK4edox$ab6+ao_Lz ztcbhmJbFDeO>(n?uuW%oh=I9Fg5yp=H#7K=f`B%VZutjEnmCu9uboJ&*Eed-{_OG!Qc+lJ{sg49FDF7(#VT^xhv)5sgoQ&hy|_f706Mb9VUPwedHyKc6xme9SmRRvocKQEpdDGv>{;@B+J}&=d-}Ui-^?BkHdi6IjAFPijesP-hp%2!e zKHQgxnu7X>?PhDwOTK(&a(_vDa{(-uhnX~<=pf<5Y6-dGh7XIc7A;zS)2lr_FFj@^ zE+#ublq|_nF*A$5A2gP4dxdB=Vvo|aHjf6xHxJ`dRdwe-lbIwF61W3Ih!#s)#u^Q4V~1+uM4g-5A$MQ`0a0Rov8zk5 zTB{@j_#|Nxeel7wW!qAnZ%HUM%tcgl8? z5bsaMzSoFe>Gr)G_AO!F8%{*vWsw1&n;GN%h-B;i z8`=(G0lpPC?AeidCt=r%8})P@6^wVV+Od;0*PR*miGKTaT)r68Nc6eb>z>C3t6L|I z{g)2V|A*~$kEVnD{0C06i3m(n^M7)tX$)6a4ULhG=*@|3)*okv<3i0ieQtKOGPi&f4dO-Wg2T=L`w^+O!+aG$<-h;q0klNHzm4{-wQ^5B z;`np9b-@y|yk(`SPE#E92DdIW5Z`km%i9pLJ^k4JGeAv8X15m;XpsG*6f_tjv)kE) zNb#SKVZwKx91s)E+S^W7{6Lbu?Y-}(AjVmHTfa3KI>H&lk8gc%K>RpsZyPYiW{B5= zHjX5FTi4^M_;J?WmLBso#Onc0YRd8f@MGxgZCAk(cN}}$I6OWTd)oozXKZ>E3U-Q* z^Z0+vqqasOo4oep02sGwmKzLNUBx36GSxAo>6M)VuEsi4TC zU2lzyb}@b-2X|O_9UQ0NG6gFA`8iRXwji6ek@yyw4jT``0mCqVS@@Uel^pD~BK<7R z8AAdj3W<}J5c}tHjN~1)@{U?~M-l8To98YU-JPj-S4DSgV%Y8W@RmyYuV8v z`Th$}X~t3RaMW!~bye{dj;wLq;6LGjLXf4&p({_Y|LRH$XhYoyqulFoB;h3H;m`$Ispver}B6C%;JGXSd6=UBTfkgrV1)6^*{f zQS@U$PFjKEfbH%$Z2y}+nsnGs>T3cYWAx;6>~AbzG2){OQ%@a)>qTQPdXEHL3VSw$ zEBhV~<3ZATbTrOSHM{&S6T+(R#+l#^M2+H+(n%50eZJjzo6b{_ma1l?l=SC)8wCd0 zv>xfOD6*C(?QOtsEPn;!tQS!^@;^&WA3=klM_2zuLS6s!zrmwKknkuvo0ASrA$KbZ zGjuuDU?b4Ot0j9U63!t^ScwN%3;SH9%8&>mDZYAwzSRul@zv2vp|0|1mFeNtR1^!Z z?$pDp4{-qarEZ>G6AQ225eu(gQzsz+R746>2xtVSEmFWYg$fU0e?;6RO+eFQP)1_z zQUk2@xvN{uZA?kiMp5bgf~$vS%7m&VY08pREoLKY5B$(vz>Ns?fIr?Ov zE9TEPB%M1m;S2s3a_(BGiIVAY-;4d^(?vnn;Vj(=V;_R7Da}*^s>I#Gz>zK@zc6He zhi4ePzZS`k_0kdvv;ux#cQZzW16dJ$JB|>M@tEEvFEK}0TC)9PFs$110Xzr)s7(be zuCzFQMfK~hr>ya_-0UNJw2YV3e~q<+q7>mFGNG?%bFmF>_6DWHMJ}ppzqu(iZW0Iz zCsWb(;x@;@`CW43SIBoQ=C#H%gsq^Iip$Ull1!Auz0Z)tR1X|q(3B!qCG^rsjwLFa zwH7Hs#;w%@$K&8d?$kQrLg4t!l)&*#O4&>b9B*+WaQt(JFZ3!FHy-Z@#f^(TQkQtV z(2&48(XW|t_Y%d9W33bZC2SWD3PEaB@@KcO@6j&hYsmnEIi3!U2QR zMhZhrqZ_%EG7ODKNz_1~$vW_IJbWB0)Ptq!LHKxlh2r7kgOW+HJPPew0q>B^M}Pd6 zmXP}o_k|dQSW>TstV5hyQvCRD6aFZ7HR^cqsr^xsuth8c+~E0Ek0lds5yxGNAsh9X zxeQP%>|e~)3fv<_W}EGYkYr(-9yVU7-oti0herO7`@^2Ue*IHQGU z)H&y-`%@UB&%z-EOR*nIvOj4#Xn#IA2L1EgpX2oDG|GS27`EM;&^IU2@5DIr3N7zK zI2HGc^4Kws2X-LZgMvENW-!KCtYC&KXWXN*&-3UJ#B+EM_7N`nFdB`8rI&;IkE7E7 zZZ89%l6KN-*MOS;zpWpa-``1C{)aD0!KZ|v@d+JZ20$hfb4~`C68Xf2WPk0?Xq_SW z^xXvm;gd*bl@zNkWD)@g^`%+%_}=|0)rr`U{fMl1-LPWGQDLdODnSQDT_y}Q{I#K1_Q)M5nXhjvH=j|EWdU< zeyuZs9RGVy3UYiF4m1NG$60<2w(J42MLT9*0BZ* zVhHs&{hSHrKScJ+K|}Uf zJtoN<`POYZSf4dVCLK{Q^j2X=F}K}1q~=K9N#elJ;rBm+J@T!8PJ#ck_DFt2$L9n8 zb7E4wo+IL{Jrc14(K~04d(SE`b!MXkt7+dCxd`6XWUE z)}NsUU%q8@B({tx*QOxH5SbXyF2^7{IFO^`nwV_zsVt1|eliQ=S^pvn=|Kn9M{{I( zG+}8xe`YGO42`AnjIhV==x=OXb9#-9)A4x^&Pgx0PM#%SD_X{5C|VxLBWz;K$}oQu9nRIbx}1`46<#3NxrZyHvKU12;knp%ZCKRRkib zc0@BF-8Ew0^M|={Hq|tLK0;5I2T;|`hAG84il!pybr>5d^S~hrccjpDt%gb!Xt;CO z?T8tgf%9a`?lrUbacQM&v~CTdrr^^zQb(9-Y3}q+Q<+Lp_A_wk_VxT^*@>|z`;k$n z9%V0^Ho+k@@@0y#f0+zVC{VRpYs4xueu1D^@)$L31Pm*F^QdSiby3miTbhapdl3=& zNSID#N5r>M+=7SbEZi1$AnN<4C{`Rfby7-qk+fC}Bc?xa(I_zjM~_GSimjfiBSZeGtW zAA;Wf)2%9tc>G`YOxqJxd-nL=cEYf(=I&DA6bPsFOT=+l!Ay@ozvD#9|1*3kdHL@Z z%b$z+)EB>A7o7JYRy^N6P8L_n&A<=y8V7?`*PdU**1lVhhVImA zvGVjGtbC)0g?=pjyMY(}NBY7OoW?qeWf$E)tv$wy--|FiS_hmzB(vB1w%MU8^w^xT zq`Z!pZni=0`P-^O8bHp?=ANB7*BxP-gF8q2)>v^fhL*fUDZ9;9>z&FPLa62oWCY(u zELv{{0uK<1wm0W0N~BM5XE^g&&ehzvI-Z!L zRAnF)vB1NdTN5r2gPm`!vS)kI4G-JuVJ~mNl}z#p?nOfV#x_dRuYjn$WJR$EoM&s~ zp1;f8M`CAP^LRu19_BSPACQ`|VGw0qjXQ|)`3_m7=9|z$-)cI0l@Q$^{U9iLiiTr68=>*Qc)eBV~Z(Jr$;i?xuHZrM0i zTJ>H&&2|GFrf>*Efm}=G)44YVYUodsvcb?R|KXAf%ADZ!om-UP)Le>x}$8yfa=skvUC|Ez)L9~=SDO8~z| zs@QkN0skZY*5JMqtO4Qw(5?gaSKz>)>ww2thx7P4;4~hrLt*kde6mj5uh&)b=i6-mSn13Khy=!5{J6Hh{yaq7yTfY z8?gO@=dBiD{4Q;@j2Qmd?uJ8MlKyjE6LapHt@?Ib6{gX42^JiwNN8Jg+5fIGtru4^ zo!V>gX!SM=vFEhc{U(4PmtQuq0=CFJ%|EeGVYL?IoLWxl0_2`|F+N6DR0K9k*vvJy%LU@-Y@FAXjfv|M2 z<>3BKL$@A;0!VO2a>_ic$>Ug)#|K-J^Z1%1ZK4bHH97t!dZIM}o`FK1m{tuDScVf! zO&W#_PNs&aD}qAN1~)IZ1}_(mmb-=?Fm&2qHejV+b$ zNG``AXiBhe^8H8OuzUft+w`FVmDC(44`|~;ejL1FQ5->O$*sIL_AnRg^=N$W^PoEx ztw37@A-xv0c1pgh!Bp}6>oU%Kh3!$<@n@-NB<}3nk>79wZSjTVZQ2QakBe0!b=0Is z*;=`$*EJys{TA{KHuIFbJzT+KkcBJ)@lW*yN05#upEOQxsRESRiZbXl%+P5x1OO{; zW{In`ETqy}13sBlTK|rR&}mdNs|$I&NUeoTky9*@vSH77C^5%R0{n?E~>_bbv5eIL@`%_qhC3rYZjN z#u!`H^G^4%7y~vRPzl~^F*1^H-i!7(WSqGQ#nnjm0Qp2=*{~)`P3LlG?uavB-fxR3 zzoM}enM1(~Vu_`dR__-Y4nMXadli*M#=8B`E@-NigG6L_{Fb0avodS6vu76o0g65s z&1y$5JpPJq*5%E>^qM+kZA2rYI;_+OJe=;&`%^OG@tOAk+Qxo8$e|uIP!BLoS6BP< z9z~^OsrB>gg#nIle|1t%xv#BJC$0VouBXMHL&q-37r}cR)^_58lxziV_7?5u_Dzo0rKaE0V|yp@|7+p|a|5U5)qW&M zV4a|s%7koAFTHnv#;|DWH&%|;vX+YvLmxR--!Gyq=$$WUDqgQRx}_yGNW>VM3e^|E zR9r$O5XA~eIx8eXP(+$Wp5jd4^)H)j1_|^ z7%NVwV4MjBV<(b=V%Lav$hwO0*%TFHC-w>G7#C1qMkIFuN^j9K^hGFGKJ$)%VHc+Z zt;g)kY#JtFvx`kW0@`4(7~H{72B9j{(eQA{@Z<&?0q0f_TmOGg=)ZA{> zKl}$@huH!)4Nq>1C%4@tt$f8o77LJ6TtH>+_O+9q_waOo`C+UJHuW=LEfUP3Qmn7V zy~kY(;P+522UoG!--1bDomNdp>&A~slp7!Y@K_X^QicH;BakEl86yzmYt8)tr|cfY z6I3`t6&koE=A6FOxB&j1!|`Mhh@8}vgKIa_@dRsSI^%KWOj{qyl}bt^8J0d^fKWevZ%`zafw6ROIBzSX3- zmzuLVf&`E#QEK`)BNajP+!1H+W|GkV#0l7<<1WHn-F`E4+sW@}z7zQ2-st6(Zi1?m(!-(1QK6CnTrtcR(41hXVF4`)b97W9FcMY-+ zDeS=P26v1@syj+~hg^4@>$1?g`W_{j#t8KJqO4s8vlp4XC}XuSdsUEsng@nfgUeel_u|E5d8=K>Til`J z)a0$pN#6QSlDu^QR3j#D?ZS1Oj~tALoOCMk)`&Am-WoAP3{za*`X#3a(}lcM^-1Ne z3yRX@trybeE$&yd4}LZKPD$Px%C$IEejXOX&yQcElPV!~$-e10s1l6gbh8C$9hanX z`K~A=sc13=98Z!;#{wiA7+mW>Ge2bf*(uXs%zXps$&k)J$x|yhI?O&Ld20G#@|1Kz zvOM*VfD)(5t_&%8O5qn%;+eYJb zGf7y<@|2CEh>)iW(okejdFqToku!=w(T35TiXbN?Pw5EKU!HpNi^=lT$s@?|6%0d3 zvd*aWNJ5B&00mrdk^luv-~!ZR0}D_;6#~>_Ndna6aRI7b7ohGLK!9pb2v8J&(@%i< zT>xy$paN9FUl8FsEM|CC*^kLaW#6M)ok_~7)%^n%*q`At0M9^p2-@HwsKP^#+pH)& zhwN3mVAHOVyN@clyM$paW}XfXHyF5eTAXD@_GtSaGEhH+2O>YV%qH1L+PW4cG3(Ye zPBF+eP-?2cwH_IiZry@qvLzFi6pw$>Mx=+_7`LcMzNHup6hOpo;;ctlxX3Gwjye-3 zoxu|lZ0JXSc9* zJqRyB>ecYriDwk~nV(@?>P66Y7p~ss5yR$z=Xxyy*~sAhx^6I& zwftprBhW2oFT=8=7|gEZ7$gL~OVcnYP2f8Y2AvuE)0w$Cgh4%N7<5u%ppHQU$bo&M zPap@L#USh{v8adRb2V`caj`nJss}qM08Tcm%nSF8YauvpFIO zv2bb{BBhCi$3djC6fT|XjB|PW(s1acB*hpG^%oVNx1K;$JacjAM+59a9B_`$i|g?^ zL&ksdl}hLLa8AxxGQ-gp_NK ziG;O0AX=MbQ+=)GXd9i@%7r?|`_htS`(T!X$mTY^mE`A1LLB@&c`a1uhsjPuP2E)< zp55?~ho8J^A^*=mBjS@Jxpnwe7%Dwro5SV11LXes6J84OaJj;MLkz1wZvnjhZEyfB zgo$BwM$b-mNN(OJHP1%PRV3=c=Nk7-Rs2n4hM>F*{nA35QWl6`6vgga*(> z%!B@f$sm@61L*Al$sqn4#kvnY$&B2EUdW8P1AS5w3!4Aa)qeo<^=8_---Y^5X5(x~ z3gLn*1E=ThGJYvFL~>?`{)r))4|ucWU<7F)kQGAii6A9}?E4$iLi8Xxh;OG85~Mq~ zN4Q&lC6CfqJvWS8E0L98*r{ZPAg4_M7OoVqNR6b>0fRC(#8X7XpdyhX0#G4RL~y8x zrHF__MOu;wKt(J`1h0Z<>f@w|VBuE=28o{~K!P7JF;G|qpyG6PU4&W)I@HC}MJV>a z5}S>%nGIS#V;gv`2#T{H&|p2WR1tDczHJp)1|EU|=mAjNM~8yB5&cghu8ecRf;%$Q z;%+79yv8XaVZ;=kFoGx=+BJZ}P`mjyLEECM*_z_@jt`_I_uyn~56I#iB8lSo>h}@e zK$n>jd!f?jdEtne{+f-ENBQ_7EGZgy-MZuJ z*AASjeyv96*Wej3kbbRcF#VdVpMI?%Nx$}G&Uy*`+L&b4E7hCfIBXZmFDJC+4)y*y zp#Fw>HJC3s+0%zwwj>fr@jEhv%ulOdb7p@^{o09^XlUo-j9i~|ehXoRZG0=_D|Q_U|Et&!m`jq<7J^G56{H8Wd-SutRZCWerD| z&rD%vF@I8pS;I-J(hyF_nYltd?(q|<%N!hegu3jjX~=W(>avGVVp%>1ee>h!M!Gih zjKCjZ6HegIr&O197(S`G>@5DIngBV4BmDW4%Cc&XMnYL8r=iiwE6dKV&H$@J44W{B zCh+G|s>+rf-A!Rlx|jL@UKN9?%FeFP04tQvvVE2+vKo0{6Syrs$>JJ$o5I_f)^^XKXH|oP?0Tn*$+70keVJv8Ofrx>={yzAvisu zAM>>()MJxTFIhcy8E@+|QID;_cayVZUJr2vNm3CDJcD9^uNSevDe5H!x~MZyKSl{A zz`rKCjrd_Pnv`6rTpm4L{g3O%zWGV@W3E$CkYyg)4F%Z?pGH9z&z?IdV33B1+=5c) z^fT0s!KX&?=kWx(NoiDL4mQgMQ;_{9Ao~O`5$k%IzW4L%JBJ5ovqUb{H;LAeeoR^c zW&uX%$5J(9gDc2n(ov0piV7Mk*aDt|{Q4ZX1w3aq4xkN_xjL*%A@OrQ%WN1Wn^RFj*$zc|gnY=8 zde)sLa(9AgbXbs2(GmPLtL^+!{JP0YY zPmI>%cT&dhtJ1QroOJpddY_UPSqLsDxw8%zkD__BizMijau9HFh{Ht@!NqVLE-aL_ z<&q>gSi?bsN()j-2|DCbn3ZjnIqJW<$$w0Kps8*8(s=gzFb*I$DG@A>kT}@A21u%IT=((~*uQ&!$g@K$Dc| zFr-h1z?AgqXc0D(c2jIRa#L{zY~f`ItRbjyBF!`*4!4{FXhw1D=|E-=%nWR*t{n3d zpqEc@dijLeC}zruEb~a+xf=f>NFniWpnrl3l#wL|80TxDbU1F)0fo{)-N}h4D3szj zEcrHLHaUgr!iAe1f&ZetQ+8~Yntp`>uHR!BSU5K~gbI^q^SyYK%;VjTdn}3iDVK!a zCkRbn64*=#LZ`dBXF*5h8)AAps5i9IR zAykgpeSEFhu4W#gC!nh_^AEqx85Oqx%`}s??W>&HRS|^)z2igz*CUZg0tVg(3|x+q zxSut0jn^aZxybL;O5#9aECnlEs*!}%>0v*&J%h2T45=S`a}c-uWJw)0~H_)D6C?f%GN5y75Oqd#AX)A#n-~n{)%lmp3~M>5(=LijW!4BC(F!hGxcdN z*c$N2cWnFv-&EOCw%_1JZQfolqm|IjyN)6uUYEz8`N&myhE>3RK;gR3!nPym|Ju-W zJhlhuEpmxaeXr3lZq^f(wTc(7Nq+Gvyck)JSN}*&h2H-r$jQr>;L>FetQtjapw;Vd zr&4GocbXNU7`tkpI$=Mzqx?@ zOXebv6mH(0D}Cp+xl-L0YNR)IV-`0Ly=&iusd71b>gLfXW!5Sex4770N85bh$Odr_ zs5ck4b%&w>g>}e&a|JRAO_@74K7QFWYlOvRQbrW0es`hU7dCo#%Z}DMN!O27o1&Gb z2aZ|rs?~H*@h{9!9M2Pvw4em1Ez?FSvo}JQwE|!$ZCn?nv(tQ3&Nir~4trp(W>hr( zhKKQT%J*wO5L+`>nYVnwb#As-{~j%=%#Nw1D2AY#x{$8%patIg2SdL*n8g<0>=<^kVh{B05=UNl*?R` zq@{NPc+l9>C`g(g)t~1?BgjN<>yVkt<_nn}dlwh^j%L(Na2{wk)}K!q0bk~rV?tQL zT5?;FR~kbTZbL@AFW{l;YX{t>jiL%YB*-3fD0*x4Is8hx_V=ZC)T#4fa%KJ{-m zM5E!qqDDxz#mXM0GHN#Ym5hgCkLS^2a(f6}^3SodSyc8U%H)P)Mz6$Q4BfHUrCQnrO^?yX8kz2*}l3(C@ws>7(?V@lGB2pq1v9WwP_WHT}DIZIAs4RdwUktVU z4nJd)9|U?)k{P;weKd-y8TB4l(*bW44SE6Qw?EI|g@zX#yr=;N<{#EqNZ85hL`JMzqBD zitQ!5hM1KA{;D{fLB$~#s-v>7?j{v22tpmL2lQ_U{r>MnsHYZk60M-F3!-#!C6ef^ zQ;M%CP>QEw6PRTyl6~O}1^G-1LDG$7d4|w)uM%cP>u;e}7NeEOwZ8lFG8SMvPkiEH zdN@;jA`fp$cr(5ke2ZGZ^9p*o0G*&3drFgPsHoxgJ*XP$vppI|vzGv%hHxtqsCw96 zsbwu~M-U1f6$q@{#OZtaF%w|2)Cw^p~&t=->I zt=%7p(QA8Psz3iWHMld&ZMwEl#h6u0GtE_51zuP1dJ26f{AEbbv7!RG!tX02a_BJ~ zvUh5a*q+8qM6>$P**HCPvFVuG*JO6Bl?C0bOTA-nsoS)$fKARrCrjC63w}!2WHWw> zSQh>khPM3ku_&8{Z%oTaxT|cBl7#snT7|t_^^bd14gSrnnr=o?z^Ncco%O>*Z~PH+ z+Fq%m2L?9T8f}+WOwM;4oZlUujMotJga*o~Tg$0Gs=xeysU~$wH62xh@0!s?)$|aS zzl&9k;~lFi;2o>V=N+rE@}6CVo}o+QRW_ZzEH%A>Ws9>g;n%2P-$S(q?*!Gi zSVgixI&Fqk6*#J_QWJM4s~YF1%7>F4%2(Ck51m(P2t9Gre!#^RPWEZ1mD%K4e#DDr zQh^c#+p1PsNY@?W+DX>|etkcn`W3GLzhphFCiAF*EJgimvX;7P5#6K1KONzeC)^}hZZaCw-Btx##u#zQb*4Q=`Z!2sWhP=-cXZ~WOx z@r(-SKYgbSU40`>`P$Is^y_=A5V>Nht%2L0f1LKO8@THnreD!MW%4iNhjszg ztntGG1m~)%>`*n^%Wg6Ir(`Lt3S!}Ovwe@p|4l6K!@cOa$N$p+e%#E?BLF?@Rhj^W zjfD>9u@EkiO;c{q!i9mz7wLpb$h)f4@nKl`hwyNf$yMl(*8^=FdZWf^+ei@e@Fyv!su&%=eZY9A6C;q4o6qp*)?seDs#4XHFoaeM@KS1cGL$^|?r zcu#LLl7DXoPy$_uNXqQ;3D6C|fmOKH!GAd~gVq=cL4%nv18$h+&)d-W4neO6KwSa| zjV*a>ev^UItr_`}A8&qFU6(dJ1HmV6XkhrfFa3QA&oyC8lU`lcm_=t5+eI{ zI6>5Zgz8G}8fn$u@z@)xdUs>bt+%RFeX;c7BNc^H#~UKKu^SJ(eqY52Ct?pU8j)tT zX(Z3L$}R`fg@o$ka9&g=U{>{K9)4?gH2B_lj!vj&6epOCw6E6TxQfGZ`M_|zyg> z*1K#T9P2TCjcc3y^j}TCJ&IakUHLm$ki#v!; z=3Lt7h6s)$*WBELmYN0~2R8L>k|$hiAjpSw7M5rOg`J_knD@nCfQM}_HPE*akL549 z0OzRbJ7%uCl->@%3DO>XXB5@;brHN58Y*+@{RXIE{9Fy=Hye9;@itynuGVGwtq43!8B;KYDP1SU5|CgKwedciIS zdGMg;APg0pc<^Hl6GY(}KI2s`)&sg=cKP#1)2vICJv42{-`}p7kv{uZ)BBM!-dJ6% zF)Qc;HP)ZN9I8ocV2B9B#UK!s{RjkTLpoiEoX@R{V}a5@=YE(x7*Svk6Q5Vy#LCfkU9@lDqM$j?bJ6C0thhRX9b$ z4#rH@UaPE% zL@QjhwLBK!{U1pwP!~$U=oZR- z?Sc`$B%8~JIPjsYSX%lf*j^HRWmd%YD(q-q+j1L9ntqOQh69{HQ{6c44S%Jk<$4)W z9e(oUawGN7j5&TCv-}J`2c`Mm@e2DZbnUWWMdZf6QATs1(^ya>=%_bs*&X%mq}_H# zVKsK!QMf_zA5hH8ra}0H*hJj4^lGPZ7*FP}G>dV|oT-sPuBcBMs)f|swd+5-)TqWEqQi;x{A8?l?^*@#J1h)ETEvja$+VQNvC zoAao7HXt&??yMMqex?9kjd~@p_gZ%7fojYztrro1x*d_LOf8Wsu(gZV`OZ$SgLN_~@-2FG#H(vYb*c9P|HG3%5bpeSi+kkE}*MXZI3IdPD)SRFzw zELH-Omc2gU^4x>s&v$wLG|=)qds55e`!vgQ`IOYOA~u*5=>TlnIVpiM1iwr9Xjdz-Ri=#~V{$ zr}a6XFa-)8zAUQ@7VbCjnGF&Cnz zp?E-O9C*7W8ct`6VdHg6u641k7E(`9wcobx1l#Qz^s*lf|2+y%42X}RRtgOlvh1|5xM zhrCBJtK0V;EN)+ivRJ|1T<8HW>LhU!q#iH>J+T|np&WEbV^9jMu>tyLZtMXlCc&Qv zoTo<{sby>Dxiky-&e|kndi>O{Dc9IxOm2q}c zWh;mc1&fMPQJ2N+jbaAjDn$RW9|{Ju9*MW1Q-Tr}Qe`Y98-Z(I6WgtHx~!}?l8H0f2i<{Y}<2hryas(zU~ zp-)J(#39C2VdcZHAeqzr<=i*ANN)Jp=pBq;wtRYmDaE9G!@Qb;Gi2iO{m+q)9UWt z1-~Y$=EN4)OPV!2pxv(o)vcb~P1U&@*+{le7nGs291poR!H*nVm!LAFN7Fg`9Vq5h z20}A&_D`c>&e?l7&as(<*_e5IF%eW9d5E#QrD?wufo|xu;j$iBY^|w=*8L* zT&J(!bMoNpN9i9(<9xjJyEE;5_QMeR2)|uAn<&XGa|9i&Vu8+i0y$;Ap*tr*x+dLQ z&ezgCGDnb3OlBjX5PphJY|O??7N`jQc1gzK~J>eTmj{1PeHra>b;Mj#I17kqHz_=Vje7?OZT@KhrVV{53M0Y`mx z{*MZpE`tiea14(|#C64CRS2 z>?za|7`C%x5Dcr}7*;wEh9${UI(_q8l{){)`}fJ>b7T9^u%Vg==z~;+lvFFL33Oz5ylnostQ7oMuzEoJxCO<7;YTH&omTv4Y5OejW1=H%?UEEqCxaimuSk7Ac6L$l9VFm> zZy4c6<22pRn@|M$^$|c3c)mkgmYT071PKaPZ#vkBdGlDejvOhwND7MRA*G)PMb@Gd z{ltltC_FK3B6YBvB~Zl83DMQ5(uCORU<^Bqm$WB9!Ps%$CtevU&avr zHxS-nDGdj@i)=}eo!45T?H8EMoBT{_0(p)QU&8hl5|Nx>MUbwG^yCln8cF(dKp zlVZ&4V%1W4wg3uGylUh|BzBbLErVc83csDov!$=!k;?~Pzmvh2SJK{(^K1ISMu~s` zSTp3D5in?Q1cHDs=S+GM;Q&waaDXQ%9DoqY*`G!8wLz@`IT0ZOBwD!~Z%a%5ECNOg zh46((Yz>KWJWzBs4-|a@HMq)(d{#>x2oQbH4E=yTK>mI3cX^l?OKIsmDr93I%X>#7 zb5WP-zta!LD|{z>F&-)G9eQ;;gJl=rxXdm_Lbg>p00$ua3K@Z|_2N3Z71NU625QG6K%-E%1!Mk*FkwhV2FA$Pl zT$Ia)DA$rCB;;@QkV0ipajrGoithEJ6Te2`i6L$oY9Tr?F3v&U0?qN|sdQo(7v~cC zU!7lh>g$8USByU3)j{RC8`Iv`>4ORl6RDF*{nex4(vLM6#b%lj3*oOG355_GXM8)& znE%`sOe=YVkQ68Gpl^bM#I6yMOn-GAWjeF^tF3N&X{Qr%AH+LQ5WX(QlkxIj9gtoe z{nOy|Vh5gqULZ&mC)EO)la_B%ACI~lT*mv<^dbu~-W+sbKpAg9dNE=^`Fx#y@b!$* z3%oh#dOni&zQQ;jvi0QCTN;m62_RbKx+Cn3SfGlWGbSFSavj_)qTXWYPrPn!PJKi8 zTXg6`V7l}dnIQY3Chz$%bLym}@QYZ={UVkktr)xk@MY4Fay6F7W;O5J7(g zrJ)1Y1QkNUM8{5PN#tYFY=NT4(EyPsPF*<3Q5=HAEctg-;gm?#xK0TwtXoiTIw`Tz zji)Mm4JjWB70n6%%^K@tY+*ofcexQ{0Ilm(1TD%{6#T8x`rI8*Mcn z?ePw(gn$P7CJ#HT!Yi0PPO2-HG<&;J)<`-kY3XnXS!^j$KKOjzh>!+`W2*zro%fcL zansP?9Vfp;&Qau|+8{duiZngYw-u3Ye9;&_t2I{#4@xd}f35(-yv_@F*?PQsr`rqBv1T=@CHx!tJxk(F`=?YzZ8I^+8 z(&VfX;WAyJd|rw#P$`AWbcKv4a-JY6#_JVZ zDJBR&i#`R=#vh3I_q0N{EnOsh*X0RaSePbT10L*CBx{qc1a(m4vE5Dg!$&_ooNi~? z=Fsgq`MG%pC=W}?36b2nRox%P!wTWbIg@2m;6&&_*uIZt)aA+)Ig#mn(HJo~zZPxY zRB!WFL{&ecF%KxOCt1sb@ZvARozYtWjhGczc(V{cq33^fEGiXkj8x(^ zDn~NTK)uCx(1dK9(N?_{+ZbAldTcFflGh~nA%LX-pPeh+71%Gm6WAx+ymy~;{bp%) zr!*UP7eB&>i=sDh(~94X__t=COn>N~BGqo)S0#clGwg@_7vB&zha}1Bo8br zQV}51?Z2fQR{&L&9mItIW2s1wl7m({fPPan2GJaCGyo8)^{&t@=#RooK==Amgc&#y zW?*u&5vqS?NREO$fZkE!I~1^VhoJJK$HNaznW>>dm23SXdBMz|5KLfk9dNcS25N&&7;j^4w+19VZX(!+5hgjBXqZVd!Q8L%VUD0zvM2yGc0&)~tQH2-| zsp+S@q5_b6lZQMYgd>ZGJ*cKz3PL}e2>*Dh){Sb=tJ~m%x_`&9s0Oc}0MU+TP>!hu z4@sw)YHAS`z9b4ua2dd*rk1LHkF5}oot$061)$Jlb1K>#?9sKb7A-39X!8m~n^z*r zp(;PR8r`#!QxwGq($J!9d}!pnXh#uHqX@AKG)WFj(vr7ewGxpG`O=c#QM?276|lqm zrw0HbHUgy%tmBefP$gn%S8RpoAMk_L4f^GIWTXWuiG?L_riB&}4;akTxS<`$?F`-Z z;!)5}0ufMwMf9cRct`gO&I#J-;44SA`$IS)v|Az<15b~?4 zU&Qv#!5tvThn^R=qD>qYO>N;Tp=Sz2JB!hdNi^XBCSZ1e3?ADY zUwNaU9?ow8%r?l3Tp;@v*$fEaxT6D5?jx`PrMbc6O;o$d0JQQj#3SGIK5atnE2;JtJzfvqf zQqju7lnDZTB-}#FG=IQIkW)-6CXqZ4oLYWkY=-%y(qz)4(u~g1zR#xvQ;?Y3&~}OQ z&I>T1vtkok?av!uUm+%y+koLzyt=qmpH8$_gxQRJ2hHhUDGdE7k2iLaKC1v9KCvP^ zZ$<%|Vk?_oBvnl>(x%wL{`A2+x6$A+w9woO_eUcmQ)XrY9#ZVNz$e;E8!#RH5ssYw zF2w6PAs~m40-XkkP92qrpZQGKi~D>!;$x>a4mifc>N8hKE2oHZ!7}@U1k2pTv#ao*jK0 z8a`j!VQJ-(8NhdWS(O==HR3W8tauh*Ebf5v9ES?9>pcEW^?#?3R5fMa#9l`lGnK6m z)m+4*`5wepz&C;|l8@oz07?WYsz_m=vS~%3`?em#tWGNl-Gd8-Er2J{5k*?Dz)HMx zxt<0mt`Ak&4_|~)BEn9Xz-qoUch%;WhP&FhoOFin@xxNMjP84@^8Up`C6UPb_}wonk_7_ zcd|CX5BBCsPTB!#tJz%^`yTstdsHsFd6HKqM`Ri>q(wKIjfeyMtP8#N=VQ^x<%G(d z6ZL1_dMp=J)?$c-eB_}oHyw$F$DnI=#C)ui%VvFKkbck-nu=+Y%WlL?)3cZ%{tbBE zg6PUGze|wPK6xU3Xy)*_lF$wK5EA5nWbhp}dh>W&p=`7fndv*6;mw4iIpXvk&RjUc z*K$1#PGzm$W<8rSsVTamGihkuT{g=2j!+sRFd9yEaJ(13i@ zFLvD|7kl6%6il-!ro)iXW+FRD-9LN$=C*uP_n3mRY0;5rD-gp7TbjQr>e%SL+#c{n zjSmf{`R{%|N;eDp?43y4@K8>7BpRf24t;X*XaKy+^fr6czMX~O*HsX0!3XC5 zkKY?@KCmc%?(#U)Oen-A@SgGB_r#F%aVxV0lVsyv6RCIT+5$Lr)!huYecmxluqm*XmcALQexA6dTSPprRm=d?iV?+4)z4;(!_gYnUdja>n zdzET6B}g^9$>J;j7})eUfBj=KMoUxW2uctC0>79TqxW3sUO$E&BtY9wNoe*;a8IHd zGknu8u(j?C<)Ud_TmniWstp5VQ-U6 zHw%%>x3_WT*Hm%$T;CNCKNQ>DIR6sJdfy^a?9?vEWVcu$@new;tbv$fP*Bn&72=X} zIkTXRp)MAo0Bn+AIc1-yRx3(1<-IGDU>jDDilSCpG7MnE<&yx~bb#fQd>>&3!aIrG61pea>z?Au zD~z4Y4)d@xk?O02I*3ZNXYo0?vI7!YL=C=eQB8M(Gk%b!hr}_G<>=#-I_PUYhoSzT z67!2yN0XsTU%|Uvi5>dy^GTwqwD8rwkH5Y?B)=hKmzlWN7jy1%rR>`fS-#4v2+;A6 zE*J6w~IoQ8$!E25;MOaH(0-3{K&>Js%c;G zVFlUnFrHB~p5bh&8A&)SIM6RzY4%{aMC+;v`h4^XvSt|S7rAe(w773yC(wN(q6nz+CIuUMiYe(c#T23w*%wr9ukS>FvjNHcMXz&>$$;88;S@h;X z?#P_VJeIx4mE|U#k2VZ>pHwJ&RKFZmjTII-ipj*_3HqW9#6c26`2L@T2=XG9nmnK9 z;NL7Pap)c7;o)>4Vx=O%WOt(wd>8PI@D7}G1Ac_)nuvTNiflUR zrQ@V? zwVJYdVBD(!5kw+szT@$s&WY+BTS%f-P1hGVkk*HCzd_D+$Y!aDj^Te!p1VGgI$BWskqz3vNfgK z60Iy}*~Y5fs%bBqeZ)9>??u;4WL0~$st@^4mOhH+sfW?ZlJFc5Hp;3KKp7$AZ}_KG zo6Ksk5S7U5<(!DQ22~IOwC|-Kp$1V)S_&>6gF+}+AA|&C?%NNB9CW&f>-?o=s>_qy zgqDGW)#sC2!CBQ2W7Xb^Dks(>`Be$4EQxi3R5`Q~3g`&`MCBx?*T5{*xE$|DOK#(P zG!~zbzLpF~I#ei*nu5AAxZHD%MNPO5n{}+y=-F@3Ga(}!TX+O08YvQYd&S*(SO#R* zIOZxo8Y2OURx04!_u9M^mXWiA1*!SvASB5)f?+@+^}ZTH8oM3jWJ&>))Eux$>=glb zBvm0cV-l3Aq;jnvR!9PxDwoYDk(z&rx844S3fVrn>^i{r4{@*l;d?gs6ZF4C{`#b( zdgeSXr{2k?7pkn)#at8Bz8yGeSnbA+w?++yGdNyB2}kFyKbf>btL<4_+p!q30HP%A`>BVOCU@4?* zr^o*wSO#Goh*Zk(!l11oqrTAXhh+|em4{tkjY|(MT?lWERV{Fl8U_pGDqiiuZ=qsp zCGajJ4`M7_5sVmIe-Zixx**fJLg)ybq2CBi8m;RJ*_P-z(%-X)t!gHx0 zTETyx5|j)UOVgInQ}2nnG}m9nvWr_~Q?~D5MqLhuejbJ%8Qb89dUG4@H$LIbgv<~* z7Y{DQgV@vx1iR3CBw9RPzGyt{>Am^LQn9l?jTh-Z-=YH0+eM(aU_B;to&XoY+a zXSp{*ySP@;JDP7kTIIy(If0#7hHw~AKree|;FS`j@#HUe*`uL*@hX^t^L6~Vwgjvj z+aMl?ZsZT^Lo^9a;3+aD;csy}IJ!z(dnIKE;N%vobdUIOCUkR=SwwT_G3BVQZ|<^aV_j3s+_0DOJCO7mugntcZ10wq87ziUSv*O^gTi&}lPoxPGMg zPP9F=-%8WuecyP0ksWHK$`Z1EA@H@!zA5r0?B%k55iGcQ2m#LTU`j_G<;%Ggd;%pj zMI;k+OVwCXZs)nZgDgLjnPS8mtPN>8YdjTWpnB|%iIAwMid%o<0BSl#o;23pOrLS$ zi}=!d3;78Yp<0E?U z0B1Ryr-KmDH)cmjz7HEQK$VRat+F;KQAGbeYw{|JJsD=lddU;4(9nNU`NG2JF<>NJ z3v#-{q!#Il4PuQLggG&Y>!8#fXb@lNKZu8}I*9=s5Il49G<^V1!X}OZIPpbtC#m5| zz}6bYA)-8_CCK}Ukpd5~Vozg|h#V70t6VbSC4{988RYqTUbids+u;OJ^|NV)zCMCl zPN6(s#y5$IgDdBht=?8re=E@-Qx=h+uY%J2Fai<;OTXCuQP70~!qJro{ikN%4D)_3 zLyra^RLf91_Oc*U58=Jy@j3*A5mT>UzKP3=zIf`?OVKb3f@_zdN&x*>O`{}62JGmZ zq^(<5U-SJNTP~E?oGDG+$!mxw1#3u5DLBy>Q(BEIY{^WiOa>Et0mO}%9FKoqp~92v z-Gp-DVd(pDeiRrFjVge`;x;{4AUlxeqv_YEfRa4ifhm0&cM4k!Ln?UE#lYFcLiIw^ z>RUX~Q2!k$CRJ{=&S|eoXFkWZvdX-&${6$6TA)>d`E1P>_FV?fCKqWujE;`^*Ak4^ z=u>{jUx9xnV-~ACVyxVIQPsry9K2N!ttyGEjkW>4YGlXz^BagSr2f$~(_q1mDULY> zbzY=~C<%X&bC4obiE1pT8n8;ZSOxYGE z;2q&-RX;-TXEk?mZcP%fQ-M2O_|OfkzSnB{t?+=N6*BqCNF%XJVINSEzBT9xMbNe2 zm%ARl%rEeS7S6tjJe;C^eGnyK3x1gR3+{Kum36{&dSE!@Z?*+FfwU5Bo>{xwqAkjE z`zIs0?P|5}0Qn|#sD2l2+Z7E=R$m`coDR|O2inwp_&F@Rf^~}&+Hi}KR%{IYj2hJ{ z3y7})F2EE9%_EV6{z4X!^(RmryzEx|+r~vL{)aqizQygmkda~Ul~&04yyH-_Vs1;( zb}{K~WBMFqZvbpHmE-CpSfdwux7?C=bD-v+sAj%6vWYj@>wXN%TK0Jbt0)PZ$ zWDi-Jb-5AWTBNXhfaQmnQDHj)nj7gw7FKW>!X+s`d+8TLEplv>e80yQjFX0?rO)vT z$X)-13)orVrY8A*h-=xgMOykOF7W&CQv5=U$fK#c8>-onmuLfJz{A1MQ zI@@Zl?mYrlhP{tiRzEcgMHLQf?n}xC=z&8AKzVKG2Tvniu<1<|HUlqoogxsGl1CMV ze}y)9V=HihglfDg%G7HQfPd^jw$yXu_Av$(D0DAQTQ^z zlEWgoC;Ia_{86_!}M4nXwDes{D&GcVP}3PLxO;-n8G$mGC^_-avr zn#NcehgYgKFudYj-aep}-pz>N-0|TxG8N;gzrmxg86Xq@%Ll5&XxbXi&jriRmp}xkdXFZETLWU|>V$ z5XkN>6Z{)chnToR#UV^Mb+FanXw$XBq_V?H#G2Dugf|}~X$D&?nS1A9<6oqodH@eE zp;q4kh~A5;sn5XSr12ZHG_>)eI&r7CJSl$TNr=RP-*~wYuZ6EO@8{M%A(^ zY=mL}*Sdo{Esci_5KOfh1xS|Q3uJ3DPKW?=<&Z6PmC7Tk3|(%W&+FY~^EZwFhFt3C7oOZ$Z>M(S!Ee7X_`d;ih%{x}7yT=81r;!P9H=KeX=Yfl27$p_ zcg(QVog=LrCg*lgFEn?7>YrkCYi?__13D3$$ACT{a0eR~av<(ha&c}&#CY$2%B&?m z9`X(*GZlFocP^TZQTY~)GkCuW=k*}htR&XI1|th1tC^-^{o#A+P%U-Y3KF12oz|#| zfdO0)OT^T1{Bt=q@N)|rnObn~bMeo?Z7ztcXTC$(^Gm(wz?$$iH*;FmXh%b7)cX~; z=Cro@4q3d{;K_7)(y$0=lwDBH9-|87yu#NufmffP<9D=ETG;}RcB24*i(90Xh=ccr zfan%CdPxwo%;-iJMIU_kTC(Sl_Kv^@hSS>O15vLDAShsQoe*u?WecT(!z)yWjl^s~ zTYC`NS|}WXyC6}>)@9blFGZsgAjLue+A6Ku`Gxu7`RK&+Yt%_C2(07(Vd3OeWSYXPD#hKD>+aE?x5#AI& zSJ1ly>a4=@rf8h{sQ@qP8jXwI0(ce6g0%1vQ@IN#{g_(tRT``zK3GG1u<(U2;;S^! z#Fxc{A&x3%8`M~u4BL`iihoZ0Q}GX5np}&2bMS8-{@sm#i_pgg-kU~J-r#Pz_@T`S zcTbC-XXwYDS+kQGZhT4HeT{#n@i*dbmiTDV0R6dlEAJ1M=QHnnFEw3x9LJ7#Y&?3pjd}AOeTf1n`6NNv<*bdW~*oDIST$ zklHoK0&HLwFQFpEj&|2&YE#XT3}Y_JfrLmZ%KZ(yZ#8#M@Ksu(UYIb}hHipqS6?OX zTK(T6R~d7W9J0I4j9(L87q43JYFyq-d;k38_i+kIG!yz$j+$`|hmJV`s&lEFh zuRhqE3t7M%U;r&8sIL^fehQ@*IXcbNGH`xCs=Ys90dL&B9P>f$LLvT(h`cbip!%zc zOWI3C@SGS+V?4LvD5z!TPq^8qE8KAhsT?yIS;lBaiMRgB4cw@<@d4s*|D`}F{udCf z`^LH0hf48%`7UWipUmDwj75gx_${$j3ySrl5<<^?gEYBoLod*;*1UxpBx}tV9z;{x z@2RrN{GzzCei)92fQP}4k>RxQk00V$4O|E6zJeOPxCz~YMqYMagsXoQ%~2_DZXJ5o z-W+>_Gzk0+`6XW4jrJ7n7a`PEv_I~q9|r$iN`Q6ne%us)$L8@bE_boZp`1kqJDGh5 z{R+3&zmLiYYXZOjHm*GE77O$wzIXJ)sAR4>OxAb7F~C(j*g_FfyPdvqK5h%OZ5)rxr5Hh@n+p^9yS}}g)6zjwnJ$@Uk0zk z@8K3`_JuO^bE*91%IW@bQ)wP>9@Q|5%cKkguar2CYIV|iRNE^}_1naGRC}p2tg0Mt zAq&5vl>Ooerr3Kv?xf~9_Yq(q;~L@*wV!k8GpymUrk0jK|%+F9Sig;enD{c`Tn4HeY>fA%6)+?rU_(S5UN;(L@JG}X8Sll-u6 z(NCmvpO8-<)Ss@_K;!dvTF(3YQTOw^&F7!wbMGyMzd~V$eVtxR-%UBH|KQ;FJM{Zb z-bc;*gNp%QO?uHBY5odn-bcj@i^@Kf*Ks^!4B8?4@Lab8nZMNi{|Oc3b>P=DKv^kC zBX7;to%j-E8t2r!xahX{)o<8@{2HUu9HF4C=|`z1el?L$p8hdWc0rZA`ikiT14>-_ zeM*>k#a~mYe2yBvHT~y&p7_50iWMiYFi>GKRY>ly97Gg9Qe-`NKkdT`Rxae1^WZM1 z*s*+Pzh$L*{J#EpmT!(N;+rGZ!w30o%I>3k*2+CxlV;x$ z4sOFPzvWrndy<%Wr^A4wm3KSIPi6USxITILg<`YchKmz__mX&zPf+r4N;^R;szZ+G zpuGf5u&xkI%a-C#6&I6a_>Ng|&BNBpAJBDF?q$W+no*hJbtroPWm`DjW!Vr=*a~gK zl+Ln8ylzM9z}B}~?ciq8lOo-3IKD%=W!ZCsT+3()2aKe{O^2l(+j?|8P7#Nw(4C>0 z)B_JmBzSK7Q?=4Py7`)v32t?g_Z*`p40V7LtvH5RakSpY8q9C%MRct81kyc}4X4uV z?zc^7QdF$U(N~RTc|d%l6>sx39eS8YfP%39M(eBWUA@~!dXd{osOH6xRsW(kEu?3p zN!;n>et15_-C)w4ytvJbhcj~+Prd5r@ogM|=yiwu32V)Hk?d9&Q7ML7NNuQGe%11r z&k-*-##URnyGLyam!!3BOtyyO>j5CrJ^EE2+|u|{$+4Q{sDqMtC`)Wxc_-OLJ@Shm zM1I9Ljc#gsXXf8PEK`@SUXZfCDgE?ftzH}*?JZM%!w0^}&q4`k>mPCkI=yE0}Ubkx233poUA>t9`}c@*^? z8&3toV+;=3xN$c?iL=<0*vzox>&uA2bxC=yCAK686^1k&{OiGeYBQ7xNpSwpYb<3Z zn)yY+W?9Ci4G#5=tSTi+c4sBKH*6;!CCI87-JSKK8$eT=TUwWm0$S&0ik}vIj%3?G zyq1k>OT9JYWx5FZ(E$$wX$I$Njwnf@Cp`0{)GM*pu*NP)*jf^TQPAnzJfswo(0!GS zTWd8%$ns6;r^b~tZB-+iyV~)+{>5Y5DM53Cft_Z!UcuD9a$UB%wMlGonBXSs(bn#_7~$oT{?(>lij-^%^FPjpF&v9l zjRTNLm9i9cf;;VGUBI`2^5UKp*&#~QLvM2--q#hB!`fHBk>C;{TU01v%4T6JlMic} zA51$iH4)sDklYkWn2|&RZ}N$VI=JJR_n7c{_G`Gia*0q4^PXib?iS|VXRY~Qm^BhI z-!PnrHRFIxI0z|idQ%S5L3=VVU=auDMT|nv`wwM?=X*0OVOCn&FLOY%przMEukV5) zONLDS5!i&f23H&>I&a`OvrMphuR4nRZ`sGyX8Pw&H{JB6dy_leuP*Ny+Q3MYE;G)= zGwHI!&(JyNnLF!5w3zi)GfuUhF*4DJK768Pp1~1hfas@q^aI^*0ZEV}%KCwqm~5eE zHhNvJC*4dMUQj*f;wQFjUkU;@(+!o+&-|$<40EVW(w={;*HOsq_wYmnuby?5E^sTw zDXT9{2L|qB>OJs!(9oHP7y#Bodw3h2`)K6~5CfqSp1VmMjjE#&e5?|A@x4r50cf<2 z*Wi_JgVikbNGLm(uhJ$0yLDLr!V70NWqhnh#qFcT6%~5oYCY*tnx92W`g3Tb*8BQh zX=PhqZH*$XejuW$l_n5~F;RdkboWgUB!71W@8Vgc$bGy}FQPa2mYu0)9_6%eIKv)) z=0Z_0E_HhVVAiVwtw^!!vL2Vfb*z)OYiBa@LGaPajf z78OR=m`}F2pKR7ZIgyMw!^jA=g9cud&Ek&lT@jo2%z9?2tb#WSE`5 z3CPfZd%P5azPEZr{b<`oRG)Q%uUsv^eD)|uc%@}E^qu;{V3$-;%gZ499gqX`s1bI- zO~NgF85jk-hrtn9i*H^DTvu=BgA9hWdBoAZ(d4Bs-pf8=l7C>w`zKq;uTdm2cLOJa z+v?GlNA6-@0ovLHNH|sOz7NS-5nI-Zlg+Zhv7-CyeJ_N38#5P2RNGV6N`JaIqKVju zJs}lA6lS+zYdY49J||hK7aRolWF4{&Rp--EIx;s!SF@YLeJ_Y`m|*g|P?AQAh@bv z0ZK~cC=Bda^{CG2feK{!QLwR}Untu8;;)zq@Ksw-lJX<9NixoYM`YQ3g%$rL_O*Hm ztw<}WS>G~3Hbyl@KP8S0wwl}cK7Zzlmh7@CJ=Iw=nnC(UL3Znay4sRm{75Z)s?bvsip4y^DPqpXH}sMT6c6h7120(YFg`y5 zpbekj?DF}orv>7da;AWQcZew<8DYas0Zty&6f{6khFAoETJ=vBKl%B$@dj-pHv*B8 z+69$vx7L2Y;gMU%7htA6sfmVFpFe>n;Lj{PJ_HvvwOFBjxgr~_#9vcH7A|~N$OjWL zo`vtPg}NjO;G}$iuJHZ264PH&-3o#V=l|n8&ae5|0Edrchw=YiOur`{v;d$?-!@6Z zLjaV#0>9Jjp9KaY0Z4lgc8&*ht7!XL3K&kW1p!Ly?=1o(YfUu0_ay|7>BEG;5myL^ zyTcO#0D1Kr%#vZ0u>Xs8-2HY|>vWG8{{L;>=JGJk&}VGzm} z1|%LVXZ}m00Z()LeeG zQ-;(&fc0ZdQn=oJ2Gmfc4(C)Uc3sM;QYgQ3MERW~o4&Xtb+~X@(3bG0C{x?CKk4k8 zeVj4|lju{2wLT^EqH#~cRJ>tY9^^W(5{l_mBw62f${|9ZDY4K-Xz0;?l-jNgT7SqO7|Nix|Y16x- z+i4W24ytwwiVmf^2at!(HC#j5Xx=!929t%{cHGtRKE+K-@5%B4kC`f>5t+li@%Gc z-XNr@Nw6m%hMN#?$^O(kMVx4BwY0k=CGnp;f+Bst)_Qb9e1i|C$WGeR)b$mYy6(}` zHH$T&@xxG8%A+pVP#K`Ed_x85`aeQl|3_1oC{(ztMP7NtW%Ta>0*Yh}edXCJC!#Mc zuMB;WZ6Wdsl}XDeLujXAtnhIw@GvxmseT-DWt*5Q?ZeF#V5td?G0Lg}Lov`^p5Y>7 z=NT_ZEkUeX#Ape2g?yxu!;a;FraKQIHLO<)yZ6u$zti2}u2VlMkclFmX?FIHRHDfg!aNngofcWl+Xl4 z{v1NXaCnk_$pUhb4<6l#^@0EsB=d%TN-pjwb^KCKl)eG?+7X9sE#+w73*m+vf zZ%y?U;jMv0$tfyE9Cta%aRGeJ`zE|3tP0Yqc^3q>LS0CnG@?@)QU`h;((OQ2Vq;2< z?;kxtJ2XN4kCsdQXwk$coC&|g4~~4?ge6nly$@N8JU&vi=#%0$Rr|K{nEKAD!!0!4^bw1m^o9Bh^ovK!(}DTCku*}mxFY&^~fT*n0T8+oi>HL zO|V9Lnm1_fDyG_Hnq@jHUtt-m@#EAE_;G4&Oytb9 zntx(&FS}AF@-kq|JnZbFDCC@3A;O{;T~b+)SbY8|%9hRaQcuK}MAGFbxu(}9o9Ga2T;J_&q8D9Ege zc67NmW;UTlCq=~CIwxKJ~9f`Z+wYz))p4u+5_4t_M z9yE}dc%~;YmerQ8f|?a<9h*ZK3*pPHkv(N4`q+gW3Wp&-&;t=A}WHtCqi6}waKYPOcK@h zQk_vpJDBg=?o}a6e|^_ zTj~IBn^7yHNNnjTlu&Cm|KA)XTsMdkw6lE}C0w7I(ok+n$JgfK?WaAxC*jv4;lGFd za9=p~@uR4x%a05<%JFO+PBlFHQH%qRE#)!ol2agonjE~yDnnMCHh|s-{{Mdkpp!6c z59i=5F4I2iI86JD6XO05rai0DpDEE>Nfn3S>3-723u>G9T8T9|#Qnr6Ag-O82zD@H zBETM5uX(!i^MCR6e~f|wo)T(x88xRtigV(}nlZvrgWFSkOF&~y?xJA)y0H7#nwN_` zq}c*UEILQYi|X#m1!x><^KgdktoE-Hj%_{Lwc^0|i&Ld5R*lMx_u7#U!R$bcwJ{!t zzOC7BAKZZQEY5MG9Dec?(7QH=-e@CtyXXyHUNgHO7ym?SBA;c@{Jkz26SdNhQ_-IP zOLOB>QAn=NLCI`#aBBLRH(eS;|9$we;lo&MXwT$i4XDpNI==qASz@lDI(HRn+=m;x z+ViZ+fM&#HG0lhrpy?n*S~mPSnGF-oO~AAPF3bvGFJJGJ`0=3mcpnV;KTbb1>Vub_ zGuY%CcM94=eGXjVLE!p5;PpQ6_dgC^`TDeGzDA1%do>!LsTr`=q&*xSQI#Hw!z1zK zfYzi@AV(cnlV0_~%(<}Vioxue1-Lp_PBdspV2}nKIt3Dl$K$Ce<$SE7*B%paTxb79eOCz=QHk7&A4j~<1XDWsvy*S&`NwKr(wum zx5UvWNiM|)hI&9GXJx8JS~4lvp35lDW_`>E_?q3S-E(BF?AG2nk6RNzJDGQGB>mzK z!F)z=b)1%WZVae;T+lckXjn=Iii%h6#P~S?pj|obOMpY-g-$OR@Xtx;6Ens5FG&#F zdVJ^HU{?^KPR|w8F|zBD-Fol>i&tv|;NZG<-E!Iul+TqVKLpGq$Sv*-v}V|}oqDGP zJPi`kdb7~(eiP*xjoDR})#d?p+1Sn{J49_pzZi)vmkw8#$JRDy?;E5cmjWsi^N+-z zE7N{!IqFaXLUNpgL`8BzA_-Tr+AGa7eCS^jrj1v8b=@m&Dj9Qjip`Eq7hf1rH1yrmgBVgn(x zo=W~!UY?!ao#&Ku<<2w-yPAytAn9^{CV14%6dylb?j3(-3edi4P`ca@d@9JE61;!U ze7QWZ=}ZbXNhLi|U!Dro^V99NoHEG0^hC*#?mkiOT>J5I=QtKCmnXMk+S??87N!xQCxqf-vVIqSfs8(6PkwcO5~PJ}fHJ>nrNq&YLNj5nLSj1ZZF*u*cTOZ-(^K6iO9#-F&d>$`9 z?qDq`J!}}IB&&y2W(cm3`lXvdaOycd-4dYNVv`Vkn)y6l;+dovP(xl~kCz~=vkNvI zKP&n$TulR7oR@b>BG09*A(_8+lUv}eSJ3$dPf$2A_c`(lM#_(_w3AL{q5bbBLHaoo zdV1Uh>C3%-X1;N}?6~JcEo>D(;|(v*Ajp0)L$l)~Q<~uT@zUcYd43jXVKSvjHxL0K z3u(xb{*GA&f`N}zbkpUu05n)D{d=6!8sk_nYf=?#vZy(@e)QlpIr(17W=f@W?#m6J z`L5AAIc_2erfLV_aF!2}JVy>3)S&Zkw%Oa?fqj-7)VXjWwG$PhSf!&#J4pgcPAd{R z5}A!k!P(1YCQI&G$&wR^MpEe;%eey1Mz(3eM)q8(L-w4OZ=eBbbkUNRr;?m{OODu{ z_lWHoDyQ~=Bs$U=GMeW8i6TO6_wy?{1!+FV0BI}iQ^LC*%?+ga4C}6ieT;1vB!`X+h2Tz|QD?I0d@m16rSni)NN>cHIzr@jkTs^V zS}o-J4NDRvIWw1zs)4)u2$P|aZh-vkshm$fKz_|KUrd;+Pxua3?}z?A;dM6i^%K!w zD3AV};Jd>JkOd7V%1<@ua?=SZ&?7z#3NKI9(36Mx9`UI*!hDAOAP+C&$D=+kpUzRg zgQg@^^>>h;POW>VnA7Qne!Sc|p+^x&LV{{N>2&JFLD_T>KQ=~(n@vY9ogF_=CW*09 zo~$}j>Li14doQax1+jlc2C;0LRavNODq_`$>U8T#Ngev*WWzDK=~m!% z7j`TOMN_EGTKNbpf$eTruHsj7;Ub+!qz$oErmM+m>}kRly)x(I6P<;q%+Dw?=8QTV zZ!IFTh%>mw>_UH7Z_UWhEW)}e=fyyR(auW4gh?=x7|G8xHB_y}QZ*8A4E zPPe_wuF?CN%Yp%uKjY>9v-Zmik8F1Hi}p%>k!*r)dZCy8{wKMcM=;V)%Y$*Y%!90$ z9~nHxhatl#1Y&-AAhSpk8$$^z^K1@Rr|QWd zXYKvZ$4T(@ziK|5^XZkic}V@p1dNByZMMaVnk#p;%ZOaaQ~bCVI37g zI`}J(8y2xwjjha_Gc>cPbS0QiFy!xYn18K@`6KfjFJirS84+uEj-Wa5*wf@UzYl)@ zK@y1c&QbY!pNMA9dwTK|B9U$<;LBdPbni04r5Z+BYUTTvPZM4z;m_y;$M-S+LEx2_ zBs+*nd%IT*WLo7Tyvw1_%13lb{~Q(t8H(sbl8HX$&zzxiiTt6&4gOk*f*ALU=n&VO z7-7Bq2*9RKn7cOqz<2L5>* zZ?G*W-4)D{{R#i(iKdsgLv{YxjKa|72VvT>Igc^Z9o)grJKp)CZPi!B! z@|=oJpPg18G-63sBDoU%!~)Dy{c~chmNnM0nWm>>nO*IO4qTq^+&Z}x_1gh%Isk~v zbKLauQ@57};4vs0hmeXB{AK<^!vDlv96O$J7Z8fZX(YKUk#m*Ky`IwfYgg&?($P`dq4$(?UdcpN9TNv7~V=pB~Z)f;T4w)pA1_%FNb0ynd z%+Y(&{S^r`l3^oZ*!SwyZ|r~P>wp;p%g>;=%iubj}lVuYi(EE{c$n0~c zny`|W=)#tbr<^;H+k^DyZt_Hot(|g^B>JK^Ad0dK)7R?AR)R>r3!og&8ePDGSs zz;dQ*{L@^RY?TpV`w3t>c@S*9{S!_dzQ1RR%6}$!!O}eN5^~=V(2F;FY~Oxh3=55^ zb`QS8ck(Mz2Uv#xjHQw5gHiR12=<_yODzFC!q--F0ikx;eOwgPpMvk;BeqKDXp0J8>@Y!jP|3iu}>gB6ZbcpDB5% zE;06*6Bjz73mu^l$05*xw%CN}Nk7}&{=7cPIa#txU5bWHt7Xz^8D&#%_;p{O)Sb`o z>#&a4)ieF_*-ZaHN5&8D?W|`gRhQuB#Kn%7Vn?Ky*W-(h-{S_|c7v2Yy*>wYp93fE z%rlgdKA)u65mW4l6g!nZ>$V%DwAbhFo)Vl(b)QR5(q~FZpHEWkh$(hNig|thSR^^E z5X=ZC{dknO7z7y^J0kJ+vPkf^R?EbrvJH+we!+QR_96#Wi!_sMb0r_tj=$%(R)1Y62^qyUxlt>$l@OTh zd5$=W^CFbIBg=l&zWU^sD*Tkow&(m2Y{)ULo^ujIC583L2$uHL_c-C|J&s@CR4O}h zJ$HZIbA*&IWxvM` ze=Y|WHh!IxsN(MhtkqX?h7KpB{HiFdUXQ9@I%;Fsn)=JAHTCsqGA>=yU0$xc{3*J; zN47CPXmi) zV)0{Y8H98GdwtvNkJP@Ww*h`CbAgwCrB=xBq|Utey{;yKl#@IKwKb|<;!HXqyT$$~ zjEr-sWzDlNH=gZ?G_^_R<>8|`jKV|qY<`njfCc`XQjw-sDZw{8nKH?A&^Yn39&dpp z=#Fou7|>A{b6m3&5Klhm{c?s#T`^bepv;!`BA^1i&_>d~!A1ou9+B_j@A;N-LY+Bw zPU#FHJN~xbCsH=n5JgAIWp1a4pBhLDTUIYfDsTICp3mVO?*4Y3gDRK5XJ?;xH!%Ly z^4Eo_>k9c)MwYACFO~Ftv$8S*c+vq z!2s1eFO3M$+wuS!%>$@8zYG0rC_HiaJ?|z2oD80?vICK7H{%Sc*T}gNm!M?v$J<9^ zJ&2X$dPkoh8LA`OQs`mByn*0)&W-{q-EZWbxTXTKbGUC4 z%Gi8iNJje>92LTWNSTj09C!LGcLlaq9&8R(P-V$FzwPU=`(CJNTRO^4F87nrbU1j# zsmZdNBV{@NGWfc|SEuC{R`W{vUUfI^7UiMk#n^}KgRO?H4{nY7n!c z-}*sYcrF`|`NxOnb_$5ZfZ?2D4?NN2*hiig^@@d-0*1%Alq`5rr|ckN!i7i6j@Sa# z)wD}PVoU5Cm@xxqd4yfE!5&j25ZKtVC3f!M=l-uB?*)5Srr7SNWkc*kNWfbo$-Mp>TJ;)j^SEbR-*$x8m@r}^F2W(+ z9_ZVadS~2(Hr93v|F*{zM3`h=|BBZUc03dicwAi)noV~muveTJ0AD=CI7nT3-CA9K zSdI@h(%X~fq2#pDVRD*4(x#sGvf1VAtH-+S=lmQ(vV|k7-n@t-reL{MG#{#Y(@H)q z0Kyo?tzfKPoh&5)6U^y-ZnLy8uu6gh`8K5=9;;VLtV)y=WZ1NTPEwQ;XcqH8dzsRI zyYGk`XEW_=gI)W1FXwnolCN(xUw@av-nZtX`Ftb=YAL|SXXuY}mH%a~@>)~*o-%r# zcZ$GYf!2~pEXoWcnnSNAbE!>l4(W!n*{RQ$?Gzh*<-#Ci07%wlBc?Z+&)au&oDq&?~VnB~Dp`!VMoAHoq3dOv0< zilx7TpMk?eDi{IA`l%frGIR_0LDuB@5smdh2Zoqk;0GD&C*6lRcT!2tSl1gdBRRyH zL=t<-?)x;>PXg#a2GExYdFKFa{2`|VU*PK6v9ka2NzZ2auLNGO74XU$<{W_I>jS{p z_NB#G=lzL|_1=)W0DE1GbS-x4*(R6__2xG~bRorl@J`Yg3LdfL@i#SA4p_YHNLVan zPCJ;e-ZRe65j*T0&kSpijT=$|+x!V_c0X~#GP`w|-8loSJ$B*rq@OhyFJgH;=vwCM zN3zW6=XZwnb7(K@>YKE2d{fTiZjW6stf#Y{Fb4M%CoZ+yl-fODmbb?$kK5a!R{5#+ zR~yDR<*eXR7x(93|FGWPfee?2}WE5vDjud?(& zM30zxPV#ow9{($`3WwX{7~&;G+AL4lXd&0UdSzaeKzY3ku9;UFOKD2#_B$csMlb$5xgA?nKLjqxlRum zTkkP^JuX^+51!A%YWW6jM}n^mjQ0%V|CoyZZ)__q=HsJYtWf}(jPs8owbaqS0 z9@Z?i99+ID-`gO4b0;Gs&W637vtj)R&IZm{HQRF@C;gD{mKS3@?x|UONt0p!b@4Vd z9o0LCn?xDyZNLC#TE*dD5;i?NGwYJDkyw|MyfKh7iwzcHSZkYjz}HYu4HEFF$RXe) zjey_RSeL`X%%2Yc^kz9OM{u%lrw3XA>_GwS2>yosoSs$kuHNAE)xrK7fvD_PC3R_# z9yH@*{Tycp4RSUZ7Y>K~9S5q_d)<_x0l4PJZZ{9O8{Tn~kJdLG%Y*5gdEN$Btr4nK zJAg9)2C9G*PYzHW4pPQ8;Ase{+rg|C>9d+;xsNPVGFG+IvNd-8lZ9ehcRej0 z2HDN%WftR<92O5lD;up3Dk4sXlN1qS_asGHhZjk`iP_wS>G=*K&aBTg1S~eCRO$H+ zp4R?`-7Vc#^JX5`B}+eMYhOZm?sm_X3j20MlcitsKEY3?q4Bqr7aS9X(B}9)*XO5x z;k0ze{+w0$uFs`AW~om647Bu>&BG+>xfSe@HAO^PRpj)2d5`X z7e$g|6RK0!gLmN!UTRC*buToo^7y|uMvv?u0OMm|BC)>>wdH&a=j4109|xIw`w-~z zp$HbWX}EJCl7CmZRK$bJN;_!>mqh~3dDU@5u10N;Ak8``hHCh0l90;hNVN*oIb z?O15fITl2SH;E7zuK}Kg44wr~&fzE^E*+qNxEAW!Jz3ldrlkq(k@$K)C7haHTdRvi zD={*fp@__uP=kmvPcaGmeyqhY{uNJW;XpE1uDf#H6V)Q-SKrVtM;IQozBpCJH#b^2 zr@EE1oG*H7e<>XMo=bnmuQ(ON__ihzTIP2~a$J(O<^3lfE*gWJ-64F)lUE$LtvY2D z>=(7GD}IQRuD>QwQ>lv(=PQw(AYnvF|8;RN+|7X$K11w`J`xu@S9uiE-{GL%T0osd96Z((DPEVBbj5#Os4Sg=}3 zMdVi*(5wSIxL4q>Ttw8ZlOpP_$q}`%Hlp6J@322(-)`S_N4uP{%RyIL(+7&QccyF6 zfPY23m@fI{5q(th8@#P<&HT`Fz2LTaoRXC2{e}2!GGCF3&X$UvG!@yr&io{={3KKU zDP6u-4(xvZc}S#e=IomX&UKH!eTzCARlC9rwE1PW-wwy`n^a&mZ!wpXxonq9WmoBw z(bve$lz`Rp&s?b5z@?X8i$LoiZ>{{M`J#;TqHUJeCH3u;g2uA=eSre2WvSdJZ!D7& z`ta3%wkk~iY1mfvfu=*(Qb*%Cc1I{s%hglzPne#DL(q6RhrvWupeglytEeBbO7;h6 zi>ON~L#mO_Z;#6HAhohvy$~&tw8?V)IM;Fx#1Hw6AEI~1K1iK&Q>@{fIO=WAr~jjO zmjlh!5B{obEPmIn>@GXLw5*`l8%p8w^qMUy)pg745%Oxst6}%aqi@* zSmh*potWILTo1_YWq_h0{eW94r21^!-azCN0HaqzMiCW~DTs~ksI3(pPTDQBnxB_C ztTn{2$r}%(b_IN$>srdD2KsiXRIm;IDVw(V?`j=i!}jWrOIfv{(z+@TJExvS{1wu| zjncyR2s+s+G%4Qx9zDX>$trv@RRS%ojic;D{Up4xhpfesn$E=`jpw1n((>*exGS-~ zL}(l?%k9^j!AQURcF0im+Iwa>YBz1Unnps2MkcSX_v5q`P8L71tfU~q>w!*u)V#QM z*o!lHk(&$!Fpf7FG*ND^I5uo}&x_sFx1pei6Vvf*7hf{0iSJS(qUr(h#u&R12{2hK zk|?zMLgfWaRP0g#xIgw$J$HH*W$Mf%4ou)PQ5s_GGJ(MMlMEYxaPq>DiiH=>dqj|F z6N4GC{}uQ4c$4gR5)1sfrft*om2^wDPTzC~$lt%rUPs4eR_RSS+8ED1E`_Q!K3y`n zJ6E{f5zJjU0eemQQ**rjfZP!^y9!+3(BW{)3$e36v<-==91$L>N`y;u{i`zl`^W%j zRz;;}8ovdt|9<))s7yB9(BISh*nQHSN)ZLppYQQ#MEL0bgsPb11|bB2QF*Qpr#3y~ z@;bt_oSB1nG_j;iCTxmyO{QEr(flP1+E9Z!#$g}V^}})h(!&w6;|ycfj*65! z${yzgJ3}>{3n#Fm8@c0LgpR-<)e-Cq`_d3)L$HGf4V)y{@-U_>q}L!_z0&KdFsJ4fbXB1DIZD`y(-`Fe zMtin{weeR~c?11$ST$70T%Jvn4K?Aag>av%&bG6mhEQ`h=C3(+@1`6~N9f(FkwLxV z8>{6oBatJ!20^pJ>t>DD%`(QjRJzzjdELd@k^46(uYZ$Ivwt-s^zYLn^>31Fuu&OOvAXHLsg z{bPi`*jLHSz|uu|5OylEVo}%t+1AXHu8Dy3x~lulokKsW$YE*E(iwiCBU8!xs=YAxq%<1;CzLV>HLyH@f( zZm$-QJursTYpv$bavwn@V#m6UP*AE<&!-Qc1Kqb;%~AQ5F5X1>b%epPy=BaqJh6G= z_O`yuNRk7*Bb^W25!y#+hVabbWmZ=D79vD%a_MJ^{4M-5wD0X&` z9r3`qQ1GRwZ>y*7g?;<9`WKqGw4pc6sAarDEWNLC6F+j6L9Rcg<`IW?mJDx8y!~C^ z!v-DX?Coeu6@o_kemD0U7}W#u9*YNl9EI$_k$7x{p3cycrb8D{)LMBd|HcnrV6Bwh zDnf~8n`Qo!A80+2(ftYOfw#z0yC$?`;XFb5kD7c2VTaEEyAgY*QQv&W1kBSrg1qAc zd#$z2Qy;l+e8D_Bu{!jK)SETMRIZhKzaH;Dci~5KB}0jSHziFG46uYQOR0Nbi6rY6 z*z3-vqDZo(0c7te#8|^8n_MN&pod7JFp_*snxaG*B1W`#RQPCR1^ntE_?0(N7_UMG z%<{(}qT3pW@WS4!v2%HG{;(GldEo+2X7M@$wH4H5`$7-cQ*?K&_{ZSJ1NLG_g%)Ui zv|iQE!70$)lMG`eYzPz4SAKCV^pZcbU4F~x@#Qt$i>?!xPXj#$!JKb(JzxNPWn|Z5 zrnU#d69{Vhn?|T*@ze9-hsqXy(ptm8#_zZVHU?kT?y#gxHFMKkpEoxl1Nh#n1!dN} z(0B(ci)&t4I9_`56hj}>8)IJ7ymId@*{$jmw)vK0pu67@TGzW9s2%b4V>t6QX}1wD z4_RvsHuQc~+K(SPyD@~P-)m&nNg7!P8fIxg?@G3V+zY;?Zq9*@w~eL})J3D8m7J_1 zq>ir0TFd@s)U-U_RzgjqgDKxm7YvLjH?zr7_{!pIwEqpS-@K5E)NavGvbHefB5PZ= z@fUfYIyJ4L+{NfL{X7m62cD6QGqn}(|d>XtoKi7 zETVJ^5MPX;3OEJ`Za!k*fsR5f9YP|sr77(x>3ujkRugi>_hS02ftDQA56MYmUl`U{ zTOUl{h$W#cEyNDNna_mC4O5lVCyn;tk+BpELxO~j?p?&bUPYkoy`PhH>tXcU5Z1X! zpPW34CM-{yrEd`h7SIbHjw(wV@nW#M#`_3XyVY_DU9>w|esw-4WAk6{IPUXkd$yr% z*n^bFC-J}XXs>3|qHB$Pbr-N5L`^54?FR=wU)IW_$F+yIp5XSTBnFx3)`VwD#STmHSLRLa}Mimm7jF& ztxb&0>z}C?hXRbmw>7(k`k;L|uXHOl!h)zYvs#To(-sUx*A={E%(w&u zFCxO46ZN;SX5|(vi7?FJqprOn+$?i&V0?Mb65(d5OT)3dC-{nNc?HPcu?s^DZlA@} zK`f;ijWlyT&42?jm%q=3CWi3${K=nc{P(nf*UHir`VGfow`%5+t^+>&#Fj)DThIBSG2xtfq^z zuDaM*fgqOaIE)0zat}33W#^hR>{W$qrWj9U8~1DN(wA914YAb(`;gX!|MxES%LGBVM;J^zbLg~t!_;7O5tdqTmsP@z*fE>sw*G`409 zTQ$cx=d!+n;Q+vJknG^41(efu2-B6UvXUfOq>n2I_!B!V?q5X`ch+&1z18A zn*P6a_fUu@4+uNfs{IXu8Msc$UAsp{D9_lB&KN>^l(D6zQ;TvY#%loJc%w8Ub3!$Z zm9c9OVV@kT_Lt=hL>=JM-k`{3oLL z^g07idavc$4q}q&;}}E1SvZ{wXH}Nkg%4DYvkRA+sc;a2lVhL6DfDsADwAo!f*F{S z?@!iK@{>=9f=qF7>=;v7%?>mj7Ev54YdS3UQY^r7Og3-GjIr05I5S32sI+hAx)mVI z`5WWAYMTygM}Xys^s#;QQCSNIRKlQQqo0nP!2z3Mefk?qF{##}sB!YV!@0>Fnc{UA zLD_Kpxm$9vh|k=9YdbP&&!KY*)RA)wBJZ7Bu#>;rkDgobJN_O&c5cD6?70Q|`D-f} zTToayw&0WeP37CKtr6cViGS zoA^WHRe7<8#ebq-sfJo{9FbQWsm;#hfS#FEVKrSY2`G2eRRI^G8_!kT+U|jZ%e=Pb zvUcXD=s=Y^Oc&}!)t-;eWv`fgnbqO0bub%F%$%&#YwdOW zVSQObB>UxS7S~ayHt3@$Ulj~MT8kzYq7#i= z?4+f>_*)jJR+^mFAMYP+t(2oj!|G-Y`?4v^CdEozs7DjaY7?I?ODvmYdbAt(n;z|y zneckFNp7S^ZCniM(Z9OI80FJbpJg7eriaV;>bo9P=4ty%Cw(CgUVHvuK)a^5u5~=%@Tq-wG_mbR5q;3lrc|fsN zKI<04p%+cm0@_+YYlAbA#l{slBZh0PrnuZdbIbB-S^Nc17|_~)b}FEq3TUV1gLdk1 zK`U{@)cB1oy@8#80nv)Oz>J-8|*X#9dcq$_wwmN=?6f%Ji!miE(gUH@POY zu-Mm;sAI`8-GQI+Q#-iB8eVq}i}tfY|}n&s71E&sDLB zY3#DFnvHsO0|(@iSavjh-EWHvB8AJ#!i7sKLWTE?3r*yMiJz-#41`svER0MijUrYD zn4Fq};kjQHcsSOygJIuHJfa(*lrmB+)7jq?14>`Ga7h_I&cp@Gj?XDvFwQA7APgR) z8u$YT2lCO4W$CLg(ZJ`f(3Wq^Cw#&5&o{HBGZM%=v6>qo52=uM3xu~+Il(0Xqi(91 zj#G2^-j9NE4UTH-i2IpUq!`^PLnTiCIX$C{YU>qRS4w79)!hfS=xSKFu`rNrP3Rl*=@b>9{zan_`jA_C$S+ynf0}U)QT%0b2 z>00Ub@FDx|a+HS26x~}!t$%4>eIZcuj&2J?6TuX; zFpccmv&{D%B;BDZ`8Cw2W|kXj#FnXZ?3x!bW?l@MF>JH0Ya<3Z4#qcHXzDW=Q44Qj z#PKBn{G`7c9XF+Kn5wbSAZz;1J_gbEy>>nu zNwdCJGZGjJ{ByESbTJ}K_;Wxw4pb7WEYHt7sR$?kRc7B&d!p)CIC)=#sC~&x6TiZ3 z{!?K@vKlfjixI9K#jGu41KdsN>6HS8frn$DSF8Ece%O{eCJNhQc^abqu@1Htv zYQldbr9x^nUIe_#R4~U{%ONz=7jQX$o|Ev4()lr4S<;M5WY?wAU0j;yNQa;PC>R_U zrNVSWY5hX>6@O5~l2X4VGsRxfOIl1k%_Uyk(es>O{A+wc++~}y%3nAy0NrWopBarz*v@$ZMR?5oOvwT>Yk0z#42NSLm>z+(lc>{^ zQaexPWG3*RKHplatCJ^j4diU&-?`){;3l8YWmvskbi!>>-Z0q>j&GxB%1P*+IEin| zF%%Yhp zVEyHPr-6J}+rXDa3DRtKG{~rZ4}Yf%3GZrYT{2p23;WK?_#*1(xI!=`1^G7P5eTcG z;ZKRU6b-A!s<7IUeu7tyYDDlY62Z3!!3Uc{k*^4=`ZA=JNUZw3NUXx82)<<%PGRFX zXCfa=T%-lxb&&LR6!tk&<`BDlN$M7mYtn^|Q#~01J(|7seu8j|J1yFP*Ely7nISBY zEvWpBQKfswKya}N&+$fL8_zm}DWJz@B=A-JB%ifiE`7Xpy!3H^-<4^8_YIg_)W9~J zd`7Ai*4N5Yhx7jWefR#U13!Ys)cYbXzMP}ZQ`4j230=4_Ise_|b_p1trgtQQ(kv>W z9;fw0e6{@hBTYV7?zb5puyB^LL_`HQdMvSyyiXa{cRu2AMY3Yz{l$wfjz1$|!@^iO z-ESOc=Gkz;s|(6dCdQcBX&5S&Huc#I4{nErg*d)`WoM3=x)5<-*|1edeM6w<5-1Dl zkA{3Z=fPm5$Mf*C3xkCLb{gVSUlz=9OV7ihx~jCuyct5`rG@K6M!6)5<6k%|?!)HE z$7iu6yk9+8^Vl@nK7!F&Y-^$EPDt&lOI*fjxbKM{pODKoesbioz;D^m zAlNFH`<(L< zC8Ny}YC^jI0mtjkq#EVakk>JFf8s|c;=yJn2YB!Umk*!JTmHzK%v$TQ^~q3C?=dWq zDc{p9cxn!!qf|QVyUXRk)GNTebcE{0nCgTBTh0GQO-6D5E?4;H&>+P@=cwIbbx6BH zt~rC|jVq+uT#75CN-mY_3OQeH#1(Q57g)AQdq=$g>cwT@rwdmUz_W@f!q&Ij?matx z=nJvZrbA!HGO}9UMBQOmkYa1)Yg~on%gJm;o2?D2JE}-hY%dRjdKs{u0q67tvHG#p?u2XK;xyXKeN}-UIBc0i*4P&dW_&U z4D3qj3iq9u7j4T&$z9{QsxEM~?&$e^Yc(6kU-6imOX%vf3hgz{tcv$vY_(K_qEi-L z(pcJ27x)6T_e$24njTK=DsAd5SON$%*Dk_7Tng<-Rutyo1HpLzsHLS(*K)gV4*z66 z(pdWR3b}h+?#_L>RjzyFdbHZHu7Zn_t|?koh_TgNXNi}>3<;D4ySDfGy4dL_n{w_- zjmMZL0B!7e*YwY(5_tJwDs%}JfO`9Rh1h+{=$N5IQ#C2uaw!}>IptaMY zv~Sq{(Au+gRbC3*uffs8v?w#?0wz84!vd))tECP+jo%-bVzo>M7rYO?!x;I%t#X6E zP{yI#mA-SYhTI3>-c^*Jq*d6uDqLA6I4K|5t1cH$NbdVQH;9JCDc+k2(_h5<$29u? zttd0rozSIYWFGw=e<4%!Z#b*#%EZRVYmpwG!RP^r2Y{PC^3b@o?Wx zHt)FV!!NAZUDmggClw#wxMEjP(RN;NS0;A>eJ5A`qV4vS%Q!B!NKY6CML;4l%t_fc z#8(+pWUZ<7ukxQU!sFtRACDUO@o0HGz3Oy9FuXUVR3vjHy>#a)JY_*y?2qXw{+;Pe zmOn5;cRwT@aPd`V2G>oRvf!#1THDMrbwf0LFLDKpNi3WUgzQ?q{217x@96*k`b9QiQVtB8*HrkCM-4Eq|& z(toi_{8Dw37)Ci3PL=fI!=aiDi#|X{Lct9r@t~2HrC&E#UwGGKVO4*I>h1tSS?$wO zkLYrOM>&D%E`nwUSxmP0QK^!a$d8c5q$ONH>BBw6d}iPkB9q|+?cHPAGa!gC&2IM;X_|c)$2%+j zM5&$5*nq97tq{SB5ePfL?aD(T0qM9q$;~e`{`HC4`8POuZvJj{JAdn-&f{^<>%7ii zIC=j+ZR(X7c>M!z|F@EHHMIYee$W2DOKgMwgM5D>oiC2}|3xD{e*@SC;GMLK0QRDD zr6;rL36BI5>gbELW?B@^C#wGRGLQbI8y?HMdLC830Pi4mP?=_^#A765yipw@k4J>t z1yg?XO}fzdLG9(-!&6t#TFrZS9-ga2?yzScPA{0!rgUGLjIhZnE(Qf`%sebAWfT*{ zxX@+l&f*qpCdI<4YiA(&e64(HXUCE;kgPox?=M_DnjVRm>`O_2*lPYRJdN|>8kaaV zyG$jYznDr`@bg}A>?R4`O8T~R;G=({RRV2*0 zf?pOFxPv<V1>A7L}BVlqwK0I^yqqBxTvUrra!N_4PxP_4Z0D@Rx(?jO72E?-B zzMYA>OCaT1HiT9idOOJg5~#I2%SG?M@=sV5pIy%^YsE>F9Hg`kwTT8b=qBHqmw52a z5)iHs*QBhFD+LE!WmD3Gbz~aXB@wfC1rGwC8wxx3c3QGDjmsr-#BI$Ai z=yW`8u$Px4qZN$Iq+&RHzr?_4B|#0&OVVl0S27| z^kcchtCg5u5uP%AQX}rx;%mlAf$6p3gowlGI+|V_nJm%ty2chlF7bV39IduMwwwxBE5A`VlTMDwj?iFMJrDn$zWf=fuX zO)Md}cu+z%wplLKy^FX$F@0DIk+=nuk~fTY5@82_WHxaf%4r81a$Fb7b|$WSVBPn= z``zy*W-MVt>Aqdt_awfuf^W2gMY0|yshb^BCw@Ax$bA;eJ)7e`OWrWbNvx6hg5CX= zSx)98e!3sws0VP}eDB+@$TKP{OO^_&DM-vHk4{w}>}yN> zi*V&^S2*#IxV2%6PU0T~#hq23zbfg!De;gvGtzQMu2?r3H|gbVL%nMq*J&oq_t5a| z5okD3SCPIGFM&>q$h2wd&9v%Iy$E_mF2}_Sq`PDdEr%u4IoW>7qAyVrJXwbs;IhN1 ztl~$0E95?X8MqIchX>U##J?v&;tCUdChF{2q|0QIjYYc9T#7}iGcP;_ajQHR1|jjN zJO&Y2SLj-#5$oHnLoCvd%12nAVD?W9X1^Oh21=gAb9|`Q%3>~}$xr;nw333F?+L6M z$GOrmJeR-|dRS{jIU53zDbAKatTujs?XlREPZv{A`03;OMUEV^nt#dzv27d28qZ@; zyJmgb(@v;O;%mL%qKr|VSsB;-Aa}&kaRo_W5e%48O;zlcBGRzD3@LfxAW3-DP)T@j zM{z;o8TmNzBf*>S+%5DMx16)3C=q{>CtUltB;um`>Bs&=e4Teq$n85^C-j(E8|~&g zflLtI-IZu>F|pf;oNLeRX9lJ;Ki|k|ZV~{SiCbhYW#aCVOK;*NgsmrTHWzslcS2Xf zM9Oy5$w`i2FOjn9gNcRX5(`ViiG>w{LUd44L#CnlUm_-WVlk@JeZ_q*CvLce18>&} zFL)Yfb%EuyC8h=7IPOBRdPHER)VsR@l$Mkhbg5~zBH+@OepI@CYgP3NxM7(AAJ*|L zSwaIuu7;~4Uw9EaVD6U%{%A!X35mRv&T*J46R|CCBDR@{AV^@Xjc#L|g*z3|ZKJ}8 zA3Z_^o+2Zfn^9*H3m3>dOiC!3s}Aj16o_=_xQ&JlLM2b6h(M{;i`8{@hYbtGgYJ5L z#`A$YRU#O)Ahw#v$fY+`?|D=8o70%84*5tzia(VLhz*cBOyB@+{QpQ1xCXan~g^3!QsO+B?`d zIiD0$e)R6`!u{%vx6A5%Z?bI#SA>z!1y0oVH$?VBDk{P%5MIch24zhx5s zTZS2*%@6;vdvi8DV>=8X7yesH_>T`JE*l#DTY#qB1-}tzrPeZmq>wsb1;%DZ?AvZ_ zmrRXU0hw_)6$2gr`ue+b_4vqcwfKy?K{jmz%dTfK8ysoJCet^PUY1i}h zx!Q^T?T`8vHn?y#&U_#xv-@5A0Yhtk$kc3H&>y8rnc*;htb7yFR8DvBg; zENXlp(v*_c&HBSDuP+P})M>QC$%aDJcI6q3S8&VI#y{aOmn*L?YW!Gos_)9{eU0Oj zQ~g(7?{7RWIkou8>x+O(0YX}9{8dEM zR!W+KwWhe`|0$8Ihm|^o;b8+rpIWJN8T3a6vIN;DKCBrK>vj^p%wH;US*Piclh-}n z-xKuX1h0h5bz}78tN#ud$V|)Yf<*Xr<5^;sK3O8M4GmPS6sGTm#Xm(@oRmV3!nda1 z#_b$cS14aXmy4*+S4mdedLD<=GN^m0Q1?=gx+SY^hPdI#;7>2uELm-zA-I1#S#8V6 zYU6{6OY^eYNN#|*tmc2A3+~kQ*3hZM+8hZ-M(kinjmjh6t?3Z`vBl7|Oh40=Ah)TV zn9&9(H*>?3wVGuY{WUnQH8$1yc65T@Q zB^f)_qhHbI$z!;?vRvdq#URU7eb$L4zW^sAE9qZlz~st%S!i#n`)>(q*{`NM!NX0d z!|*@f=9=x+gHHggh&l`BsuS!Wacp9G^z)K9CWt@rdtc+<;QEPLl$+eLDWet@B}O@F zCY~XZTu{_zBug8-^9roBkz<_Ha7?^utZ!jI39GJ+wWWpZ1(t2>;S=(ew(&)+SwDG_ z^1h>_WXMJ<_7!BDWtF zHu^cPHiD)?==y}(2njl*3dpds>``NpR*3u9cds8e;n&zyPUn=Ji2#wzIIHDCCQz9y zyZdjc*}CvfrM-?m?Ut+AvhZWUV`|Gf;cqqlBq>TpBl*1SdsEX@T#)o%k%)^0ow+pm zkS@bMAi+by1MXc1OWg;)7{eEZ&q#4GTD9dnN95&vjiiI}O7c?Yj2r4c==*?>!ERxe zpD&+sPnC7uJyj&F5wsb8d%8%2N%iQiFC`1x@YKVLpk(q4HlsjJf{ zI*m_q77{da$AE1lG;%!pa8yF@nZ2tW^(E2gqx5R--#pHhBonKrv_Zfo?zR)$7FPE) zG_?u5>(%GyM0|%t*P0Yn9m!QfHckye?ijn=ueqd#{LkIt()FW4CjViRfA;koU#lP|%d?xIZXNq(lkTvIR^A^0P6U0XQW z=1wGLB;HyS#&=?^v03lcYELd`yq)VJ_xeVzeeN}AX#3skDO?x3*OziV%Dw&w*Q4F* z4{#lz?tpt=9Ia`)_p45@Ei$*&POg&SMR7Szs@b&cf>7e`gej<(?V7DigFvDz%SKh! zn(voM7~NJgNRQh{R^V;*4E?o5W8xi*%#SLfwJW>k6|HK)<-28K3AeQ6IX~R_lhjMW z9}=`BL7ruC{jfFiM%mJ)@f?$`;9AKV2g2&?U`Ijy6K^tBye6V65z#wsmr zEF(dP7n1h=A_K^ri>WF(^4`NA!aT$rEexuT!u#=B(mUxhYLA%XrXg@O;HVp8)vsc= z!ToH_{g_-4dou59Z`AzHS_{`>iC@jOdDhhS90PovuOwmf`s7#`U~Pf5_IgrDZ#rhJ zO_}1Ix_F|9L+`SUyQB|+d<^F}w{5B`oV}?1Xt69r!l_vQ&C-Hgk&tTb4bTryUT}&< zloL2uRBNr>7!eo8W!9Q=eA}B2AIL%u$pRI=N6{A;Bf6DIL zmD*$7)g~wTrFy8jwLQ|*|3hLY)`Q|F;#8UNy1q4EoBPZ^JbhoJuO}LOC9*ve^}P~F zWlAHTZEx7ao`}BIr^OL9Z-D z&m~+)pl&_b&a_6z3}FAp@Lg@#2d&8W{|4g^>x~CzngOwM)NqV(0i%CFlFz=Nq0{98 zM&CKUE*pfDGnBwc54)d#eki`z&KBPbOa0UE4ME&7FpKzeMhdYRv;o)>VcKVMpX7Uz|ZWzCCXf#pkbvX1%%aO+?te@OlNipN`+c(r}|2U-w=JEVbGTEuBdBx+& z@!~^!mfHx&RoT_ek360jUr<-wyz22U$*VJ;;8iuLDQyFF$)%k36G`nUuT#xUQVCyv z$^G(6@}*PVF9-GI+Luf7O=hHT{>FUMGw_MNk}txX3qG_JT64ch!`R(M^p*Ky-$-9P zC2h#!*6M8n2(v-$LS$ENkfa15 zSv`YhpEuDf-IG&kc4!r)cJ*fQNtF$Laq4%~Gs>!oJ)HUngG&k$hb1!g;47edl%->- zv@dd3E2?GM#s9&CX05ro(4#b!0{)O7h|J@nkstd;ehl;txel(Rc;v^UMt(e+?#tY3 zy3eb~dnD4%YN-*$25r{eABpjVlZy&RD6Tn2Panqwx%^18kJ{PdkeO|NDxAE#a#y(N z?M@&?;3#&^Sq0(h=UA#mrseF#5o|iuxEyb6IC1+ALTYm~G5cpxR{bU#|51XIJHv_D zYZLVkKOzL~gX8sASn);p0XhDNB_DSecaVK-E!rh(@h@Nx)`;ph^4nUAKP6H$FYAOl zgi$xLoleoy_KM?y~HCD?Zo$*P4(qG(nm3d3<9iCiV- zqPo@Y5G9nIMKPXjy*^U*UT@`5sHSVthr`K`*%;TEQq@?BYd4It9Kz4@4x1;0)Vul% z$ErKPYAGkt829uwEH>om+Gwc538t)7Q*giF7Cvk(dJ|ABJ4crOUBojPiPdsGS1h1| z2d}r*)^D2U>jbu+>z$XV-#gD&znR~C{BGs<0KeP${SCj}{Qi#L7y0eu_a%N0@%u8r zNBDh}-=qBgg5NB^uk%~T?=F6Q{Jt?S5z25~EH>!Ghza`EE#KW^Zm%svoEA-XwH*NLH_|k_93DI-dVDjp3@isXlOL&q5(>0V5Z*=3g zC{mPYTuBv`x<083e`aFoS9QsjpXW+aN|s;XprPzQk*gb+Wa}YWPOa5W*&W&p#mqPh zK1PSDpHE*~NynO=6OzG%xSfzb%V3km;n^hx9if#v-ysqDmgztH4Dq=8O&N%3GkIN> zXlhla*n!DcG##6TLa_K@({CbqRlSu)Fbh1hraw$rn{Dj;OHlC7dx zNrqN|(l8C}a2YM4esOh`bzRqg`(4;|X-h#fNt>j9=)cfEfIM9Y1iNxhQ6+v6&o<$*{S(v&w%BOCl92n@d;BGs{9uJn zaA3`%@(T@*s^eJRrZ6haxIx=#!7HmB7>YYL&*2t2XGPSx7JPm@70-RM2u#k!OWOn7 zr_kAva&BBA$6YmYE4|A`UBT!HJM+$y3+h^DFSkuz++Ey?M=xpAoq5g9Ya_oc?nr6n z3d@u-nQvOcXJ=w=eaz~5m-WzO$jKZt3!%J?rzUj z-%TKOclk&Ge>4!zoWuR$^!&s9QLA?@BZ$PCjZ-^6&$?KJZI)$klQ+GIqGA=XHD#zB zMh`LQQ5$@sBJ-Tp-4Jix(>0?6mt7nR8~~J%S9)={Zh-0o2jY!;{;CEHpcbeb<^q8n ztuAX1JVw1q4$(X`gEov5)Pgo|JeYR;2uR+(9sgYs-2*KCzaZ!Z`+G~U3v6(STib~( zGBM*Vq9Ixas2RY;Nf~AoJKSb z$1-nJ+?(1M}&niYFSXk-|CfU59;U)QiyvRqCj0k`q%ZFlbsYaf~ zQe^^r*#XVXfAg0ry1B*!)zne#!(u?NTXEXc)!E)U(Dk>@%=*#K=`az~QTT8_tp98E zD*>>33MNJJqf=PO@9K{ylMp$pmiJM?ae>W@1WI$6kTvi>aPL zj~9$^el(D1Jis+oJp*RaY&;szUd0B(`MJu+002TlB?`mAtutKWH<`X*c5bNnSY08W z{dg*Sql{FV$8>nw$sS*yrzq990d%r*%z&|1Cli#lZe=xZomIOsuTNWXdCal#_soR| zvFuvKv+)#j77}G+f=lIZU_UA3NXcG%;VLwhhxPk2Gwg7*%=!dEm-l~ zr2*!ot%Cxq~peau_hH6^C~#PhEAc1y@AQGtf>(y!R@0dW3&Y^ zd#u5ujT7Ire~&t%Njk}BLWZ?$+q2IcL-~vnz?`oEY-A(MvJmIvE%(Tn#rpEyjQo^? zu>3{4BAwoFdtdQYJC}JxO?UPj&X;#jLevhYue6KYZ;hzSg|5fWSn*pT?>$JObhARg zR_Of-9a5-%LoE-A(Y0A7`$=|@#R!>uUYB@v>kEZRo@kxOUTWL9d!tpF*+ql@^{*Yv@5>58ez->P(RA*iY z;K}}lib6$ktK*c>>pJ&}7E?J#bjGyy4vKWP zrf-e2cbGXgZN&l<(_!d%7vlj-^v+n-2;@Hl(jT*17GEpp2uX?RIXkX0u|q$5IAemZ zLhEi}20Pva4rWbUXQFBV+JtS*`u9uN%+CcIF0U#Zy@ys)cjf;-bxRU8q>zAxJNJrI z5af#e?u!gx6af?H=4=s{=!Zq8_CWFdEe2&v_0k}X3>%t^9-Uj;)O7Wz4k?+C$7JkW zk4A-^?J>lf3;rjKcVo6nLSMg>}q1>ajIc>~xN@h@V|dw~EcFTdUxlZQ;)Bz4|z@bFGIm;%XDR z_iV@ST`@4nykthF6{>iBwliKe%mk;sj9skw3{i1c&5HNP)SxXaJ~l=+$CX@|-n(T* zSZSQC#<>C|=o~|*S4P%U;}sHJGp8I6xTYNce3^fqIBGql=))Y3@IP?K*h|`ZWIWPO zP5I_fn{*8`jeSHJ4$96kWA^SGgW{C41r>MtLhB)ecXm}sbg51v zg^RHU=h6m-LXXfT&om4NX5R)>0$%?xY)q~Jtf6mxzn@s>o{+edKbA4|9UaRvq5jZ{ zGgPq;!-V?%x(n4TNlsBoDx7*Iln=@HQ20QVra(h46E;O-A4k<=?DOY_wS{ypO5 z-4MrKc=3{%DJPu$=C@g54)xs6-wU92E|HxVcLqH9v~zCD>^r;9v=`r_L>Q){mC5!f z9M9f;&rhM=xof^%{(asHlQ<%M&7HbZ8__1!y7|_DxMNa!mhITIRNQt|rdScfU$Iw2 z?#goZ`{K@4t9>MHweQS+tw$x=i&6Jv=iIsG+aVQP%!*m+CW&eYJ$^^USv}&crNW)p zRr0Mrh-Fu>QRY?X^nH`7U5+{jaL;q=Y#O6IxMvxE#ckX;ecQ`^I@W*e$*M}gaK6^_ zLqb4T%$kN_1wu9tQr8UL#rFtDsl^6L36YEUvWm?b%w@lQ&-V@NCe2uMJiE$^=NhPW zmEY-{8>qZfN6Ei|c6?Qpnnwq(nxa7b{603W`eJYO&0Di-hGKw#w4ePl%f-)rry~0! zL0a7G*3ghrOKG~5`w0CBR00m8Ez<(?;ut{ZW>@tHH1~ey!&I(k4Pi|lJ2Wn$Vs^F| zpl1QX=K6J`{|oajU&4?9IFgyXW^pSLlw{6aG^KL)hA$o>rH4@ijm5XH&j9mrnSICw}|SM9_aM_AU!Tl-ghN}SQo zEf2#TJEs^~4>`|9&Lg1_2{DVBiri&Av_``{?nL>z5JpfPMyYZ3)R=P;Uo-uO#3N&Y z5$MtgVO;H-$}MUb?Pa{Q6R`9Lwb-_VRiw zz~iHIs6d_bT$ z1kjus>>Me;$VZ-^m#b`Hs{dtY_CCX*aKVJCbGg!|RyO+*w{MnED z9`KbR`!th0)>-vrtP#zk$rf+TOP1v%o3&;(z&`!)O4}H5A5$8dAV?^HZhjc zug#q!zg2g3Rv`{UMcD_0MW{KbR%B0VbG|)i7g%I5_Qm;)ch8AF$VSgrz+-cLQm1?Za5fh@gs}q_B~svMZh_ER zqQSzXT=i+OESayV=g8dyX3X936IOH*YZ}xByx}q8tablc!O(}moT-hlp>LJ(RvG{j zdzv7-Yp9>NZPfEDG&c;9l`2X=Vy4HdQgY_ARwJcNYo@c$ri+=ZALFZNFCG}A_x(Os zcXK+#SQbNxxtSk?5D)ktH9kro$JR0mXzHr!hDC`&a+xX$j-2=60)@)|u zG_Y6uvQaztO-%)Gy(T+18{K`hth7E)Ev{ns&=)*`Rmox1#F|v4U#r^rk zPsXf^`;m#S`EW%Xf9S0{Z=auBJP_G~U1LnZCR(@OT9s(ro?Oh9#O1vb*Q-B_`4xNB z|DG@J@us_C_epIOe_=&{C8?q{>Die9mR`EUxl25szKa@9M?=t3BDbixQ7%_7c8itZ zO)ef`$#SV`#noHqTFx6WyJj9SaFlf);w{F4rL+9oCZ;p9Ds~rXD>`H4-!!21?zw%V zB&#L%Vx*|Gnyy@V!PwHVbNq0^X%y%KuZ?V1Z9X#1 z+pdbEn6}m-$UgxR?TSDjZ#IS&!_r$JJj`Vzv1BQMo! zNcpA)`n+#b^{u+}O=5>Vz4VPczSc#a>( zXSldE^K5x+w_BAD^wD20?RGm+!aMlrZf9iwTx_IP`xo5kr?pITNm$f)^VTyDzl%}8 zF`2cXiPcFIB4cmv54@Qrjh;Vag{`N&Xz2Nf|LpUhoBZdn|J?3Bclpo9{pSJyDW@SS z=b-=mwf}Ve=ZpUHkpKLn|2*nH-}IklNJA>8(tn2hXSM$f`_GyFQ__>t&-S0S{%>w=X_$(c(u8E1RFIerFuh*smB%Wq4fp zwvWJlQa)!)Enek`icr@bopW0&zk1WGw3Z&LrWz5od6kjGm$8qUpOB5z4|}QO+)i0a z-Mq?Drkk7KdF_jzU<~3;-N@D+SirHO$LIv-Wuk;PG~LMk84ck4#odrlJ>*Mtp4Lx z0`0(;CUIwJt_w$k*p+|1FVhz&*%udK(R3IQXZ z$X!=-wq}lv*Elk!n%edMy2g!KmQYcF8o#6(pU-+xiK+wf+{JG?J2S=Vu{M^pCQ^p| zU$^m($G35m8n3LR#%IUcD9O*@l?yJu{2!vY+yytx;iSbx{o`cJD|3|@>B;_SxZ0^Ox1pBlN8kbri*2K7<8)L-92U5Aeo21oZ*c%;;R2(#89~Idm!@1s<+H*IQ zTVKzkry9p6M9yvHu&KE7Cy1C^a2csn;;pY)t3Dv97gOq-_Np$*&3WLW+<6ax@$U-b z4{PD-tP!SIJ`(#44Qy+jS^qGJUctH%O|aQTOc!#@Z2csv1Y;A*MZ`Mu3L%X#wk6wZN=Q{1yx$epUD@;1cw(@r&4=st$V_ zAI`}h;IXr-4A7&Ve$az?C;9R1vm=&0*;=>$wHdW=Ty69c63bE$kjm4j4&QESjQ z_(sonx5hGoKag{D zbOhYu`ZkuWa<&rj?5K<|XpfI42xVrU~{a~Jkzu-}d7`$1*|Iaiwdzxu*JGK$D zdD{OMZI(KJbo3cok-I1`-sY`dvtIU^rRnN_yjfMIS(*-}tcd?Pp=yI+BB2^0Eh%a| zLOr{Ro>Y72%Oi#9>b%@VY@abpS8WrW!f&u`?R_adZ36?!7Xb>V!y3k7%#2&L0Y1TJ z@uOsBQ)SXDx4!>|mRob`je(}Ian#b9*%#KOd6-3suVnt@L~+bt+m7=myLH->!Za@Z zw)6RL=aGD|m@daebxU~k!_?>R-_Y$Sm~U~`4+s=zJz!pkAD&WKhS?QI z!73Pg5yy&cve^fH>@0S_zR^Ct%zX?}*0yT1oekc0G3I{wf^B9y zjw8{*X?k~poqA-0`%`+0)3R*vDY6a)A0$TA4h4Tgh=PdwFF$0wL)bU;QQ)+HQ_i8v zaxwq$cxT$I7g(=lQJM=F0A5t+zm-ISm^^l;WyW6xlG~H?zTS z=7U>JGeZE{j|AL!X>G|$z85(rJby> zinF#Tp8h%4&U~uAnQti_aUy{(TcC|P_@l@Uy|8s+iY?Ci2UFZN<`7iW$icqv9j~?< z%;*19ZIL4NsLBqMyv13c@atlm+ZQ1vZ6zP_``RvbcKf9r!_KU(r%L%$&G zwy-?xZqT1oGRMmCc_Fl!PIA9YuN8vsbv!TtH*qo>q60@Q66uh^*JYC0Fj^ym1ZNN+ zg1@8y-&F{v^c{bnBJVnYkyrT*~o3@dM`{unOo%C7m=e*>#eE$dUyQA;>_&yX& zQK$$xdT#NqZSEe{o6%Lp^hb^U-Npnq!=*c@?S|bm_(Y{ODQECuWk^c59!NRUPNA?^ zad$EJ8wQraQOQ|ylg~89U2Yfw$knQOtxroK(Na_NuGgL5zmOk?R@1zbNKw$&blm_x zZi097!M%YoVlY#ix!@m&s7OcL+tu{5`QZKu2A(7Gf*dgy?` zt20pefd{|>0kC$vjkQ{KQEe(4t;sH=Z|o3CIURL~CY?jhF}jDfi`6o#nqqICj6vFO zXg9ka@(Tt*2CJLd76rw@+@kVAs5q;72S+>)Nbc)>$~!L$vN*ip>~MdC0UMtf#X71j zXAEPXKFnUN_X$(d^oJ>r{j0&q9%VaC`?$zMU(dTc8HLn&-$zWH-P22HinG4{7#&^g z=3X9rjg1xikqI@jx8(${^>TX9hD+&+vp!CC59-3C$Www|TS=%}>42!bCU6T%iGI~t zwMlkp*#~)rL6Hu++a$ShGK_;~X0yfbbXfOwqu&B%^)utC-H9=MY~{K#cN(o9A4`0X zUY2l}WuA;>o07WZEjV}k+3avvO4MV_TmW>XlZDEvS^EL5)$ z{Wveu;4scvwpibbI|%7}Vm*KO^o`diV?Bp%?7sf9>`LN_AhN~a!1`XIYF9RKDAx1J z{OfN_XFvJJMAhzW`%&lh>=kdOueLMO&iwVXvf`PCK3cTwq2M%L%2u+6*~b~C?uH9G zCRLPmzx#rvdYl$~;Pp2l&e~=5HvZD}AJk+0bG{2J+TbN{_E=^ZW949+U;%ds!Bzrh zmHtXXez*438u$hq=uAq?OMbq)CSAOd|j1ZBt zkEyXwl7}2#^7Zx9&wc2(p6p>_Wa38%@I?aQ=YR>+;mi+gyVHvfCnSy;8MM{Zb_eOD(FAIKmBgfTt#eV+I9SejU9X{d-|mWNj;YbMrBU0 zg@E<&Z%@VjkM-~&HXnoUB_;-jPwu*Ctf;8$k##s|G<;@}4Gk`T&Ia#DGOzb+X+TwG zV<=EJ?WJc`_O##fphIr1vNO;Ag78L!H=@G+MS zK6(%kfOesMgiZ~P$6h@ z1NzKJ-yz$2a9Rz8rC&a`&*XZbyl@0|WAgs1mv^%JG*Wfp9qzKqSBp%eH&HJ|R-W5e znC#xb%L5$BphD$A7?70{!ob(P@=9gZZ445dR;H8OQ@oeS?lc007boO*-@uKRdze3d zr1E>b8wG=5P(A~HT@xHUeALx88B@+FnK#PQGt8V~JCAWWS#j2d=AiH8^^4G~FZ3jT z?Y5N&2KIix6RZ0HKKN~(>AuH%nF5ARC0KZ2tbv~Iu9X+uM^27Ur~jTqCCfhJp5;N* z(EC)n9;oi%s~Z3YfDx2;>HXEaOjo=gtVTMm&j(+-z8aW@i?3R@2QMW7w00E_z3R#9 zVjhFR_wl#f0Dz;a4Pp@PG5(l-M?A`}Z@&ulTuX5CZG~cbxxIMWQ342G|D{J@YfsC< z1f+W1dYKw`w!~`Em!}&0IpWN*u70f5cU$XXli2-OiCr{~^JdoLS*5$ixu`mY!TwZd zZYYpXwf5b_VyM5N@C^2k2q~hBnVB!um))k&ROoOL&k949H3J@w?s~#KnHnQ|=&7nz zPo*c@t7l!6Fug@PN_f14n6kT`=&r=IZMFO3^+Cx~|IDM*V9``A_|3ncUN(?9^Ak$# z$p=^1xu4cYp>@t%^??-U34aOm@}nNbJKG*R%dAS>O^kNnh84ut?}Gl^KdpfpcrDJ# zlGt|sQ9Rntefz#&c_YnzyM7m#;oYfvdZSXJ*713_d3iUTkoU8HA#bFwC3ycY znUKET#|%LK_Ik1j8YdflBm~xtwZKWTPO_31i=~`CbLJ&k#GTPFtkwCsIXADo`WH1^ zhEmKuc{UT6mB3B^p6-vPoT>OQmzN5gQie<^YBf%?F?lU{(BQ=iY{{Ph*Ppw>daN2Vd_Qgk<3o#^<6&uLj@w;h@H&h_-GUUB@Mbv{k2** zEVMH%fc!*iaX)u@8ow&NuQTQd)|8o;T2^zvQ;d^r20_-UCrh8X1A`!DUbt}FtkB9^ zLmk)`Nx@;`q>+r@@q#wNd%fU7g7OJPf<**x^MXqV-sAacm(@`>oXpz2rVr`NcxfS#>9(GM42EJQQ2V zm?|qI2uO}9%ppJtWrYX<4V1#!w5z-j=5IxTixG|n3YDg%y-)F3QoP*~!`G{)y=kjW zX{DZ$gL3DxrnrVxiUGj0Sp%&@A!L&_#HP5+S;@}2dI{&pc`VhRj-)eHA8WbevBqAE z*oJFYQCF2+9(Vj?fWMwv$YM&-gVF2DPl#=6 zcJ@ctEWcjSq&O}IMe;>OXO=Gvq?cuvFMPXX3-J9OTPV}GA7LO3$WwB_Lgzujq_AVygZ$&`mVHb8Tq#%(6CqNq(2` zyMo_op!9rxr{L=U2mGGrcRRnu{QktRth}P4B3KdBzkvDsKk%p0urBk*49pz>?eQ`3 zCwZK7KEaS>VgF-;uVj}-UKi9-^BaRnOY2VKi0D2|-7UDVQrGP5hn&$gXQfMmWn$A4Gq zFPX0G>@p*&@kihr_E~D7I5OP$egGaDF383Q>hRsjC9@|%qpX!+{rVpo2)T0XvW?6>D_WMWzr zj=Y3eY@2JJlP%Fu_jPLGReTX>3ReQe8MaO`Vzm`gjMvwfggxjMuM^@M$6>nx*lqx} z8-VQwV7md>xHutu1F+pdcU}ye;Z_8$`N=Ne)Z)c-$Ch-Zv$;@>D9&t$@MC61LxIN$ z-xE=qbkM-;wp(MN?n!2_v6?tqOa~%;aGNRE@FGAZi+>j_^@5Lo&dpF;RcUyFCb7;Y z*l5cao6}u%c9VLY^Rwk@DwdJSuy-bQ{St-%O|IHt0<)Zl)NYV&#A~=j6WwISyeYKV z#+9{4-&}f{T@FH)gOKGQWH|^~4nmfLkmVqxtvRwKYj>=%Kcz5yPLDPA_3HCm$SXs4 zia)+rp-)T*wjz4RGS8mDwiWJ><>KW?|G{GMcB@y?c>=@mET*@))8BuSjC4N{if2C& z_W0LOY^LTdZg$qJ#lFkk?`ZmuGs-x+nPozLJ+SP-#y|hb(8N3A7M+uq}M67fWYdXCg3;3Oo->iZ}(kzI6-k^Vyi zMsPpQ-%*sSl97*kUR+5^*7(=#W@T^wRGhW#+2;bPRiiyQbg@#8k`#Zi9PdoNy?%Kr0ml{=JK zIhOmM*AV2xTJLe6_qgAC$oCB29`GI_CEohH$1o3W$@3n2lZ9x!o*Sn>RUg-%lzTaLQO;3N zbr$TGx_6PM9lkM?IY5X5HdJJ8*!l@*R6@-_JKWRJi#kJvvu%zs4@NuKrPA|n{pa8L z&rkW!#hBk|8?Zx0IP|*+!4pulr4!liPXD#me4AEMoz5#_$>{lO#v!UtX6p?k!Pj>9 zWVWjQeiQT4`X;qfn)aX7Hxpzk(0R%R#V-DSeN<1DZ;NE04?Su7s3l!yWfnt{u&Kp? zRBqOFHx|%&azWR8B5~kzNA1^;E&^MN&vKij@L=a0gG?9%3j^?Zukd7SaNYh_MQ&cQ zmW<-9J5Z(KQB_5*dd?)=sCdp&|CipJRrR$zlP%@xbCa1j16J=QUa87-WX@TxkIsJg zzO$qfv3kWYjcwDY$T!-2OJ%yn&MjC3RW1=#@?5H?JD<)}hAhcQ5TcM&u5FR~-7~%T zFPL~k7tuAhRH_Vj0Is4uDZV*v*Fa8cu(?8DbTT14`+P47*FvTZfx>7BdLaU)D=%yy zl{2ASQ4p`MEnZfOm~Qoocha_UYt@_TC)M;tpyMJcgz`SyBWpEsgnL_5zlQL7GI=NB zNFXdglTdAxx##VwyOrwhT}v`k2`_&zf}nYxTO$y~5mg`LQZZ<)Z1Z-E)#Qp*o! zd<)F@7MSrZQGPJvTVTc;4Q3`Xj&bDS7KB!uXmPT5jSERoH!VWHce25*^7OSRj^NpI7iOwVf!@`I0V8SBuc z?7f+dV@b^txN9MaBx>9(Q@oM*6j{W)%5Pt+rE=|HTcsJmNN3CcjO9Gesa-QIpaL;d zrc#Y&RVxe#Xbl5;*SnQ!LJGV^E}`7=!aG@B-o8l8C57`OM<>aOm)T}Uns4_Ec*JX( zJQV`78h|I#XEm_)9j>jk$F%4Y%#lD@y*|bqrjWM2@;41Pie$QHI82l%XNctwkJiXBz6mYkA7K zt;ue^7HLL25yH4s69iut+SzNvu_J?hP`IT3$2Nwj+THUCQ|W-Y=+1U7M8w1^P_M%m zvTs0pSmr+PA_agxPoQ}Wl|7N)^0L*K`Y&V*ZDr2kP8A6>pVv;l?o`eNzwZT`2>!?m z!nChr49zzJ4Phkd>uUKSNnZyqzfRwy{A_-J{M`=K;Cw|7HM}g8-N9JeGes5L@|M zVs9ZfzGmI6Jlw0^uSTpk)zk9HrrCul2yfZ%t|S3!H$;)g+^@2&%CzKcRRROXCB#X z`f{pKS&VA)(01OXu8#VwuLmS?($MS1Q9Nb(a_LmV97g}hXFK~Y`evH)dY$(lbg$oe zzw?6XycfM7oiok=3DbGE)S4v?43MY3NBPltTuq+c=yjemq4SQyOvXEJ-(aTHc}F>* zv{{|E(R5x$o#$*eeV0++Ih(z%%c$%0LeJ%23Pe}_rhH9C9T#2m6Vq}3bdDO38SA)T zh+gTqR^U;`X$XQM%|eWtl1pt*>>D3{$NANdwG-ipS|DSNmjYjedEYRZ4PwN-*6-V3xMM7f}&qw(YH|yh{VteI21i($-mA(=I z&_+?;ASnQk0c%Jl*_h#8%fcFWZSLk#`ZRN4wRK0H(h(C4!y1yNi?@4~!!57#`058p zVJdPQ!JKVeV{o5c(1A*hi0+V-xqoCBuiPkvmvv8b|EtzB?D>s}73RyV-e)w@oykcq z%*kA&YBLv>rQe0C`s(IYEXIcdQl*YABUP?4r*O9I8bmw41;PrZ6h<|mmZ%wTxr`x% zzm`eX9Y zUAALJi+lB%UayIkvW=s1q6q^cjIHR-QSCvV2m3RWw&I?o>@)o58Ky z*TC!80Jm2Cz|_H?65U98m}K3lBbJ_K$hq4auFSf1`)GJi$v51!-pMsxvO?FE7517_ z9)%rdxl5IEj1}dKPfJs`BR`<_E`({k^K!7VLn^&&7-YEcCKCjt(j#D zInuw8-xdEjvuqQ;SNN^{4$Ol2!`PwK8a1ycpI=#^EN|+R1is!#iYG|m|H-TX*K>Nr z6UH@iw$mdnZF4x(>Cr$*W-$re(tS#*HLDL@lhz9j1Dxm7SJZT4tkVQi&M)P>vggGg z3QJD#kzY&{0A0DL6u0@F>d+Mt-!xTRUE7|$VVAsFW?Go|ewEC2xykG;2ivoY542~y zhOJc(Qd}wr+ekIO!g2PHtc1+JXexK+vKdtz09~nfJM%`RwJM)6bf2$WX56Rql+mlXed&vFC^TlE^ zTX~^TbbOZ_DQ6z?Z{(yP^sedHdmm@D7F%&IC z$FP6-x#+SGWIK~Q2q~?E4XHYu4w3Mmf40&NyncfJEY$Lc?A+~#XtR4i+}O?(%F{1! z1?BaC>8&NdJh6wRRsFPxuEyMHbhH5GL3U4%?a5Vj5XnYkFpA_$N}61SX@8F^7#kouAgP(A1Jg$0pG49-Rpl94n^3 zmo!_Vf1swsDyV*xKr-`2z*;Svemnb9!<|svM_!6H|Fk|#;nu2ceA3RwC(V5rcs#Y8 zx9rA0*~Oi)B1qb02=O)LH}^hxSIFinZ?}t_ldIm$2XLev$Ld<6=_k;DCK{UyFwF~# zgqLsnAxD~ShNo%+q!zN=WXKXSRk%TAxL;+aa1LmnfOMLy%N2oE-h4_@36FP6o&oFgq1_JGWX35=`TU zB$Y$|qF#vE?B5t8)CmA$Um%^KcNuFRu%w)Fs02dQ{SIa|AOh8bKw5top4p!I(ATQ5 zoi$S_$)f0`S~qvUgJp>5wfp*UTHS%AP5K3Bm5VG5o#vs_9fnSKaD_F#953GinaU|} zyHhFu{l)ZyNtFA`YRNMj_8C}qilDC%XVTh)bquNwOBM{o8vKuc;O<#h_XpBZT-f7~D|=Zb+iKRb4-U44G*Iz& z6@FNg4Wd%znzku!_-_!20@k|V2c~mIFWWX15KYl`&H*Qq)qYBfm6w!5cfmcO0M8`17h zLOKCSnUcU+akz&~-n6mqG<<}?keL%Grgs@b1f=@tTRT#XebLaeatvT{)y?j276*k^ zb4eNZYuCdXm_^OqmZBJu&_Yp^R>n=^qaZ{9W~F&+ee@TT zN*FoWZ85-g-(qK0gv+|SbIT{OIq4yx%AM_fyjDXO#RToe0UzzfblT%bYHt)Xnt(*Q zCU?8n(uhe7#|)SqJ2jQv2x`yG513VC=HQ#zd6gb2GW3M_;d~PdWkoV zMf*@0`Bi+b1P_J^8bGf|gdw<~MiNJLDi^Fc$WFt*Y5sM%L77O4$d{fG!`<(G-Nb9p z*?rQBVn$boFdR!&j`r!x*!-YMy-Q_uGlYXd8q>puA3|3+SI3i^``{BKhhSn6j`%cj z!~*)WQGD37{2)U+%8&mS@?()_ci7oA_lqpEOG0LYcu~_(bct~31M+s8;M%)q^B2FI zSl#oN^5@nTV>LFLG}U%?hMm2X>Fm-l^dF=Cg|%_q0>_jAcWBn5Tda-4fS8O~kK}Q1 zuKO@Q7S8k)(?{f+#daILU6YYXMktu{VdlEP$~^_V7L4zfTx7F!^;I#}>5tPZ|Vy zU5W!6lr;O?K@+!+?!=t;gl@Ep2PZ&yVtiKl<|^kSsG3^CtGf|*&b`TIoe(0r{Wt#HxC^3sLaAUC*-!X-!yTP38=)F zGp_;jDA`UPMn-{?(}G8{=#-=g^dHr^lU7J zuYWf~&BnYs&#eQ`GBWe@&Lz=;&3#delFqdqM!%u8%ViA0T}c_%Ab2u}S+xw=Os_D& zJfoVtFb6g>OcMF_48W6T4;e+PPAh9+1;1>t1CQC+udL-Q8MwHK%9d+;1w#2a@c%Dw zK{BbpVVuoI!o7U38FNu8@L30ymr_-7S}jqT%C0sI<3r#jgy_L!<1iIyeA&5+pp^K_ zw%yoIl*+aPSO;ZS8{HZP3B;~cEL@faN^>$m*40M(&zj2*MG{d@#$tHGz+}+KBr?Da z8NWqR-uufa8**^k=`Ax!#@TqVFh1}UVDBLlz1(C6u5HH2 zs~ZFY(U)*4Sr=48X%r=bQ7zKn$XbYT4{1?y>-;88U}WbvkKUnA&c#t}cdzlXR%&tS zu6$gq?x;9UqtSR6|3{h;7kV>2D_Iekj^|1^?x4@EVP+qSHWLe3w1dTYl*^Xxe5Qk_5&&13rt%DM|OULJEV3AF4iC`mD8hZJ6jF2P_%F*iexAxHDedaYiKFOtW*x} z%I7tt$~$ZA;=Cri{9?|M82yWOA@6I;yA;Bt2IsJk>X*WpD=%c{3bJjA)NpD z95x;E1$WdyKR$=OepId5@9sA7W)AzU7o}aCD$PR2Ph`i{Plaacq*gfG?hOmUhkJOB zG992NtW~G0>zV7KEF`e_8;TmNBBkM{o{4Q~C}z}Fgu>aSaG9mG{2KT%AeT00m)a7z zYTW^WM9-eC?qQnkI-n{jmT3#{)Sn!AG?I*&DZQeKShuxA(ikD@s1BRiNYwmbDjkyiS@{jIPB5UJru-neuHq0$|{`#EhMPAF9-b9M4D!(>T9aBWgxkq`iH}3v0Q;lW`O}lkA?zGrSV#722u6D43wq*E=2*q8pGjtxN6XTSJ$&FMn@09^pJ}WcqD;$u-OUsHmyAcJ z|5!LfPPLWdq*P0k>Dv2fmb@>w^T}vWJ^%!!itc~LL-pt|^dtq~^!C-8 z_hR8}QhUq7X!pMe%k)$FY>oq@rvQ2sTbRNrNp1#)T_ka`z)c%Tr!t>xsbse3MIy(K zMSC_QN@&M7u6f+6-gGm}Am=jUN*14RzN94YON>o6x&QbMO!-C{4`iMXKyxPXI4@D? zg!G>yJxne$05c{%)87esjJzYmBG%+_PP-ZHm}jhn4Sx!jZ01nsiFW7RNoVW$td?xt zZa20q(Q@++DP5ffi&D9+MN;Rei=~C^0~l&ar8Q6 zUsb=0FGf9eA&@Y*CEmhku!oR$LyU7U%Be}gqBZBoWy3MuUjGQEY|MP-T-ISX?nDA; z$IKJh1ee?$rOFp9K{ zJ3A@;yoaC#3sGHQ*L#(qa9h!@#)f2QWvXzJA@_$waSuWq8q)d?q4{;V#k-K{iWNJ zuzdFhX@O5Puh|Fx_vkG1#YJT$%i4B!BkpF7o=AbBCzvCe9RsUZa_;os&_~9g_ytWX zp4m;gYBFXwh>foTT;{^^nvUc)I-cLTsTQolMFx@oJCm*g-p%#Q9i(fzh1i1U!|`ZOFwJ0`ZUrH#iF#P zY@qZkC06;|Y8N=SZ-CWUZrbgKr(zmVInjVz-zTl7K}9dgXHQ7t&ByI*vmnw@_lH$? zjbObHH4QExG^uJ%9{nCuHAg>KSS!xW;M<2eE9yw{G-7dYvg9epLYAq z-D9pJljzKt4^kar$xYLeX!M`3N;354sp_nCb2%*YWM^yeej3Cy(H%DK6g<`qimn?# z|7#?IF)hB^&Y9cRK=&+h^(KF&6Q?)HSKbmTOMm2W+mu7;51Ir+SdPiKqiss&pp~5; zmZ~#X*=yFT+4(|=nI=qTuSB(ZLZrq^N%iEgqy2~0U;z{YtYwbL(uPVJ@Dy?BTMV=i zuwjFC?&3-Acc%gEypX^p-Uqj&P8?XdVp3VU>F~VChtk-ilb{6dyvcxzrCUg32H1jg zESFc52j_%Hf*$rvW5x-Zos@KU=KQks=TWCg5B#@r6npSmYuT0f>`kY1Kufzg-5*8u z7t*$4_lHn%yy+=~H31`9Eo+P&?hB;P)V7OWXKUN#)JWfkDSYQ@Z*)-{cN#D)^px4& z_8s={k}%~PusP|ldvC-6X;SJDfEc%u{jF6p!D&~(C{l*X)NV0oKC`|w&!MPi_vgj2 z(%~CNOq9}3*WkxBO^8DTFzKQb;@D#@zj@M-WJOHB9vtR@`Cpl|>KgHFJ9i zf#eoKx!9ZHn@i?8vjO@sI$H9`a$G+3c7!H3g!)@wbIGC!M`+ ze2wP6gGf~$)6OM38OhcoH*p*dc#^IAx@M2vw_15Nmj;>EA+mj#Z#NaZQxh1>Q>o~6 zi4j@E6?Ca0hrOv(mHhr0nJI26P^=g6G!dRa_;W)`g}j+}#&f>i{MD2yXVaHEYdjUr zD|R{J5UYi)=uzBjuz{n?P?~*Ap(0w?+{Lx5jii)7jZhN1uf6{t?ZG4$Pf zKH4oehL+vT-|(`fW(&%>w$}X? z)tH$04MjU9+HPG?WA(10n8;ycx)^9Cs z+;%J*6e8{urd!Z!-C?Y^oy-rth+6B8|5S=hMh!2TX2nc13V8i@?pG>jqY}IAbaS!K zxAY4P*+&i-gSm`BoZ~&jd+t=8;xJ4&Ya-cxP){H*_#H8qn%bR7?X5#ytPDX;ga-L>9&2ykG_&k}esB7}zRfes3j9uCL}*qo>3hui z)tU`jQn=zSz5vdiuM|oW_7*glmQT=`jvW>DNGt2%F`Kzx2*`TWlr`3`ycvS@I^S!# z``{m`CTH;IG0FQC;T*4)D#7=OT5a;VzoIWCWd67MC{KSdW~U`z60CL&RM>)Xi1!s^ z$i8Pxr?i|_8=cY~0^WLU9z!bWd{AtFHM6=j)yUcjbxI?OB8L+oD6dkEC6&L{mB~g< z4c=Y9k|6sPw$(O_dZ>>#>7rOF%N$!&g>WNxD$N@6td&z%TYoBmDYa%clCnRyM~XD~ z;tN4ut<%a)`XG4%1)@QjvJ(>mR1>BwNPEXOiamN)jcjd-IfK`^RlX45a_+{uIoHc^91aV+U z`mHWbZ^Ssr)*WJo9W{1msO*r3!rIZ{+}EFppamfO-0=+TuFDvDRcMEnDNgu*_-`>W?-grEVz@-)d;LNM3c_* z-a@-{ONCiK`}#BXOFVno_x5QZoM0gP)n91gt@IQ0W5&f|Eh{lrNxp&%SBt)a>>xSV zvPp76!>xRpusE?8ExTI(t@)2GcSw3CICO-a1^Sn?KtD=L-Np?n)U3{Hjebn*nCbt| z^kcDW2a@JY$EQ({CA~8pI+#lkG5oJTy`l3GD8@MN%Wnz$zYrX@jHjdFbANsabKR( zi0Z%N*k-S6B6_ z?+)iDcb_%xKM@{Zk>r*!>!D$`GVI7Ow>yU7k;<>c4);$^Kbv%(!jmI=?#~}h2A)i{ zj#!y*Qqp+-M5H3&T*UTnKjU&2iYF|!xUA}-K4c|IqF5Pc5I4_RwYm)TTRgJrD`hA- z#=cM+F$hn@m`pV$B4m=TE(;^bm=cJtT+L14d|h3}kxD?$n=o>)0K4N0U_*4kw#if7 z^`-j|XkUBoW4Z%(ctY!vGV6UF>;Un&u^t#48xP@jX9l!Kc~O}sX6Mw)KD+lW;W3BL zNTI?g3Ry>Ij!v;M|DrDtr}>9m{Digot3-i{8-^z*M+(WFH&*g~)0s9`%2^K$RIg0t z3zOT{RD%Eh_UsHw?6&YC-^>*tn?@X&;s%2gbUpHXd{UvJj zq}K5dp2*AnE8@TLqn^=-pULDe$;1?L90iSUkT8whEVmQPz1(ueq{n8|YpfTJ8~@@Q z48B)9L7wJC@lt_}6b8tWsauD;Ztyl|xXRSo#=`E~2nEa%SNVqlqwdv=bs{j+5TYf8 z8a7DMFL+6rP^vgU615vqydUKX_}t91v=O|A+Q=9--^ziMtpX|a)I3{qKeKLk{UV8H z6WTbg|Ck7}F|cZ>xGC(HFs6ubAMt8=x7>PYUGqzT;u0*@Uwa4z4wN%x5r3RYV*(Fg(TUTlwA;Bx+w3Io~@_|F|2gzsI2F8?%!MQ5K2jHxGek09Rp5Xf)B8U#kI*aWm-k-D1x>c6EyD<pRvNm;E&EZ!tD-JLFd~D??g?%2D`*UFXv-EHFleUaK|0^k> zx$FSCtnji^6+A+&-&$8b+i9I|{W3J#53T_2J^J)Jl2Z?9tSfhnC;2W($TXrakCWt} zb>%*Ve`#HL8s*mBJQt<@GYs!ai8?pr52Y{?$$d=VZKam@-Wh~|=lu9%W!9D3sO>Z& zc3W36sf?DVA6FS&@A6WAey9X8mxDK#J)=MSt&cy!*XLBiZz$n;uTbksVm|-NPOIyw zP~2*$thXBI4y(a*4k^PXrI2=hJov)%EN@6osa;1yikh~cDAEjDS8ngLt@BSA#(63b z86Buram|5GB+VRHY2EqnphL`sIWW+DrYG;gi7|)q=f44Fh$ORCDpI*4 zc6cC=e%5y0V5{2B{O-+U;Eh!4GhLrP;k-z~IXTH4XN=TT1hX?udfaj1hcx|paoYFY zSH?(6Meg3AIV}~b9;EJm-Ul@uig5ETVs}0zWAsGK19M$H;q5tV25egC8BN46QVp^P|n(G4aPH za~#Cq56&Eorm@`_K^}>^*D@sWoNVXjl@C@%$_md8R@NXUGvUmZ{)Y@(N=R#Gx@u7UOvmoy5 z?s<;IR+*CrrB%Cl91MFYtMd65LivN_#6;d%z&QSEQihxbu${jqWi>m}e_hJ3v*7Z- zF6B%K?|)V8HO_)-{<@U2)!+VJL5Txf;ouWo9Ba*pMXm6(rwOt<)B)iWm0ZYvxz;O= z83@<-g1piGX~H&(Kx6wmF5h8-)UiHF`WTeL$(v+jA5y8^I%r$-j-pk7u!r0u=LH#S z3p(t;@9h9K3`cN*#iHt?7{H1WIC6KUYQ)g=ffJ>5miHx6_386+ft9Kc9e40J^WqXK zEN_*6u);GOE|;`c?1U-g6HaF(JYdDPPHV+}IPr=RJ71{f9@C$7U)al z?zkuZkuL=LosobWi|mipan0psppA^gB0PiU@1$5@Qvl&~fJ!4n&R!~t@TY2iuD)D> zin`4zi={)LKjyp|v$n?3$DdbsB!Ktv{+)01{a4HxN;sQ@1`13>HpS{T#qi;%3IhFl zr}?@HC%=UzFqMDXtj=joJhH>tPjppeFTuKfG2qB=sfY!3&(ED#6L%I=bDO(!b(m#1 zC7TNB1``pu*%sb)YhiP&C;u-`{nw~hSzg~vW&62QHD0$j9@s-Q31=%;|5AHoZz8fa zR<|dSo71dnsZSBA(isx?f!zQecb*3Hc-^lQ4m_#8>8#1A@;z{pD9@PD(h>L*;eP1wbj|YER&3tZsM0$(N`j?~xWGlg^3^ zB_esDoz4QNz%GiV-iCPKIZCHkF2%0z6A!E_sI>hIEKp9DD;(L>)Bp3{57w(BZ)8y^ zCB;~MgSNWI1H0zZM-=OT{lqze7l2S)Y?#Ut&f~&|vk4Xu zi{$AL!v+$81ChOTo8bk94*(sNI*BGA6&5NJb-UwKwGYk$S=NmRSqu%~t7qt~2cKSP z!ccKvJeTSINFLD8@XfYAu2*(r>Q&4}xXke&W` zodL{wT$M#0pHNjZ6%j+RRHSBCi%&B6J~;Gc421|2IAt@cwpvQnsZJf@OUC%*mfKjcFl8hb53y%#GJ?LAU25f@yOFc0~18x z2~iw81UzsM*)%xFoJtcIWCn8pt&s=B;OndV!PhQoh7TNr zoIn=6cAj8`C`f9W0Fr$69}hf+(%~ErIaORM}LL5KWUPu15LBpb37D>;s4k-(lK(>TozaKuN& zGYHiWHH0OpL^i|ue8RnQuV9_Imc9k55W)tta^P{eT0EesI_A6un00R%9KvpZ_z#8@ zB-x24(Tku|5Q`OgqySo>7$QVLvrA-AZ^%M&;tN9DY>~E)Q-q65f2A*E2$P_EI3D4y zuHZvl>MLZ9Nh@%XA@QR2ScFFiq4~79FW|;BiP9Fh_+D@biWAOu zL#X1JnB;B;p(0^H8`gkBSl%uW!?E0D5{(c%k%Z#TOPXoweoxTQ=i(8cKKH7biNLUg znr+MpNSFq(f!8&ZBw9;6r9a@A0#+h~-i-Lco0*Upu1+6)s)o@5ASEQ6`+U{e1+pW% z3|UV${NX%92=rJiG8lNWZiwk;CP9Fn?4h-Pk4KaxCWi>Z?1q5CUxa)nT%mDF!g&T3 zBtaYCV!89q)|=J|P=E&Rmg)W=GqCS4h=wu^k?!#DZD~3u4Wp2`N{T5X693Igki2D!Sp3hT~~y z0*OFQILrsT5_QiQSyXZv!ZVyjGyurRFX9j|hOZgU-C)M!Jv@(3D^f%Kr6t8PGI zVjvGl&>C#m`M#N20tcwLwnWmR0kuf8!UP%sy&e@C8mKWeV5V8flBu*Zmb<)uDocd3 zjp#42X1c_D1(3n@07jws`&{>J*y~6qi8zF)TO>5#nf8Z#Mss0O%5!QTKnb4ToGzOaVa4sS= z%qgfA(ZQe_D1>7TWfmrzl|tBla;JxFtrzHL@ZB#Um=1;_1CjlL4@wqO2tawxk-Ap{ zhXAgA95^G%3D+Ju^Re>J!3!DiHkH7GQlIom!XrZDQ!TsWjKgYyY1ZF^nSLZyL3y4J zrIwoeS!CxbnR-Q^P&8{;Z*qn?4Cc-;gbX8r)iZOzLh>jQAY^3eNFK&?4iYpE;>Sru zZA8X(`X?ZiB?tqrM8uKJfhQ@2IYrBO39Ha-ouOLZ0W!{x%sD`M*ADPmYFh4N(_$#Y zMa`o8lE{i^+m@TjqA3qUp$%|g@y)!Ea|NqpR`a%yw+b;tNxsOM$h~xA6fL85M;K!k z*)u!Zx`viQf9HVLW*z59ugb z`q!w0mrOV;VqC{d|LNb_7<0;G`bAOAC_-)L3pIA*7qCt^g#U4??NH+&F2k`5oP$k5 zDAl^PiviPD;5NIqT64-LpKRoWYd`MZ;$_7(l`~L$;>V{CO=l=GSWIsj{UOarVU3Ex zvQ%r)c6P(wiLaUXhj5Ct0f0~|zd3l(mVSzeR#>00Np#;wII zG33qNjiaPgw$_)sK1e@0e{vm@Z9%BHOLHJYKHK z*v*SO_jKPVjW%blhB=aZJ9dkx;ki7%`z9MNG0rZIV&Lqgdp`a(Vwq#X^kmE{Fm;Z{ zoXk>k%7fk%>33mFb20FIp*)s#^dXVGS0&roKzGAfG3iIxeCyeyny)hejBW`ZOEA0*-f>?=^)&M-dEwgNtw-*@eE=8*u=-uu6; zpMO4|$=Q3KefC~^@3q%nd+oK?dO)(84^;1Gcy(*98Tmem>qv~5cUH?ueWUfGyHxId zytqxhxTiYFi->ji4eG^TV|+iTQtrQx6z%B7$IQmp{;J({VTp(sx5Y4nyhFWz}w$@8$Ob zYCBehd&rS{ql@BqQq#kt>J{HVLtFE$X)@+lS5HMT{(HxuHMh3Cs^&Oa`x?|^EeXAm zM?`TQeNU*JQioMyp=}WhNy;BGyFkEdR_`jo6>f5WIc8mPRjLY2tHZwd&XHbJP|0Dx z_GFriv!i?ZWV}R*_)nfpxOCKK6h*CzlJBA z$9dI|9KRTz5a5`4NRA&5PpC$xVMvbua1#n(68g+0kS%E*y0cNxFZ?c_Cw1SEU!6H_ z_*WE~dhoER4cy*1LJd8KdzG5aVOREp0&rd!k}N&@RW1o-Gv-_L>%*o_KxA@g-osL7p1oQ4KNC;bvw<~lE%gr%2S1$3nf<%?;+sEZ|sf0fj zB;-E34g>6mlr@(7GTB7+>C?j#=2Z^M@#64=gcm7@n~5LxnjY z9b{J+mO2ZioBX$+{!fP|O#1M!9N!zBaQunGa(u&0a1mQqZpLDk)C+n`N2o~|w&s67 z^|_OVew=^v;79UroJm|VDW9Uc^E<;5WPewiI<0zGHgR;CZ)6sIzRCI3p{Zhj>(JCK z!%|b@Pt9k`;lSO8OPpSldU3{Qximd}wZYuDitn@-Q?RArqL7?$wJ@C1GG&>TXK z+Ydsyz0IdYgFCd2$H*WAI`Nm1#Ggx8ru}2b_FDT{OR6#SD7;bQm*IY+c145LqdoMs zYp>;mH#t_jHxb<5d(s51b{8V&nx-9abH-!Gvu9 zGpBOgGim;7=KR~+Zv3vNWgbRzS}%0*^Hd{v#m!nr8SUg#clIcxe$ekLm_Ra3F*@H- zLPovqk@av{9<3wI?Cy!&;g#ui#Z_*Rlbj;uUA{=>V_|V>d9%8s_SeKEvSaSF&qAO) zmI*pr*B&aHt!Abc50wfB*ZNm?hHjuy``?xaF7oEi3r|~g{ zZQhv7My9eyKmBQA`yL&&a(pc*1rqEq#q8>fqluTsH2VH1Y$(kBXf6IZbUlYQfAdHAhZzZ-;;kxI#!yelJ2&Iuw*=ptwiu(SI%|pZ?&0@)E1n2c%cN z_`v~1tU&(DdPVJ{hT`sZ|4MjdT`lG=F z{$cx!K%Yyp!ecV}MkT4Rr^_}qGAY$ymz}2jo*vqWYes4WYRF@(o_Z+LM{+djM5hIc z4(a=z3vg)vCJakt(o=9Z>FN=nmMnojn4GBfWW<+QZ2C);Fm<5bE-O6*uvcMHkJ!60 zlvJ&r1^}zd0ruen!1g_pg)2O1>wCc^SqkB*H~n7OyoM zeeVUCWXVFN#2a)Qr;*Zg!rIsI9uU2UfcPT&fFt(ZdxJQT2Ql&9ASMbx6qp3W7XXn1 z2X;58Y5?M)!+XL148+{{M&5gTB}=v!6?81~{-Yz4b^;ihSi^>Q3)`&!LEml9_uUik z-FHtE0;Yyl*sRE;1AwL-0$Tn5473;Wply3^(6;43bI?uT@?{ho7_t5mnY0TK%MJnY z{*y=OJ@#6+I@rgg6{=F??3#v>lxOo`KKb5YKA8m*%^=WCU}a`ZM@;wT!98%a>)Ho5 zoa9jgL`V8XI~?XW*m$qj@gWD^$7Xa+Ma`dU)(*D|$J-kVHg3~y8H2o@*tV31KwxiR zziiUjtGSyrwO=!b@mH@_jnE04SLF7NZJ){S9ko@<*a;rK1|xpsHmp~FP4a8EJPgc3 ziTK^`x5951Rv7OP!HwFm4&y3UNxq>~%pa)=D{{Ne<%ITx_8v_5J0eUvT#ZG-Hmlnh zO0cEXcZaQhw$jsO&~(MDt5IWs{?HgqDS-_O9$MrwiklIdun;~L4PdA=0mB|H$<%lH z#~gM<&ts>fM)XXz<@w^>4nPh+A2z@Ekm`)E^~E1$cLpTht!ft_*}%&%sLM!NedG}r zPV)R{Xpc=EsmI{wt*aN)898QOi=SL{_|DPIxMUq#`aad<>_+R5T~Q+gf?jTqk=TuW zyY5EYkFk@+j<%-QQ2sGbcEHNdAL|NRry09y<#Lt zfl@#eNdL7^_9CM@BH4dGP@eaG`jSq}cBg&QTPYFRkIME7}uq24XqeF4T zH)5N>z{QN~`@}%WI&@rrh1~OqJtlIyBVpj@-xmgws}KW;zF!O^>rhBPG!mpo8ry$5 zl&g_6AF)5*50pp7z=FPXF;KeGzNsixHu6S8@?6Mlb4k+)kG5eSGiXQLjide7e z@q_;6adH5pZb+nlI*JpQ_@9u)J+BY!(c_zobd<@=`QInwI4%Bd_L`EJou|J2PtKt_ z6D(rwi&%e(1qPLR5L5NuvtbnE3WvHoRCl3Wy-1zYSluYlX&s_-rvk;7`xuHPbfx^oFQYZd@2jo7Kb3SlDidNJiW8U~4kRmi^w};TY z!V#Kxqp(mV>I&9gweLqPA3&EDEro8ld4EZ&h8ZT@K7%PDFZ6On+_im>j0~;zP`4ul zL-`#=BZ=x}MM>%n<`Md{?+Ad-{d#xQKkS_6Zb2(*ScmRMvtr=Y8TRBaGW9%xgHoHd zjmuW4ldOaLc1}7F_N7q2j(2AS04ccjZawiQe^zEg^+Pf1n}^ns*Wqx8Mt<)RW^0=h zi5!0KAz2Fc9uk$k#~JT26=bS@O){$<8Vce^MgmbO?m*0PlEVK!jAyrbkYzH|$B zg~!mz)ThAsVO6@-(dt9Ru=~(rIAVhfMa%agqs+AwRq8MP$U^6v0hS5xihIK-06SVq zs$EE?HeDJ7>Xlb83`m8k@F(&zCyUpa^N~FNI)Zbt;pRXekDt78conI z-aWJnt;jd_bFC}Ul8m3zYgk#kP`l z=(tWCsq~RBaOwNPKynpgAkp`Wfn*&D>8ep9^}`V`@ShIl%Ss932nR7o5Zhi`2<4G6 zkX+fmbTN<=P^&0){*L#7fkg@f`6M+~Wj_)I9*QG1BeyBfmi&{HUtLYWAF$mSVe$J{ zfpx-v3#>d57bY)z@FpFa9dlMdS5-K5$@cdeZ&p3YoSIBdy;t2{(OJiHTIPx+Q5+Gx zh~i4P*P~dJ)JEnRiSAeRvZb{4rfwOM+Tf-x8xmZ3|uOf&;2oSr~BPcr$_|zi=Ts&ruXDy2Nt9^p49mKS5qb9ciflfNW^v{=Srl_ zjhrW+9mHm>8?Tf2tNHjeiT^$yKVRZc=i@<%|2iL^F7cn|;~$s!f8^tzkoed0@lQ(p zrhGgk@h=e{j>&3oaE6j)eeTx7cAVP+By^tCQDk)E2oF7}iTN53v3gQv`8a}TPwE|f zIl1|fw0lx7=i{7Hcv8R3$2sNkq@K*jIV1C=#C4ndJ;#%t)IIq)hpL{`9r-wi&7RcS ze4Jx{PwIwzyh`HN=Hn+z{PKMKBNC70QOR7>JHBo<)tDUx>l(6o@ zsgm~ETSLCBk+k0oO+!)JlM;8Mg+s;dt%5mwx@2jGKnWPxL33wFmH_aD+j9ZQJvX2G zkm;lO~byqtL3jdyrjFUbRLDfHUHYZp?~ zWO@~#g;TAt>KRhh&-gd=)=yr?FBRdbGMwih_;0a%)9a@LKM}ib1s`us53OnrjSm1$&7aW+fX= zvdc|bi%YSlx+xpQ%>xM$Q(bh8VS;Ip%n?)FYZd2;J5+#BoA*m0h(3U2KM93*g-`MnzgnSwr}7N*o6m1CzZLvC`TaY;pYeNy-)?^I z@~eEU!gD6SFu$w#wenlb??3px&2RkP3eTzhrt`aq-)H$X^XugIJ$^su_ZYu^e!KX+ z!O!=4g{OkwDf~XkZw|lD@N421=eLeu7rz(zz0B`je#gF1;hFK#<2(;g=ODkW{HjSi zpWhsQi}|hKx0c@z`2CXKCVo5ky~6JxKkcvhTI09wl?u=Q<=4aS5B&D?69bKMe?I3g zMmdI$R>TkZwKc^uBk`gh-%mvP)t6AgSESG5U!6$mZs~22hZ^cKKe3QpjIT3#du6Ob zzw*ZL;MAbwD0E+f6*|*$g3@x&T~p_tKIXW&){o6d-TEqPs6N$5{H4n9?GJT4g|odl z-}pjjzhZEIz4iQ!T?};ct;?_~V2;B0JU+k#1Jd`3{e^_2&L|;xjRH#?=@efeA_z>y z%Pn=x-(&sJ!1%UY%s2HC3pc&WRs6W5ET@KeFyA298S1=C?&`p#T@26)M#qk{0yJxx z(|JmRu?UcGrt_?cD5A4|Zy(I`>1LbUQg>fe_-0jZ$6XP=w(PQy_=r#J8eZB`e0Ep~tMVm$$Nln`?sF^8Li@KlctY9Is)m==kuU8Ix0DCm=aW2hB`nOA5E@>> zE%_4u!~OC>_xUu>!@|>+Ep6fO(mL~{t#?b=;6D3#=HOYMEun3A317>X@I&{@hu!Bh zJP!*`SGKhE!%JJ6FYQjZltm6Hf6E*geE|Hd1)grB)zcDv6Pc^(#?kdt9;sA_m=>v-dq zc8^=ijfJah0YbQ0HwLc>e=KfHFeDKkHuqz*YJRj`K2cOIb`}4tP^T8eY;BWK6!F=$gd@z|0 zzMK#4%?JOM5AM$g-^m9(i*w`V&j(BL!Lod?JRhvc2P^ZziTPkvK3JU(*5ree^TFDD zaB4nSmk&7*XXJyid~i-aI4>VukPlv-4=!|r)~tySdntGOZo%aIdl6ep zWnyak=L8`IU*IiPh2CSnw;d$6eA(MpBn7L`s9dNt7b+5J;=Ij;N^_xcxlmDYE?+KG znhT9{LxvqHcP8kSGC}1Qn!Q0ZL)9fYxDBErK$ADwB(WM)LbHXJ7O-G4#OMtVF=)eM z0}qS_8Rj>HMGAMe3yb9X>n?D@fu}*`E@Uqzm|6{oV>2!i-pnT)+i|XoA6#q{`V6&; zTON`;FlKh~Pw{*vMvDl3UHC8Dg29@>Db^}SzVLYXMz!GY*re9Ub_aVwaAuBE5Int| z#_g5Voe_`2-^O3Au`a5JzvW+Xs>98$ILX%yC%d9jnAjD^SYwh4W7SpzHczFbs**2nn)Gn z*hV*_6PNa#v0>WR|5z73J%QE#zJ0q;^f520wEfSZ>0(AJZ2!^1Vc)L&;$~|Q{+tG9 zoxCbPEaKe+-xI~!>K`&v8<+7f`O<~5*T<>Lk@^@w$Lehd23IUb#lZz}*H93R0uZ+V z;uZ(QIav@57sM5ltOiUtiIZP5RHB<9+>pBiq=rNdhGD%B#Y6Yx`ShfWoy+;>Jh8Y9 zRQ?O3eU+EuR(yWevAFCc+h|wJKI4R~d+17X6n_ej;uxR8-}6i?AB_@sm>L<{4-E22^YQp-YdNOv zdL8Rz*X!EqTR{A?pGhAjv7UyIw`a8Xm)`aRZRBm5XC)l}V)4O~a9jXV*0vw$k~c?@ z)zjPHm&uoIXuCdytIg?@MA9gd+7GOkT&H7CALO2EWad_C4<0X7q{qh(6lrV9C9ls% zCcY5qYX@XzA_&+s+N0xhr3Tk5sn3x~Y$}|G8-^16cGtQsavYMSUSW5oUL#9T6=An5 zo5`BXycy-xfD5>k?8Nd#;m09Yl#rR!4|A_o8QHhECdL`$YUgEz)1mfkgOZa6ki+3x z6~7I+7CK%CQ-$ds6o!`Bl5BoVOv+Ob~X7ke6i;0mpIZ75e2@ zZGzsPeC~0cG{4gGj`N($Z$7^!em~&%JAP`u7W!WkM{%dJk5n7bZ4Mce36eU7MAtu+ z;5H~FlK^^CWmw)Rudo-#pEI7EWlA?}+yJo2%xucZ?|VNj^w2(PBmHlf7lK_!-K6N{ zg;j>R1fsEoGM7~HlX#6;(-R7LjcH3uTEMMsH<<^ZX$jYBlh-p_Rj$pq|lX_9EVD=#&*l7@!^Fn-ZgsZDK zj`t)d*E?RTlnKF$7Mex9^?pRLvU-HXKw-W-FXf5keB|zS-xf#9wK4mYEsyWvQXq1gn7tD7 zc$)$&hsD~AJ<9$fCHX7;mD9b;xg*+@nncTWt1GY>OR88S-9*mi*iC#UU4ba0T-p2E zy&~d!Mj2?tZN-DJO24gp?>eZhexA1CiXb|Widu>I;OP3cN2|&=A}QB89^n-VJn_MU zI2_XA_ed1WBbB~c_H?_FJXS)vgCQ|oS(Mm~XBZXqs$i(&%@!=#hKe!w>D!bZYjx{^ zEH9cd z>I_$U6RFC!UEVi$>YcQ~>Pw``CFGM(iG+%x@h;W$W9S$?zSVm$@n+&+tDj&wZf3Px zgs_TBX-HOA4EuR-IMVaxm;55|LRLFojY}5OoG0_$$YPr;=u29tk7S0}}BOP7T1S)T|FDiPB zrPC7)94Op>lezvN+)Uf9ciIjZt=ABr<%QQs=xu{OxFT=sB_v&(!HsWXuySmI5hPw3 zAADylZi7n3c85A%X&EgxQa7cG8N|RQ>2OBE*S5vbJ7*nqM`9L!85xLhX_wwv8tJU} z;-L^Pg`51d?6TvH;M3YIO)~4~aTXWxnuOn1>GhnUOSj7m>+zUrRN*vQI6GP!(HF(?BwPP-$b5>Ty%q7W~xoj|IuG}H5&->G9V7^Rfw3n8{ z7sSlT)#5^U!DB)rB2%!hKegS-j&f)RX@d4WQS^nAccG3wk;<%n7``?Vuln$NK050A zt8U?f_3zq)GyK|vR~8$IKVkrM2T@->Sd-LOe>aD&@B3#Sn3Nvn)PVtDeJ&`)9eOD%+^3EAWPN=eThR+FA;Q_0rbA~_MIir{>&GFvTSTTHflva~V`Zrd+pwaqW)NU*{ zf-%-=`>49F;vngkCU^Rki!*oJ7%}*Q4s!&p4Z#VduHp;0M!)=u{1nR0AEEYx@B%V_ z%IPCD|FVH95E_AYF4VI5R)oX zFnRFkyKVV*q<_lkp90T{&V(uKpE->D2=wJ-&XGs#pYoBv-^ID~q2D|EA2qF^rYt=| znldhF(jO5LSxAqVkFle@(4Xr4)AzRCM08%Mk3AaE{jFb?*;*RkHJYxA?;bt2k9fGW zh-G5zR<}3DxIO8|s}dxMp6r&D#Xpd=`WiYVbL!Z(U8CE!>}}|zBI(hw4V`69*S2lh zPim=;?q#*u#Ls!+|4qB)vx+{ko0G{YbV?y%VgF|PM@If|^q+J5L;J^FKZO4GGXrFN zj_`f^VZSe6JzYcux%T4gQ+4ta0*WjVs-vTUoe|3$u`2>>a}%i(;s;J?{fM5}gZ=&P zeLGl}buGf0+;s{~^&Q2h>vYqbUIqgJq49kG%UPZ9?` zW4G!|4RcI1p2#i@W5I6imYHtXvox^KsilF#S%vF`{lC}kzwEMGlMPe>IP<^mJ^KH? zk-ztj^u5rZWz;gl{7RtbG2-~wj{JT5VZWEb%`N@eWq&IrWtV;LW3p3H%YIn#X|pnI z2STmmK$BzM?CxqgKDCPXZ3k{{y-|{6u60fCYF);JBJ9vAubN%Fu4l4AzY3_J4yT{`)aI4;VF%z(yr3YfRHIb}TyxA--B(9LAISc_( zr=bji@B(T-QYcT^D^9Yl1LCdx^DH&~mg8JW#ZVEIlJ_TX`h*nOcVsDxHOlm|g*icd zSPfADj@yusL&5c7wlZy>#P3IEUox9~WSh=j>9o zWlF79!*&vavtKRaojJ2g*ngkV+fYJZI6^g~X$UW>_|=FIgC8=qh7dm%NrYm6Kkf%@as7>5MeB*APJ7u!%eKgE z^dY-P+DAX1jF7N(q80VKlD5p2howR72c$0i5O!xpaEw>X`fb$wbV<})S{^l<)&6)6 z{u0)!O4uPkT78=e-ct<~q24iU@fr1JQLfCj;^q%J zez`~suFXpe<_udw8H;JE>-EZ174$)kuiEA3_ropa1)ZjLq#J7hH(5Si23TR+A$#Ip zGO+UD>{Re8(`D*@8EXv!;Yvc?_1jrLbNJ*6*verz8m-r3=EUko&Z1=syeb#BMal8{2oYGm3$4 zwjYE+BAASHZ29U{c$FQ~@)=5M>Q-_c4#06^y)&$Zcd+|RFEa4B&73Kwy7VaVz1@r` z=`_dBw!u}C?MZoko{ejj@SK^zC+i(g)Ejmg>!Q6 zOu_&vT`;g}M1r|+teX5(>FkQ%-@NjD{b$}j@Zf&z!r z(?&IiV=&3`K@5;>WGZ;PzS+rnCUPhxW-$UgqQRX_6JmIWh$6Sb>-9TqTO7p%uLiK_ zD}cn8eHDiIkxERfuWUU&e%%td`(CEe*PfdhN^=QP8Ge)vZi{hO8TCCqchYpo+> zRGBjI`-(6T8*io4z4xK6A`3`%S}PQrFEStmg|S87=p!pmu~|wMGK;NmtmLBz#{-Go z{z=bA+q=6_8@0B^d;^AMR9#?K%+b-t(pJYA@F}mz5+5?J?W~oTA|5hCF2uZF*C!aE zD_7w$YeAKDTN~v@Gn-=Of~rZ+$E-=#^_AAP!0d@Lv*cr+3~!MtytI zQi1Ke@dh;8o{IP2KaVlmdpdY&`1Zy(2-u@<7xU{74YAo`m>7BOelMi6_e z!Mj5ZnJgDTnv8t-aMewDMUQvAqnlqi(r4pPq&*Z$S9GEtf`5oa@}g?JN{=TFq7{iV zW-w5HL`Kv)$P{ST;|EH#_|3$7b>U6n8x$)kl#6W#Lpu5Ik{mVHbql^lpxwIbf}NQnU|ww4Oje*l3b9BHEL=dmk_iEtEb_H60d%% zUun6f(fUJtKS=iz&`Jbwb_h}4Ik*1=0a14T_v-^mwG3cB7C-S1-7w2ugyl%jWp!?85`}gHB#u}y!?^_0(-+=dduw}>xF^W z=$(BpiolQFS$mxz13aD@nJHW8n2&`~16H7`IbESHG!seAPu+b~+H|sP(QaaYoFZE{d#>oIj{p ze=UNgh^>Px6IFW5{`hBqTd7{DgpN**sb9A;EBi`!|2cK^GX6iRoN=S=8LqLu@6coO94f~AO?=1D)1~lc( z3j`V~;f(+A`qwq6@jnCvAUHh>0psugh=PCyW-Grl{TbG#x>@!_x6KvT1(B+T<>Q)D@>TNA`_B`>&>k!n3s}~~psA1NyK?-w-EAk?y2k-3SEh<&UruY-( zB%69w>No~CzaHhCSk1qrP>mqewo#ZUMtLV2=$LTJ2U?FxZupxVSZf{ku^Jg@zpp0? zC!jIwDIxdPw&Y*9+#_V~Rx;GBSxylxrAoG)x|x(PpWMYK4n5;$e9LLNHM3F=%$%qP zH*4{FMcg@$MGR&5#v1HvUn6(?bkfOKrB9n#*)(2{-wemzF_{7hP9#{$`?kkg1mKvx zwz^F{5$8p%7XYedbaD-=;%|9dKcf$%jSSv%pD^M*emK==yr(3+#z~bViKkj9Gir@fULuoY$uDoT zhmH_^oanDR}?n%xFQs=2r$mSec zmeD)2iXs`MTf5Y#ZD}broIyr+z3s6Tf*)E(2mh_xh1=KFxwx_DR^byT-7d(Xd_%M+ z6z|`Sn=Zz+syDnw9b?DrvI`|1GuQSy+rF7qhK0(&qBT;0Q7n9BZ}?Wl1OYkuXBOty zH`R~e?G#q-=JVY19uOK%5~KFVdHEi``kcwHM10S*p1!gFX`d(g;ORnW*pw@UgTpJOu@7c(1f^RpM`uA> zy@^&uI#}a}q&6@Ob%Aib7-(16{%Hru`Ug*UeQc$9X;0?3(y4EjYVc zn=!i@-+$)UUf#$@=GUg86UYHWk1EoOY^^*ttpVkX@HFpo|9#$c(b=4Jt`Y)fsG_MV zgf~NA5Q@}@1q(((Th~QMFonE=8~M8!q^o%!+}m1XHPnjOB69@kW;GI2^>qwVJSU29 ziJrH7qTUtl4V8O|@vJ-=ytU@m#CL1Kxin{PwMf9WldH;V;GjE1HIsQvW}lD5E>vrA z(6^NY*xVsP(A1l>#aR+y2qvICl4{`^n4}=@V~JS8jS9=Xh_XR-amcxdayJq8BFcJ6 zkFS)ADBp6jRL7G=AJ>3UTN8Iusxo~nR4Z2M)|?t3u{?}~9yF?v0Cwrx45QjYHFEX_ zqKKkGlcT*{PF8Jg=yTfK&@XL<*v6t(s07!126@?+hRR7>kUaAYnE`!9Z#R953XC9^ z5!`BMVJOApOR{oI6?WRI_U~%*uC&61v`|}fg~Ygivcbb_Q@gAG0&tJDS-9}f_QA-MH#2=^TnGktP0YA#)A2bemr^o) zF>{I;mmNN$D|2Z{Z-bmfWx}1!6)|M4{Gb-iH8Jykp%6U!d4$dTcklrI?9G-*!eOB= zR>p3hyDj!3YPYYhxOAa(Dy#vj5ziw|y84TZk;9KK4x8;tE}H2k$Si;bR8Shh{^h$# ziu=hd;wl~zoye0?BskSgit)^zuao{B<&7dY<=yFid?HV`ymQ^83wXZ&@=C}}d5^mv zSMhYqt82~cga6gUb$0V*e$OnUtY*9Z^1uQ-Z4&jSG(n%o-eQ7E$^~_sJsfN zybia#$@%iaZh4pgL*vExQ=R$Yn zLhEy(J9DACa-n;2q5E>72XdhexzMAzP**PWxEp%k@~hDQf9^{Kp3+t;{f>B_+Y8on zz40e=ebb){J(~;d$c28J3k~K%FS#M>f{6&h;=-41-wmNplAiokI+H1U@h4u?KFo6c zT=F}-QgTs*XRPROs3N5b^~P@?$g+R4(Hrl|23;`~YII6smEE)F)#}2qX)tSuE&MCa zbuU<)sVnYf#Yfc*3ogM&CvukBHCR;CrxzKhzZ3RJcuQyL*sBjOoS zt}1l8Tj*4`(8;RMkB(RouuFG zqpWWt{_4T{Qx!K5Ml*5~$EB;4F{q+u4cS+jB$ep#O_f|kK*J#$t;Ildb8)=)V7gc- zWT>+=+Y&Mz7Qf4z*lmx}t?eSVv)&c~C+6MWR$stzu zT*^7X;`7|8S`+#rQD66aAKvj%?qDtV(a7g_)(c7m%ORWlfr#-{lZKo|W{(FsE;~ZL z?9m!6m(M9Rd%kvr55(WQI;NJccpE*kOW~6<+u~b`L~imtCsqMY_1+%We1&k)A?Jh! z)zF;&W`bkCXkZg&dX3_*pwdH?>ey4AM{v$}n1)E5@!pJc9uZ3Y3GAT|`@(k^tjrdx zdwWu}*Sm`9WuOWGT)m}rkP}9Y$-5QIlJiD&*yz+pq3(IC^d;a7>$-yT*lcIN1iX^- zFfdB*(?pg@FVTF0~0sRG^Ez}*sf3z@{Jz_p?s2q@^lBtX9UPBfHe+)G(>J4iRA>n#t7{VA9NhLQj zS+t6HY3fy3c%*-2&sWY=N$H&Mc)eI#NUtCkHlyX~FU_(#cB*4$Yap>_Y*>4Uqo8~H zt?qDOD|wN$cPZPU;Q;GYv^<-eJ&Y%Pb~g5~hkdV(4yJq_(eCZj1O16T#fxP>htYp*%y13F{&%$zwgv=~zQENpP9BWn zuOm1!thbprx;lU~W2=ze=1(RK`<7plrBRYHNNqUmTy(5DU6gZ!w`uXW5;N6DcE!cc zhwiy3r->;qqo<=#Aw&m7VqWY}~v&`qtQH;R@_ z`lB30DA8He{x@N5BGwbK&f-%Rp;K}m3hl}QYW$OquPv5k&M6c>Becdjd&|-nIkj{S zwTE6pytBHEs?fZPT1PjcBq$0%JEOs8wfOS@h)m@+Yph%<{4TlVMtsNiY+xDhMRr(< z?6BpNsqYenim&IjoRiixA~Ho>L zt-nRBPg?UUjlezxfri$wmsR~NBhVki{EctEC;5r*`8~#I_e*B2VvXwAPGnPrtHV9BfC z*5+dFF{DeaNM#^0G0^QxST|N0w)#NIjM?%3BwyghiQN1{P{wiRbLz^Js7xfIe-?97 zkxC43PK*Q+;XrT9r`i`Y)dPv0wt6{87n?S!>0*FgMOm}$GANL$9+79*Y@K+pt24fy zHwIdY5aW`?y>V%k*K=@7r}aZZo$(*=pLR%pI`@eYjR*!5v5| zvP35HSi_#>#gpLaQBzxuEcIJGf)Sgu`m64JWr)E6b&GK)`n6pCW{*PiFBc6>xs;*K zzYW$x$mpDncL{P#JQe_n=4J9j^4dquR<|8}D5T0I9lM9@CY@v-)h%V4vn!3>Pzgbg zR?hLOQI6p&uU3AcJfr1W`OGQ;dKD??791U|B_$*&AyVc@${bP_A^_)aac^524=?M| z(K^a_D=Rq%jIXTnWbaO@j?y=rOs39G83*?Ur4sTczw#HQCy2_=+>#AajA4y6d|QoR zU-Kv<&~2DLr>hGai2S?0q!GU2D$$X>47qj1w2P`+k3r&GIZdx=9YbK^G<|Z*xpJc& z>x)V*z9QgUX|GoD@D(36FRGR|ENznA)F&_QZC5Q(dm`zb+|G#3M_>zh+ye^s8QRRm zknPWt$mdUEp-erCNj}-1A)K#CUMgFe0Po4M9e&Nj^QZWQ5qFrm%t zgX=~0zi4cqJbcc>?>tZsm&Ee1eenaC*3tLXbaLf$Qzl_0;KHidG#$fWM{Yr*<3WGP zlM;Vk|u?p*%XBw^XoVf>HXgNP-eR>YZh-V4w4y+BT0kdsCL*g`mOF9!iC6_Q&18Ob; z?mg(2aAn-SoZ~3#(=g^sp(V|nAN&!W0&wV!ZrS&Q;)a_InB(23;Qah5u{+Ll1d%}oxj4)%3&sTOL5X0`f0M#~xh zdDZ1Z^$ltT3#6wSt&~_WSg$&5rLE zxBOH+KIVI_?fM!{2*zq(BN zL+z_}w$=;6^rDXWr^88kVL~)*Xa%W7gGC_Ep?WlbL$nN z{XA_{>wIeNCxJy1s6vf$$mvc5lvL_G(gqU&p+@LFV;!Fxx_x8HlrFj)r7KJH;6TDhNVR>R&Vh z+hg#ozW!v{H`pW%U6pB?UL__4r zD`m-Qla%=5bKF}M`7t)^b{Vc5y;k^?)6ZbpyomdFY^-)bi&+3$7s*_ce#U-GwqTr) z2&qtG0hywkX`{33s6J2LJ_c*B*I(pmX=z`O8DhyjH)c-CUI&Yri^};`@&kz$)$n76EMkT% z3h`rxT)%+1v`ko}Nw)DGcVQKpxz zI@D`{&=0jZU7kZFg=BfvKeZmuHQHa6;=qG`9td%EwvKa7E!rQK7c3uE6iB`)-N=SX z(sBz5^mnC<2t?p&Ruh)(F3AOXUg)eUYBhm>N2IvcS$picD+M=Yb_m&qd~cPHtCBu7 zLbF#IL930I+N#TnQ182b4m0ceIo$YyWO-5sX%bJfRZ$Q%T3m6r)doCjoy!dkP_R$R z4!kZ7zcJ`5kzkLuMs~7>D7cChG3otk_IggEkOd5g3}iY^uvoiSN)6G|xU#bpSnqLQ zbvEm=GT!oYiliFpFUCb$a~DBb=hv$wXJwJ4kiuAK-Dz^4WTMAd2U)h9iFhKLGogRW zfGKK?V)rln-bL2jCGards1V4x3%m_W1SA8U6UqqHoz+rGW;a^cv#Li~hPf!EIu!#~ z$-9fOEL(S$({5pXrp;a%($;OZHm5{EQEmjvV9c`pXVE=kZndCS*t8^1Sj(+Nw~^#J zGvClB3|3Pi1yR#q?e>V%Y^IYi#bf(TsT_&84jO#@NqNhzoha7=c1*3bvGrH~oT2DuP z&m|izzbADrIdjXs;3~T2bU1h{^JnGIH9tEIToPTlz9VEmkbE0j%1XXa7WXf!@US)f zG7{a7v-B*_^bO^QA@BF7Da1N1vq>-+J}@TY{GE-{K8I55&%l&03y5H!u*?dprrqdi z8WWLDuy`GRL>lhVR-Z$}njH$xHndfzNw}dl&`=lbYnm3e8e-Og!1Yr>vzqu{_M#0N z=w%ipr+v-u@m@duwCh8sU2mLreJsl_#ZV%Yk>)%3MA^u42ic0N$;?A zys42!mc``4AXT!;he2v^?5G$3w~l@ckUZ&WQ!?pu#HnLQ)IlkrP8djgoy)4u6Mf$8 z3b75#l?So}WcuY6rjtn)j@dQl+?avqEo*j6bnVAZ!Ck9Dfbh{y5GZL7G%7Q-9!QidbD*k?BjS&S&eC&e$eC)Sfad8Zw z6y2UIbHaeNJ?T;5ndO9q7s|1c$x(um!_aU$i7x(?3j^)$$Kf5T3}h#U{Z%$rNr!c8 z{ivnI6D7&VINugN5tf^VkG{{F`Yo`*_4^V?z)g-|8m^`9LskRpnlgs-CT2{E%!ZsE zTo^q#h;8d7tYcA#$^WH9Yc{Ron$RxJRU1Od%cK$tAz}z!9xDxjN4&lyeX6XYC#crU zHVC6t7fO~Azt2n1NXNJ{YOnEosAW!UT5D~~IaXsGMVuMbv<5AV#LyZWHXEv~`E}7i zKN8>CWQ^?AT<+^W(c7>@5Re@rpD#JPOBjY)SxW1KOA84p5Q*E6+rfqM40ltE+=6>j zVoRQ5!gkMI8uM}fU!|?7X0bvGvNAd?RHdyMPb^~5WphioC=)hkmqmCN_RTB@LWXcA zC0tl(U^kBOs;f7+#m+WzcCS)r(P^urwJdD5RmpI#(f1Ie*UmgUO1M8GxBzSVOu zBlix+4h-y3YQ)~<8Xx=A#~CJ>_7I{x%1epy-PC5{vf*p6uIzNV3sPt?VSAtSb6pfnSNSvY|Iu4B5J1V z$(g)fuxMEJEV0V2UqU}1B3x>8_;HcwErS=&Za)zeaXTJH{Fjutajz8H^3Fku6$V`E z*h7NccZdI0oHiB_?Bc(QO+0f(6+yYzLNG+|U0L1D83u$DIwUABlLcE0jwyyE1ed`G zty3jB#~ZzBzb{)Q;>+G1V zBrh+>ijjO3CI(AFqaDuutRe6IjRvWAvinOPE1N~xqq*H2E@BIfv~C&Fx^kp-j9PP5 z)Vdyq7>Qk;XAjLc>}#uk3Y)&3Vy1LymqMtx=^CM=#us@0LGIm0{=)Aye*4S_&5mHk zF`_NjZjKyJ;8cER@jH*-C(X#rWSs+bx#1daZGT+KzG9OVX|Nh+a{s}K`~i7sr%^0J zhkpp?wZek@{$Z~0E;8~V6t2Or7p*TWl>0&-j@j+M6+WGAvypivPlJ|-V~&;9-t;kH z>l@dCk=8Gk@gKzlQaOUKd|_*LbvUp^*w$rSk&-&|W%(qfQIXYeu@bYad9|5YfqC3k ztzyyCgIk*RaD2}-#jkL^X?YczHeo9%rKc+m?NPkw`XJ<}X9Tz4XEOZ)J;VNZlPK3T ztqT6VX=%1Sx?P{KI(i2IL+A$t!fBcLvG}VTot{W*nYPvwtYF^eiK%gd@orbxD`9^o zEdq0nbzh+a&)j`n*c`h#P2r4sET+%WwY`nt$55CBWh_qrv2SEDN$?qTY8j}jGxq^ zrWv{&@dkUEt9TX#dzwnx-}O-RigMyU;vXf>hs#gQwobQi%$P@KTNgG@OHHKhRH3cf zi#$tkL%ZeAgktuZ946i_XqWsR%a^%EaF6Tk`-?DBd#j{pFg@oqi2BBaxs|r+Kl$Fi zz{~Pbjv9fqc(ZoPH%JT)XlqP)Sr5=n$Hou(n#QRvVHMHVd|BSi$S7=~0!G+q?-fi6 zTYCj@MEJmIc8?g27~mw@$ZSpa-{kiQU7W(VdZt(IAL?S<3=Yo0Y&$Y^_6m@S{Yy(dQ!?DwRF`frZvxl#sl~S; zvDWQ|P;UI)`;BmbzHM^7an?&;qVKr>EB71S`@gX%2@HeDHODO?<9Tw1S@vDQXs76K za7WWmA07uJ!S3ZBw&3l{;#T)SGSiLmym)dBsw=^NlZ!u1f3&z5*&8xvyd&0gM_COe z<_y2pP-e7mVg>hzx03cAK@B7R3LJ~hpf_6Y#O!mH(iXHNI?;~dI0vo1--fLnVI)q2 z=y|2}%o8XVqTi%^$!#AD?7+~x*W3&0AqrGSN(rdgJ4bug}y}ge#~L zxmBQ73B}n2hDZ%~`#az`VvnGj#+Qr84k@>@W<$q95%W8uaGE`E$gU7-{2{7xKZQHO zjuYE}V+?`|JnEJTcUC8LZyyvHDZsZUq%&vR6S;Qs$1zdgZ!kK;spXHZDaDAQevE1Wwvm^Qdt1CESdj})*G<^R=F|92$G$?SPy z{Lss`!ymk3-rlHh~BsdOhMOVT0Y82%MHND znORqQUQ~Oui;vVw6Wkis>UTPo{FkbvO6X9QzUS&I$+TkfLDgqMNstvC2$q zDAzug5Qoyu2*x^AQeCg5)F1QJEpw_nnd+Q{iRvz=Ivh1)*NhcawR4MG;Td`QRZ!m; zx4!f^`Oy7Js~<4esWO$Zjr!m`1wdE5b#2E=J@{JFN5tqt1PK>Jr$sge*3+3w>bzf? zsP2)b_A`N5!fSQxHBCjFTPL23<|827Bwt~zWzvJ%7< z+zQ1ey(PC#n%^d2ehe5!E!}r8KM2*N?s*;bw3#vc81S?Q;-y<|C|ND(K=g|d9{2l}QZeWCG%RNAB2L;qRCpnaD22>2(Z*uU^`yW%i z?}7yg*tCfFc0{k)S5CtU>|-z;;TRj2CMFxco|tcwwKhKW*C08jLxP>sKh4!qyS-)< zNv4WR*Wq{TC0<23*Z1=Xo7EFCTj|65WmyU7&|UkS@HKcf;0inJDLUvsVVyOcX#n2V z@J=vRu#C~dC0a_*?;eG@?48sEP zm2h0?ub{KWdy&{QA5Z^|0;rDi&|4>oU82=@$#v#))O$~xdVkE2_a!h8>Ern9#39K` zgs-p?NKr(|nEM7{s|+#HTC0t&L-g(I;d%oQyxc0izNK;L*2%u7V$%Jl>i(Ljy~^o+ z6_@TuKh+=U{DJhnZnn!v$Pm;AAN`H=OY7)NH^i-FT&9=4e)RKuGO54FR)UMqS@jJ$ zL|9KRh~!*W$}DScOnEZ-$Zy&Bw?8gxHN1;hw-7V$xj$?xygJq2Mtqa{f_yz6AxK`H|*8YyoVu(9@RMQ!G~4LeqACU zJW|Skx@rK4h?#rmn4zNt-pLNHefKZ?S`vN=u#oTM=~kCRHA zwBuFUYonal7-G`avvUotiCC+oby7vd`i`_&*J96071Sh~pZJ{sls=Js3K`hS-sEK7 zDH&aG8kasX7EaF^h@#Hgp=hO$)o?J;bfWBBx00Ue&c9i!b3^&h!RMNYH76m)yC4NC!6kC!xRWljcAU6u8Bku0Z7xY<|lLHoBuA-?YG5!x0x`!_6~4tWdvl5~KV z%}(Re1Cw>@(UYWhRMk%k!$zDLG4D|cMzKr^h1%A;Vbeb$(s{>8YFgay?Ny^JtN8}W zgt_&Y?f1&^t6<2lEzlunNmmP{?t2>8r^?EoU*2UEQRGUN3txh!hePMTs;yol7|yYk zOy9<({gWfprk>C|#>MuQYgJ{k2I6kvvPEzqPBCk%q!?A3RFho^X?%xz!+@|3$!Zkr zT|rwrR9p4?y%BTj2~pM{r)kvb>FKDH=6dAh_>_I0l|Ego+@C6G!K#5WmX5W`k!u(; zpU|^@fjGD&qSe11>G+MDfAvWUV{B-vpO#5QyE-<@Ttj+=4~Ir;o0`pV=L{EAA1{$z z&BbA>D_zQ@SUy=hDNH5Eiz@067r}3r!jI}4$EDNddBISy4}LwN+shn*#?@3nGi%Wy zz8Q<9>7%gsd2?~R>)o_3-t`tB4+>P)HwCRSvh+9yfZvcf-DTvbfZ0eJy%Tx3CEIB?nQT8489Bc+NzXTCzJ-oz~iK3eVtUzYUBs z>e=oWyvU8d?bjG5!6-05Ob#v`fa%yC4z5xQ-Bg#)2%9P{xQ|z(JVq?;T_qR+sqs%p zk9JFv{kE`xhSlTPZK2bwl-lp4$2jsEGBDy8PGchktJJ`T|A`p%h@IFpbk(X6_v*-^ zmVbE2cvnHTuV>Q5i*^lQJ{uQJI8)D9$Ky`={>D??-=MUX2#GK&YLuk6Ny z#x*_C%82hNPz2HZ!)?59EPh~Gcw(h>kEQr)(0@|j2H~>s%~3mAi*--Qke%M0t@dU1 zQAJlebd?>#1J1D7jcoTEMHZwwUL`v^-BOlLl-y|h9(_{6QVCd91d8p0zW(eN*u1)! zRj-1r1*S@Ue>Ln6ufJkXM)wU2k&i2JP(s8(Te*;o`EgDc5P^?Ig5-#U)?P3~90Y1i z=>vNvD3shU0-DZo!{U#^MQIrU!3R)8`YqsRAxZwJ-JJ`cQGI z(uKa~786y()T>wwbAvFI5p%t;nP$ZVMM~30XO~qKr6SH|oK+PGs@RE)nQk=x4tqQ~ zKNDeu9(;cJ6r|GD^WotAYR`6j!G4o9FZjR{YXA1Pu<3-bu!p>Z4gadQ;H()Q87*AujzEvOj$WK8NkkXJXepBLf(=ui)<;f30?%6{Mb6m@1o2F$JY+EMaxA)~WrbucA`7XTKZuZN-4%L}-!h zI(>UMEr9y!z7)%G@Mj8xs$BxCVhTy@h(Akx6$2_Xm`2wJJ5+C>zT}g^bBJ*xM|8eT zje+N~B$zw<1r&Hk^AzTV^mmTGD$nEya9X$ar;iZ=Odv~uwfY0>ph9}!?RW;d`^y5l z`|#OvH#4(k<7atB*g9K@Ny^3&?CezNjTYNFo85m1<#a(CCuGcrhMu!wIFxc;kdt;P0xBzm z5Er`or0gsxAfREYbOM%P6@TbK_cVoFE9XjL?<9MZ7yas;;c4G^oTQd1 zt{6%2QkH)LLyRC%H@(rN-IJ}gm9jYKW+NM>xD=6kiTS1U1UO7-lbV=(=rW_Dt*u5@ z=4sz}1KH$FQ*rXtKXRP=NEZp^+A3l2r*M>ezX-St`;50Pz|L%LytRkoV(OvMUaojb zWhWzS{eihLklweG!&K-yCW^)I1B?Y{@p8yFkQV00x+XK9lESRVj z9+mt9X~`e|qgPJ;B=2m=3%4d2q!2+>myuOxgZ=E2W@XESk&qli*j;krDoN*%GoGP! z)7f@A_G4%!3`e{ucwvAF zVXI;SY?s0ZMW1_POS=?n(Y8Tt$Xh-S?+kN;7=`_Mhsr3ji0p0!~72+u%s+ zK87Ju;qdcsdpb@~1?pCta3AdI2&swFae~4|3rqRxBaFWkdtOF78 zeTtvWj1?c05)~%v=4dPKV0VOG28%`N*~Z|h8wYZ}zd+=kn|hVpQ)ZROJ+o3zbzV#V z4!a3gF55QF3SO59E`{Ok1a5Cx7-IcQ*xHGu=6TgiX4(~F%rf+3dM>c1-qvW}~p8US4i*`5ZpK@%KkDW13I3%Bpqq+(x^}-)M=naY=d-Ychw_+Y>3D4}F+T zT77@|e%(CJ+GY}Na-48y1dhZmkJbDfjWd;SG{-LWHn4l&Ba;i{R!qH!_3FⅇnS!v(?y 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

sHAWTyS77Y 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

5TCU(G(q`wXp5>t)xFAsV-nK$!-1= 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

x>7+N$lCH7CNx^Z$)@E7s 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\UBEHk39VWs$KGhM+T8co(tw|q83&& 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%0AF> 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

TXl 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 diff --git a/.venv/Lib/site-packages/PIL/_imaging.pyi b/.venv/Lib/site-packages/PIL/_imaging.pyi deleted file mode 100644 index 8cccd3a..0000000 --- a/.venv/Lib/site-packages/PIL/_imaging.pyi +++ /dev/null @@ -1,30 +0,0 @@ -from typing import Any - -class ImagingCore: - def __getattr__(self, name: str) -> Any: ... - -class ImagingFont: - def __getattr__(self, name: str) -> Any: ... - -class ImagingDraw: - def __getattr__(self, name: str) -> Any: ... - -class PixelAccess: - def __getitem__(self, xy: tuple[int, int]) -> float | tuple[int, ...]: ... - def __setitem__( - self, xy: tuple[int, int], color: float | tuple[int, ...] - ) -> None: ... - -class ImagingDecoder: - def __getattr__(self, name: str) -> Any: ... - -class ImagingEncoder: - def __getattr__(self, name: str) -> Any: ... - -class _Outline: - def close(self) -> None: ... - def __getattr__(self, name: str) -> Any: ... - -def font(image: ImagingCore, glyphdata: bytes) -> ImagingFont: ... -def outline() -> _Outline: ... -def __getattr__(name: str) -> Any: ... diff --git a/.venv/Lib/site-packages/PIL/_imagingcms.cp311-win_amd64.pyd b/.venv/Lib/site-packages/PIL/_imagingcms.cp311-win_amd64.pyd deleted file mode 100644 index 17b226e8d52f158a1cdf5a70fe1cdeaf15facf30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 263168 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%0DNs`Y_( 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

Bc3J3cx+CnZ!8dl)01i-t<>1 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≶tpxVi|l;5-D>FeK2J= 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%0DT>zG46Gp(=vMLUhK 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%0A%Orj>8LtI}jyX%0>+=ll;$ z`2Q-coSoj8X@Ys!^m5hTK5u$?!8>YJzD2my=mED(96X-_kFsKwlq!dK`&?MRFOXFI2?NU(w{#kdbz1vjmXY5NfF?@i)qCLdl(02E@}98wWuyKU z2r#^L(Dzq4+w~(yDii;J#5Q&N8d@SnL6blt#1`_tFn?|^c7(BfKtpQ;A5su*%$fD1=YAQ3z^lk>6IMS z-c2_UT9zA_l+pfVqqnt&hUeG$&-UMAMBd}9Y_8wiRx=*kvT)oP7d{oG+$nKqR5$|~ z>~8FG?rO@e9fIT15RQvUJvY(K5fHxb@?$OjdxjnvHZPv7$}}sg*=eE`aoOF5vcC|G z-9}wu;A~z--WA`c-;JWZe z5qzHqZ;!k1CM2=@8@u{31(D;J4Y5be+SP=Q;th4LW!J59FROC-7RTfqpMMCpEZ5R) z2(oSea^_;iPMVt=8W){u#=cL&hP8`E8lIeFn_^sJQAvQYnW!B`<-3xgBnBsNTC2Xn zi;jj9we)uu3rj6AwN#O(nz5hgBEPE38y$=41gj_#hwrhdd{3+#yob`{3#DlV7Ylyv z^*KFgo*Imgn)fEir2+rnYy1+b>6xGrXhGbIhJs#fU5ZX^*;o>Bmj1r!%5e-`jL=>;iAs?DT zV>TiL_a)c*9cvf(%j3?x4GF~X9Lkj8H9E>~RFXBl=5}oGd$-i|3lN&7`$*p5bg#-G z0(5ylFEWt#)6g@_x zemS5on#w5U;&W1h{zdmVjV14LLn#!e6>PyXwPv%8pHJn7L z-4{mp446BKHd5SxK8x#T6~~xn6z8(1*(dWZ#cl1RI1Y0Fy2~V@_jT%crcB%)3k?uA z?L}cmz7U_@P-!GFbHe7Igc?+uot2>c07e{s%l~Eo)!e|Ki``t#fOoYKoy2BWpnWz& zCZZRV6B@-^u7k4)*=X~r%2(Qkhs+JV=VnKH%b?V=ES)d z4T5BgukPkMh7yNw*d0d0eBKf}F@Dj0zTF+u;dXoj{C7BcJD}W&gu>@&#P9gr;pk)# z_8^3we+>the)IO?hp5)HvS3GZ) zT7jtQLh;_Lq~>Q5 zHS_i-&G|5I8^LqCg|889XF{;e77|(IGq>=5f{|S1eMR`2-236*zN`70ulY=jgL3Q8 zF_}#w|1!fz7=uVZpV&j7{&W#hs@6$p5%>=@d=mE(NH9!VDaD))E3*lPExZhdtt^Z3 zx9IW%XY(rZp5Obz+y`W>a`NJuB{s97@YkL=fDda0!#WjMlhv&qv?;( zB-T%n(#pVw6za@5w2atjN(-E}E71mMi|(Lk`5(q`1!cJWI44RC*A5x3#Tmm@W)Ih$ zeT~;ehZ-+9E(oCt(9($EMqlI9=NLUAV^l`3z9Yu8dW_x!vSo~ddW_Cvj9_CFs0q-? zK=laD%Yd<;4#g(Bt%zlU{>sAU*Jg`~0^vpy_6lU}QCPU%sEm)Vk8U>y47A;JdEJ*jTb8S_2duB#acNoq{E9?Fgs z_*mQC-4P>+i?U`SKJ1&jwtIH6-H&0g)q$s zR>n`ijZvFI2a0NjJjpm^ZF-HkEs-Ha@YzULBr4^|T7xwGR9B4pn@RIgGoz6ena}Hr zoQFKME*4kqH@)38U-z3I`%Cxv=$GKMA$|l+x?3&mTtQ_OANtIBsPLo|>A>tXs_y)_ zbEWRg_}jq&pyYbh(Zu-Etd1FZ{bTbz-H!OR#L%RV$yGXd#>>W%vlZfCCny@j>D88l5bv;8TbsSwej>)tdbKSs>#^DdBOSQf z)P6&&0`6t=qJV(For!Bskue}PD64ohgNa_9Sw78MUR^U#qt^1--38|4%f@VMSj(Qq z@LL$Sd=7%wWkBdMv-~nEIyAVR z$G1t{7$&-NUf?;d9bxY_qyAr<5pe!g1S05^fDD2Re8z~H6`aJ^zQo^qN*jIVK40nXfEQ-DqK&0XND>3m*bf|v4xj(!H+6&2cUlKfTAqx9TXR0tZDg+X#oe(t3$J)vt zvbTUy!#!ikE9gQ%9<}W|+A&N=;3fW4ZsS8h^n5BiTLT@k9PJV$atk3qJ%QV$2uZt) z?EKzbe6!NJ;S_2CkHTP6QBc)T#$Q5g^OxNSAN|GGaUV`;O-(K7x`ayl==f(F#wTA) z^*nIz7tnDTAlh#A{Fa~Sp4Z;1J8pGZx``f$>awVr2*WkCsC(fT&>lDKi4@Pa+H-U9 zbxf(6UOl6#Ayi)IH!GQ{yjtcq@0M*{n_$9dP2@(hvtCbb5e*}`?-VVgoX9DelPz@w zI;|=$e@;pk08(AneJiw**Sf$Jm@Jt=wyuE=-G=1U(Yys!bbuy0b$j_sTQeFo!D`Sf zsq2ex5W+Oj*xFEZwNn~~%9SyF7Xj7O=%{8%Tf^S3WBB-ukMX@hTqqClDRHBU_?0u$ z(dzei#bf!Evs2lb%X#lI^;-!BeLCU&5}H?wR|{T+K3+DXr}!=9Z;+@-Ay4Am!knzc zB}bD3jl)5v$MiI8j5u~A*;AH#M2CKIAxM~?5($93PYk$YlSgxn66I7#*mNgirx6m|vzV~=3wH7BHPnC{}8&i#P3TEF)%V7TD~R(t4MJc1WjUw5?q@lIO!gx zTX|*lrebVvVA*O1DsCNtmA{ki+IkLpiW0wKD~d+`mxJ;1MOL|qL=|9fzKOr7tixdecbK5L!fe0Wf{l<^|Il zHp)(xP!>Q|I6en?o__~=Xz(?m_{f$pQIP5vLSm(Rz&AZpB6qQfa{E>aj9UH+LncAU zuPnrtS(pO&05j-)#i&1uyh^@8OfH|dobbS5)Ais6+8T2`@pCz9#iIuix(RRZY^xNh z--ndxHwTG)e?!w-&gg3n+}^##ZbFFra38_Ke5HiuEk)|-?jGzj-KFQdyNT-PE;WMY zQOG`;68%bHQktUM`ulb@5e-y~)o?80lz?N`m`%&V#Z#MhW0~Ew%wK!~>31Wi+Fi)Q zg%Z+ABI;H7V$M9XqvCDDTmHRoGD$TqS&m2za z3eDU=0hh=<&3sFmd8vQdwBl+im_bvkDb$l{s@!-)Vl1s=_bNhC8i~-D)=Q&tW8z)g zJx33RqxOuDV}q{7Sl+1WAY+?=pi5r$x1Y~~2Xm}SMpN))L;H#mD2WF52>Yxj}rOrx#HPO>? z3oH{sPfoU?tH-X==;vt+qQ?31=ed+sl)3macBib^qlgEt?vXsZg07jo4LX{-Pik3Q z%`JN_mmh{2laAr-@S!DxPn4e#u2baYh{0p!N1`_^E+MrJ;1nCHZuOfybRP3U9%(~* zz1u>dB5eE39bt11=2vx?UtK2VSL5$8mftY6VQb{lvR!L(BGZI+aDW&;{fJqy^F2QA z`;qY`afaFxzhi;>u&QG9EcYqXDsy7)N1eWy|BhTvwI{muy?fS2TYbx}yJIMWec2u0 zc?uI04ZYElgd&ksVGEST&uYQ?%?qlr4-1=@%=URVA_g+i6|InCn}D|&e*_&O8T5NQ z=1%n`*9E-mY9?!Spp-v_$?@D6=YDKvohGJOCeL@1lz5LO2brE+Q+D2_Y;ap2X{XHRwpjvg#?J$G!BU zM60CAoze`}N|((~b7mEDZT*R0H@~^wR_{%#HLr`_-ysww`mr=6aDA__~q9a^QNV*B4ynGGHW@3PlshcgG`hhOx50oOnlIj%M zoKl;udGu|a?lvo3XNH!pQS!FbRBDubEWcxGYf`$|sKJU(YEKnendr}5eU>tnju#5> zp3}9y_FPdGn}n6|B=LusHjhl!!bi*PXtXRN<@3K9oanoZ=qkYzZj z2yHTea{zxlocnC%{pyg}sPcH`<;gd9WxR^38eLpkfadm057qG@h@Jj=$(Tbf(TfeE z&aJ*6${juT7D2^Oyt;0@Wdrbz^OH0t>$XQ-HFIT z|Dq1S)P_Doi&&aJLAPxNZR?>9mJvkbD>}*8KAR8U!6av>Psb+;x=^o?C6x54ZWD|* z=>F{=_N*>GF()IT>-RcU3#od!54AL?CkmG6OM_avbc4>ltXCa4gOEwF)vQ7~)m1vx zM`;(Dq5)og=BFr7e;oTHNfUZRnn-IVr!|tb7BwK-QzIGrn$kz!s^}|@7%loLv=-st z@U|Zan}s%}BDf%Xb;vaWF_hLoRs>ff4f_y`jhcaP zQM%aE^i6O_>O=t&1rJGZnfotPQCCowpr$6C%I2uzU2whRsb|(B0lfr~6 zYI{uvwGCsvXqSHKlZ|jgl^-Xm!`J5Q(x7kl=V?t4{DoiR-G@D zbOX&!wk;gqD3ciUir2uqRy(+97u9ZeZA}Vd{zu8}g>I;*kk}2>uT{P~1g^lSo=b() zirV-3dBke(l-KxZxlm~BB#1BeOlXAjAnM;FXp;n4l7)A3LEcL7`;B>qQL=+^ebl36j>Xnxzsl#$~f2lNYKi0@;9c>K2 zREkR#;l`9r5n3EIG2nSIMJ2Zx;u`B zr1tlKyJdUlQMPw}ZzyH7+6+B-`){g?E@?bORuq8M?u*TP52Mx9I^D~0*%qbak2GcM zYCZo;JCy%DgNanE5#KQ5w!5Ll$Y-!`W=^nMF6Mkx*)20AzqwsFBo3^6PlyVJZNBVR zyOFzOSHgIU)2BaK$fyq^W|^&X|EgwdI>q%OtG<1io7f|Dx>HEkW3~W$!Pf%&8D`8q zA!5r@s*VrLPl1R(>vZc$*Q1VJX3Wwv*$oKoKERAw`t&VbPE^&G!I6-!hZ*w(oo+_& z`jlDLKj~SKZN~h+yH##x8vjo-Z8q|LuD8B=KTHeNu6}iojqVp?fXf=e+S%s-JdN9i zAQD!@y-3&t?6^eCX?bd}&Yw(_BB~27W*yCub%c91gqg+?Y}HJK)> zpJIcX-ik_Pcj;mtrWh(aSb)lFb*lOUE3+w-te(DhkW$Aeox4KUks`Vhq9G#)W`CWk zsE<0*HbrQeAH)WC#X@X~S|uV!k6k4DXDTsni-Guh?kGi@S8QDC)US2|!Zgo88BX?- z8b2Oq;m0cQ<84bdek{wtkJjeVCSbh~q-|81!g`fRT20sR$JGR%NqL7vkpEh)(hVV9 z599?JkzJfZkaiWlN#+we@5b9c1wr1W(>+YO9(DAxTeT5npLVO#r;sk^DplVh5ah8s z-PyhCJJ4?Re{FN~f0!++EfGxZLoB?w=6@P59;NXj`yajaNpGIiro@I~abPtW#ZcU}cAc9|!B)CmztD9{BOi zKdWwM^-;&+;K$iSnf~1HV+=+~vE2BVCBGLCXkdcwZf`)8R0 zaXsqiRi*g~a8g;?2{EtqZqXZ+kWsNZ*(7RCRY7H=sqArZ)5?iD>W`whFjmYtMyGsx ziscBZh8I$FqG0E{Ns2O-y4my?%a3|OsVpp?n2q7(EJue?|2F+I9$zOsWSbFvjVD~A z!aZE+Fps2=!4%>*FD?w5*hf`(Xd9)`q_>mJqBl{c)avZE$Qbl)%QP|E+?0sFZ?&V2 z8c--0!nSF=V}32i?FO0%1}(BQ3F_BIj4>OP7eC)eJ5bV|SH-!j7;T`jfAI~wMGfR! zNzbg%AruoF9TeCvekpzGO#G!-6se~((zvPHq|FQ@=P;d96i9MTYn1r5Gj)91Yl&}L zgF5~~B=rBlq!i6z`+VCiT|Cr$I<5IU?;rMjj^a+uXM~&2cRrWA#(V~LSmWqb^En+8 zFEQRyqacHVg&DKDe4<0<_6X95kE0GFD#4SiiFK)oJ)P1%kBR-udsc%U&YW0d>HR!1 zx#we|B(sZ^7U~=5Wr!|?v{>Ct#AK`OzzM%9J>g&fwwmxNWBGJF;i{yj*HkZ+*_zec z3=r@guRwsw=?MZy>#`0H1P-#EQivv4u`pD+KImq{v8b`j&QuzgLQTe(W~hU zYa7)adVzsoxd64k6AQn@+;0j<81>?dTfQ302L;j82?}JDV}fblI#RcRAyQ;~SSZ-^ zj~sJr$ngpTS3B6(^akbbVEl4bU2$tFo^x;dsyZO zTxG)GGoiAGsi6vrSN0&h9rP$+1Q1#5Kb z`hgZ`HT@H?a)vO;TPl4W}G+V1`R)BfShEjl%R8V1|6F*2ioF`egdGt zYFNoz9{wpC(Dszihun-c%nr5l^4OYA2wb&wKw-yzYqfmF^9;?vBqt&i#YtWJHk&L@RtR3SY2@VpWIEb1!pETOZEmXQqp(jc}$SH;Rv1w1uS~ zzX0giOneaV$k*kCxdw{%2zSCcXuNI?fdv%4L9>B2P7&Tvk+U=_I89i=YYt>fpTfE% zvFJ?;i-@(bwXmcTDcM?E)DFs?Yz_&=XJFnsl@Z*MVn6?lddsEWes;aTP;-BT#STM6 z6gwPo8;>^!9gW?t6{wle?TcC8(dRg?Vm$ zIZo4di%M+8>?QHDe_HcLU*wAMd_hTuFZ{1Ofx1E zZN?<%-4HY;ZlJN|&eD%Cy^7V)bx7M(V5^;lAFC-$eAuxYdOdk`7=_<(j9I#%Fy!cv zG``Y~*wjKBNQ9yAgv@IRCxwxlxsY8AyP4GXwDJV(RF%`ey(z=Dsf<%RiK z;o}x^9U4BKdS2H5KP>n-Tdn`z+tOLly|}$SrZ+gCcfC&Yt%n8)d>*i=#PEOc6ee@FR_IKbXW?4!=hJ5eh}PFEfQTLrK%681aRR^~Faa>6mN{$uaHjsIji1ldD-Pk) z_=Bz#f3P<(hX7>4ABYDJWBElX{vgmde}J{}^NF{=XVcyngYn9o#C3x;?R{C{QBZj$ zsOQB*fmL)1uPNFI%iRZmph`T+%q-EF_>xtkDPteM9Ogjr)>m&(gm(d0W{l7LNQj9| zcrn3Wm1FT^Vd1eKaD`0vZ38Vh^ybQ*#aHZ^DgjNn7MVUAwDP#v6hB&Gnh_u%S9oG#G zK{`{L-?%GG1|gMY!sy86SL5McO}!0^nMBBLDvnra&*Xi~-hL1)dtC37u|~96y)KvN zJ4RH_!Nl%HnCt!ZE ze%7BTPnBjX8{XA0_Gt4fmt~J`6p>lOr6dGkwxR_9x47PjE@CJsW}SFDGGA1z#3pdn zMp6EE5k9dS9;PA(zgv^y&LH*}%6(9oa+B17`GJ+jhq!`dY$$XZPzGtFd$`YuO7I#` zn6y^+!cP>o@9G)pcFOBy8_}2s1mgu2KP67X;9&gX{!(K81V~k-;$&QRbja+$%nUw5 z-NDb;Oib9QNXXP^&oFv(9|TSQj)Y+~Kf=%SoSYP)eDr0_&y*XF_cNjCjqIM9x@fs5 zM>I*JT#x=l8l}4EN_A1ZCS{RU&tPrF{#b-_2<5ItC|6S^q)hh4h~`p!&ta@5C7okE z{Tw5g)Oxy|hks)|{hDl_ww|^>3y}WmC2KvM#Ic>Vp00vc3X9Ha*zZDKyTO0M-8kpf9Af#q+@H5oWdwppjIOHmOgKVF^%8H}||JZ7E;G1go zPu|Na`xs^ouUksO@`;)+UhcEkU71d}pLa=XIkp?olX$BZU_V)a=db_?2-++LQ|1;N zyBN#2V5)_A2!6}p3JZNr-G$g}N#VQwj`s5S$Uzcl?RC}~EAsmL`ZJg>LdT!O@di+% zd_Y+)ti%J9G;M-|zYTvThZg%zjOPyuApE@T2Mi}Q5d|?RRZ)BZ|5ii*WO23wluZPC zh3f{~bEg=~FQ9nwqUN@wjBu)jB2)DtQw;#ku1YfDV-F#6FdNVKK`wD>7=n^m8O600 z4=ShJkX0?>Bc*N0M%KKsc)dT9FrmK5k}U??iz!Ot zZ=KdE83&jvp;!9xYDpaVH%)FT*j_%bWhy%(C#XF>492EJaEW3tj!=xr z|Hs~&hgVfyjsHn*62cHpP@GZ0MhiwNiYPWvbIDC|BMG3$U{$0JI4i2Kq{61^#eeOLsxi^FQKF{}$pU)#X=iGhv z*?aA^)?V{o<(-*pM5cEH=LtfNj}#fldlS|#++#J5orPmDfRuL$^k-}|+TXI-0f}iO z_K%S1@P~;G(JwZ6-?bgyVLD`~%e$uU@UXjs9Ts>$wjD+i9b*32+VJg_wQNBAnYuXqC7%I7K@|M440JBhE9?P*L z3(E`TyGEGX8T%UB;u=wQj+qgk^ z!xra9jo6eX2Me&LjK|Vm;mL{d4D7^ssyj5EdU960%8cVl%OAwTW%b)%NXko`16-{A zW4QDeZ9~6JnwXN-j|X|jhn(7XQsp5Fxy|IEc)xhbGKk}pR+f^nE~Y}S_nQW3yDP0! z@r-Jc6YyYQZw_%P_8RYd>ZWoUwt?1CZ!$g_Y+vua@`ia)WCJuwp2>@affvuWFaE`} zz_PR&EFIlbOe$h{!Q_rV2+NA-&_^W9Do$j;$UgPA_Q?u5f7Gs0#6*I2l@HU{RnDVL z2h?a^o==F3x2;!In&NB${-4%}VMM<6*7qMvbbTRFW4{>wTY1pQ^?jCi+F#$j&#}J$ zSl4QOVXo`F)3&CpFVAF|x(1f%$!mlY1=m**sx5ox5pP=-$6{I zz4eXJ=8LTFFV=o_>-#zO%YRGiO8lHY2@CaNd5~P+ssh(h`{jgIrfD3Rmh-*NJMFLU z5w!CDy~eKZB}%`t8w(5fa_#z#RQfIN#g2@KH1c3m^A$0%{2+5lMA{~^>WibHW!__? z(aWlfPu}b%xKcKGf3vH;PieON5W4G4cZVgrJ2Y)~7uoKfGw&SUp%u zfFJ4f`6T_X{tECTQ5hBK4mbSMO^PGMK8_s!AP?}un_ZEbYAtcZ53IrMrT%VzlkfdX>jgEf;({0-Qm08hKO_XO2vZGn*~W7uEjheH3RJ>Hb)Jpe=BwQE;ZJPvp!y1GaegFtxug1Kyy@b0Yl!&dJ0HNhAT66U8<) z#;k>)K~#ln4SgtlMAJ`H6d{tyK-xwQjeYS03ZypC`HWE5T{^dMn^ZdUZu_?ZLO+$X zJ5D&oh336&sW2UAyIW_LsKYSb(8F~1GxOe84pXq_<9~IbVC6C~V}B9Qj^uUOJdyHR zf_BeJr9r2G$%9EFyRzI;1=*Kp!3rbKc1N-H<1LP}tfpT&R?|1ZYQC0{)uf^g`~^Mj zk$(y^uPRa$vT-KF#RTF^+Tk(&)C93Kz@(3vn^p|6el(FT`eIYUHIfYY@?$Pq$QMET z>{QV%#Y^H!8sNaQ87oyz5Tv7eg`PR^F0S0}SUf56akxQo;~-sPy=WDK-x4=k!tiM< zp7?rDGVQ`#mf$WwAuGkZV1?x_55Zj!l1At7kGjoNG2%wUpTxXCwAZq_y;3pDnKMmz zkvq1aI({b}JqGz(I+Ib=xUVz5)KMipduBX%DsD?No&p)q%H?)EMSMZ5SQYN4*sIh~ zlFo+pQwUQA5{=I^135A=kk=SUdLT6>M-W+3*ddx_GDh1DnYg zskj;`-AONlYMc=q!XCw-ss1`C^rQZ|usZB0wG_Lmmfdf3b?KU$&KA#Fb&13g60|2E zjpC3MiCnIwuDb>m$#o0o9lkif+eZ9=+YhOke<|skFYu=z>^>Kne<=>Rmp~2owTQdM z7#>-ao(vqfaS}TkWul^-4dWMM#K#sd*kJ&ribinivHxZ2XDqX8@*UU@`+rr!&1%cb zTQ@6wT->aU6hg+YcAB!jk%*?o&AL3O4=8UhhqqrEIU9f8jlUq}VTGrfL_jy)U zD9Z-q=n#f*1O(2aWAXGHt$nBO*hG{HgBg^;Xx$EfA@aiKFYi6=^A}IAguk2s;J!Nk zGL(M3|1Pn(Ga$(^a+PD;$j@JrV{CkiFZ|U1!cyI%^EKE4EWL^9$2*`diM?yMSbn44 zk!2P6I)V>*-Hf1vtRkNwx6LXdGNLa2h=%ahupIK|b&OSvX3oNhj z`GfW9enFn_IcX{Bc|w22-VvTKnI62aJ!jYTbQMV^Vj+_S^jg-evW&G3z7kK7x8M(le#YQW*-Ex49e-{oAyI%NL z^Agzvqaj1%%8@hCIq^}>oJXN^ojXyAQp%cujHlK{oCPbSEZYvcmvB#W)kR2pEbSkVh$4cfdMG^~%NPtjO9)rGtv@)YGilxSoMw`(;(fEp&Pf7G zp=JC-hMc3$2#oP2QYS)zU`}xoZw-}8b?c8(%5);6I<2avbkR*CWSgidSwz)#@mAPf zUmQ$!(-*&zy{sv1s&T5CYC?;ovq;IJh-~>iYB(^0|EU1Yfv9HZdTp9w(=CE^g1290 z(-K^MoYXMv*Iu}U*VRh1r2pV4NNXI(oWh;mU&OG+#{dW<-Uo- z&bK|siretXCdvP(|Gb-X_n&x(EEYfHyR$xMcJG}tXddM@LMxizpq3<36o}7AH7K`e z_@3r%vuUoYwaRN;pOv+3s(-)Qdw>%vwoUf$S9uR@;9iQ@8l;|??;;Nse*707shMke zk#RFI#|)`4ttY3F&qi!cYM5>%0Y&7p0CEG%sD z({Rwpu0e2`t|>U`<$vJTyLx5yVg-L_|NhSY{hR%}#Qq(7cdr)bJBies5nq3}z{l5m zt`uKaaPigR>&uS=$DjWriLX-UwiUiU$V0`~H*QjVed(S6zFJKE(HUUsElEr~6zl)C ztNr`c-Xq<(mv|J5$-CBYe>V3im>Oj~R-F1$n7Zum7E=dUOf{x}Dh@Y7m}~UB(+!Sx zHL_I5pESM&*# z04VY>{zqp_@YEmhSaEcCOmQ@Jzr|7ahM{8Wl%Tqm-kRmI?>G(D(prKxzRlm-MDojV zOU!NuK+GluUjP-VU^CZx-5K>7B!GrQWn2weCK4gEM)${b>1cP5joLlED)nOE60T zVOR^6)F4fU)`(>ohJNFpgiIz7uS_p(y4HdwB@m6V+wz@ z?$iLNmpuxo-KQ<6D;ceUj?}%)wXs2ic&fl>!u)jt@M(I?%)O8%&7^C+@5~`pLMUuM zl%DMB`~ryoJ!J+8vuze;8}!jiZ*#u@%oYlhh#!B%ObP(Y`CkIKr)eO7BjBd_Cb68q zlmHxgF#@=rX#qEs`B}gX;j*KEJ4f2K3Ap?J2;k0r$^x!1WwtAEeF)Z&aFPjd^Qe3+ zO{A)HD&WLzBCB21L~b1jHPU(B87J#XlAwBD{B-KJM>=j z_x!l|d#(NZz5C4lc|z44llR8`!QVg2xl-PA4;NqU{`r&Nv+NiAO`)msUfcWUuWwM^ z)cbp__s`Q$P2E2?!l{D$=dS$J{d3{Ubo*xk0^ve3|yS=jRw14lne;>4e7udgN(57rW5z{801?{88eS>f- zVxhfUja8n}P0FUofxwd%%fW>x^Ki6P(fN<*8HUmM|0sS)NFG7>O7SjD_D<@vzj^R0 zY$39NoS+<%vM$4~`(2kTjoR|M)1dTaiEbOd^G3E1PBA6zyfVA#T_O~n1^*=vt6Ma5 zpjNZxC!iAdWZyWQ*G+h4OGVcYCy^Li*+j(FJBHS27@!|3VZ%x8d6*TeebS=NADISr zOYE0&B+r8j^e85d1=~;!Kc5ovNZ{K)^Nw2gIRZ#>5!St*5q1hExrSHs zd==xVC1hhFxG#;AG%C|Vk|RK|I)wjjjpv=L;?bGS_=!1iYm2HLa!%lt$#SR`z?{A% zFqitYMBV#KftyCoS{Zc<6g%5D8JD`yr^=6U#d z%~+`0F`G$<5kTBvh751lJ#0oHC(Ou?60U71@ek5eDDm3jo5l1$Rh$^mAnCi_9}eH& zTrv24*9*I^3K^ckG9r`IUEd|^0p9WE@jFY%Z1=TCezIt6#Y z+NZ)5@=hx;L`LX~$_2FWRz7Z5@E^fqeHofr<0fGI9#AvqFs}%bJ_!-&_2UKnMEt_WxZM_fjFkn)tnXR;MgFm{KMe$?~eYm&Ztqahj*TB);r!JjNN#|s5(%pwl0_1@RD?t#;AmQN`E zG9&}>I14tKi0D9;`6lm?i2^5^Wj;E`J7LoSjg>o~m@Ki7$kpq;)tt*Ig8jQZhDvgw z8p$F{*W-C9J?45ZZ8SZiQ`wQ?2VL)Rh@JK*sRHy!Omvl`geQ7D&d!2_B(r8T(a%*~fC0(hv$xDg}HZ(q-C;eo= z1Z)ZkO!(a&Ehb2LhyW%Wt%VJohDwVGHZr~nr&J;`K2dF8llQCfsd#YA2D55i61^%O zEG3jl@L*>E57Kv7o6=#f_u@;YLy3hl!&Ef5$#(c)01W~i2C!h?w^Om;HtjHW6+Wtb zIus;eNkv^=2A`ize}Ws{A^L&X2p<^&ou3Gb3A@*}a+v)}@Au~iKhn)R%zUH;LRjl5 z>AvRZaNV%W#!WDXhGQp!A^egA8W;jmrQ4wNySY;|7!5<{q6|U9CR;FsB6&%oa*_-| z`pJL>!O|MP`n{sTP2EqGz;VuwzWAcWlI~eU8YsFe2bXKr8nH7Gb5`KuqBjEM+HG}j zyt44R3!+%Fe*)0lrkeQ=7eB<+TJL!ILCoB;uZb77rg(D6+NblvMZ}+T)YE%}IIIiT zy}9(pK1;*9-{eS{l0|F15IIMA*EF6LDPec6pd1M&hMre^W!PP#Z?1i>?oH{}UEzN^ zQqqKLhdsS%TPPe_M&fAQ8`9^$9BD(6E|@1a*mj@3|=2gDuvVZ6Hg&Z z@Ma*z^^aH^Bz(%AH&MfR^AE|exR>P-DMNKFf03=UAM_u=j}md3HdlwdFRh!@f&U5TNUlC=@{&2ZBW=^ zwX{?QtLy=#!6U=2*YrNb=GDEel=il}B-mw%sJ2vQ+7k}#;Hoh6KF7E@3-(q>g2RFr zv8EklE5_~q3@mr*iG^d8rI5s`WFZO7c+g5iM6b5Yct9?KOWyE932|BrG9JPeaSk<3 z#ZK7>H58FDI3gEKL}b!vL|zzAv({Cw0?}#-;WM#A*8j$YI82NTEgwFkQq&9)YiiKw zP>=cwav}=Ejj~5ZyXf!voQ+i=E%{Yj(WEBcqsp6Nnqh!3D+jfb?qRNx^8fd4(JU zj$Yt3iI-Bg4~SM^+NyZr55Eu9PW-i{+LOWD3bzs?bS=nVk*(Wm#9b~22v*2JmC1sE zQpHe&%+4*ptTC&8EME;KMC{Wg$E0DUWC?M*lr|ZHQQKU1_aU?HQ=Emjn@NZvNs(Z5 zn7P$ZRjJx#^_BpS{w%OygE!acg{M@wqYC(m2GtxwM{}v=6lf?psNO`=I3OOh2zizI zhBk#-^?7ku6pbCH9NJVPsM{fIU5X6E^RD_HYpp3$n}N+(?vNR38Hgy`;)k*tL`rJ^ z;P+K`VCi+8>E>$bM*Jea4k61O(5@f-E=zsggLbJu#K9xG7MmAQC4MBbM44*#F_Er# zpq)9(XlBwV)V6i~vb&)H~puGUTop7CffDzy8#(%LR$aBcBacmMo`;;sDVepVju zag_TiVoxmMzF!@`zE6$2zjV)S$3_Sdxo-_kqHaU6$ii}JZ_fO~@euunekwSA@sI?C ze4;No^>@h^mPXvA>>`VyrKo#vvB$gN-7nY1Pm74f&^t;t5^@=|X^9y|IJ--@{;VwL zz6ze!mVWBoJ&cR#Wmu|e<2A+2wI$D2H!rJR>s2>52J+XD`l==DvR7@q`arWV{m@zx z3(METG3veS8Lwla-OA@>F84pog{#wC9*N(C$IuLof_nI*ymRcZBnl+VPVs#6vh0ei z`rCo)eShIu1ffKLDf2!!Id9^Eo%#p#9m>HjSX>+L5veVG!I^U#&)_86N5^xoCC+bp zvBV=XRPnNm$qtT{LmzS=0b&8SR=6K*M|d`0io|nY<%3zeddHIcPLCoo2|Q~!k9jtK zarO!AK)Z)mmuSfCQCw5ShuTIObZe%NOu`Fmoz8#XryCJ;w1umvQvvla6B3(T9a=5M zWD|cUoM|}?gy=HlSd7r0{ovcg#sp=eQEu|K|J?AW8v*=Oa0Fp@F<_0HS&?o2zAd1+es98m~>Gv)l_$=4)CjI;z54(TkgIPzxrS4rVW1e`MvO~fBx)C z@vDDf#uv)!EWetv<^ShbnfcYw!~UP-SHC{g4D0_Xesw`bsIl(9k3Rb7iB5gVSI4df z-s7{Y60X{0S4YyI4R-bY`SNo{b~WtBhFwjIxDn-7gm@~$l6~Ng3zH0sq8?>1tg|^# zm%q7Z3*#CvCBjLHaP=QHbSqp%-3?x^-x+50 z0*`sK4dIH`38`n9_sj;vtbSnL^M$MFzHoJoA7UG(q!b+oge#lYzPLup^OjptE0b_# z3j})thbw(q%i}#HD=%Ef4kHp(Pe$SHM#^Ypr*TExc$tfcOBm6+BjP=-<0dOyx=*C3 z1I~TK38*xsQdL5ll1S)^fVvsp{h6qn|HETnlv-j%sb$igh*HIsBD4JRAj1RZX;Vb0 zMt;w(=u>}tAEcIPJgqH#$GQ6|E~XD5G^92@3Q6j@gd`>S+OGU0eKH%F!2Q4H+MgCf zio~a=7$w81a5+PEqu0$2=`$XYSZTy4JD@kD852#4Pbk(~oq7QaDk&^@3F1>_ZRsjb zoRPN9g8hh3cL;GE??^lm<84QN+84o?)X2+GmvxIs?(DtAGCuF2o&v1c#oWsp8A(J( zcE?CC1VqvDWVmP==*sou~!rFFc|IOq2vVEA5d9hss~kOliw4ywr@1o z`1C$7vZ+z`1H}*QG(u|cI`?5NO{2K{9CEFgyDN5RLV%|Z=?7}vxr3j=ZgYjIE(aj8 z3LK*xdm7p=Gal@i`ApPSOH24>LOY1?teSFEcbCeA`{MLt66e2Rlx~hTFK=!vec35r z%$b*^t7mRUbeHLg$z`gH^?tI!fUbc=^HRQx{#5O5;OpMs6=|J@t&p&o#2WNfRFnMr zZ$aYAc`Wlunkse)>yT2zh9i4 zA2~DMxle08!VYH3ucCvjh4`C<_^*(iek+g3)5rr?&lS_=kztTKBEE(Hu(6B)6JLfO zMMXc+a&t}Ll0`oa@BT07B(D2Wt4sGp+`UfiQq@%U(C@U>KKRhS1qVdRKx2t*EAN=b z(l-B?M~^k?n8_8m#Lt0$h^O|0*~&j^$;huD8ZpT~!U+aajYEbb1fV5Jp!ba|c?#Z^ zMwVo>Zv`ED1@~D7@&xElu&6R{NA=h*KrQ^rx1 z9bzj-33Z=$4~U|x{GxQHWf$VO6+6dP`J338-vHs+uXOy50# ztCfukjuCNRtPULzc9GlNjQ&?N_=U`hsZ3UO z@k1G-{d%+5TI9QIz4v!BA00r)hF8dI&C9}Ys<1I+^yDWd)GIL|->xkMCO1$4zq)jz zGe=&-1pc-%i&erbjq_KG}8y1467eucdCj zDrt+9^hM~ebSKp!N3DViKQhFZ>nicBgXmm?y_wMe4?Aj)3iIb+OM^uxv8dl zesRR5mS*0=w~I-aQ+JfU?&FSvS=AiQ(JK7mIDQjzb)Zt#0v;)a8PlbheOs8TBOs`T zKs5QqLVL1*x^zo5N@z=w6eb^YQu^t_O;uTOR%L2 zmsrMK!nBbOlTd?fs|lS$GqDg^Zb3J%%Zrc}$H#$QM&b}of;~3q#NRsK@(B?lThGU7 zxS!`@NR`N?PyR=w{Melu>m0ureyh$OTi3Ema|02^tGaMF!uTnP{T2?qGm|4_sBfM9hUI`M&Tdr(Itv4Rqr;FD)3k9ql{mOQ7omzLyP!`Kz;NH z$=bUD-#cy%!uLwL3e1nr2syJ21sW~?1LbldKvW0{b4hoiMykHhP z-7$A7gf)2lx1c(ylN!4#;TYkP` zLkd4?tTE)9zB)@9{+O(vjkP+NKLu(%LC5N&9QYtt;-fUDF^P{dEIvv}oJ!_XQ%>thE{No9`z z(PNr8lnu0u7fxX;5vjmLMEfGDR`0I~E!H^qa8f{jlr}Oq>mEScjOuKCV)FMkoukCa z^z}B?i&Xwf?AFN8s^K$k47;C-3Ud|J*K@+pikCIX&v8x)exeAS`dvl7V14yXM8e9+ zDqCYxUwxS(@{8Vbd|iRylW#6i^a})^*!t>%8REz!Lo{uyz_m&_papWv`+>GsnT1Q{WDW+Z6X> zRdZ-f>@>H$m_V!0i}icTZa=KPF?)V_ag4~H^ep zM2GxH=`Lr^p`hqrvTHbI=1PewhV1-cAOlJX3K9tWNdN+Q_{J*r-v}kaKm$i3CIVK8 zPaCp-I#7(CGbrjGK=YP7aGxj8;6wl*CCUgd5QanWYReLTKrFC1q>4AXKO~)9#+-5n zoqM0pwlI|notWG#`hJZm2siG*Q=|^E21mj}#bz0TdTn@KLK3kiOeDM2BB@B$9yXOb zSMLUTPQx;Vh9nn`?c+LdOdY#PC-lqG!HfLdkiaB-qC}%hJA)b1n88ppgPE6^Eo*Fl zvt^ynZ)VGa7OIL8Th(rjVvs|E1o4t}p;JGQ*siwRsoT}elnR|9U=eSap?+3S{>G3b z@^`Tg#+Sc)a+gW|{ta0+E#&W$X&#WL+LFId($Q|2S<+Ho#g#6B#>n6^+mpds;bXaz)yR>{E%c8>t4bPur3zX`?E&civ3Q9MU@32LAOl2WIB= z1Q1H<68N|G20!qRt=VcOEu;SYViADsNZw6K7MTKw&ZATBu-h%zjP(MC02ED~kFmKX zIOI+0;;Q1o<2(r0Xc=M`T_oHMT{J=xA&aW$BFlCqRy0278HS-Y5J6U%7|PwU|U%XB%H z#g4Oer?R2PC3Iwm&f>B_6u}*dP%U$W4v9D=(c&#Ur=gA)n~7~ zIaS|JJ_&N0R`P8NCCZS``8`bB?D4BfpixbV(%*&u%Z)8Q;yy>@Rz?a+6aasjH$6prA@HUy#su<6$u~6r@|?3!j=T z@pk%=K5Uf}uE>yHFP%tETd2{SzS}fBPe0hw$>B5%H3MO9DV%x@Gv{0kGhfkf}`5#l8{k#Emr1XQjF(4K>PTx>w17QWNu1zqJ$>L2?|?y!BBaryLkx*iGAs0^HLx%Q1NCr018c9=?Jud%pC%7fpTC8xuTY@{u%1F$SHmo8O>WV{=Fd$x;&g0J3iO1o>Q484!Yo> z1V#f|<-OZGz&@zBb;fU$eFQb|%K{qsL;)-McWzLY6cMk}y7%c<0@S@T3~jfodmDU6 zIgd72&#Z4ve3l>rt^w%DTX(rk%4s;1y%M8J7o%BmHG#9BcZ%aMtQHQ607gO|$F8MP zY0i`f1ct6wV*7ZGd4Hp>^I_1m9+K%F>##L;0y^XxG)*~{bjERFx0YQ_-`(|)*@&bZ zZ}OrKr8?(54=S>r>W}-wX@AnM%cp^}g|TQ#daPx&L@3`i#T;uXyW<$iQ=KSV zq-2bn151-9Jc+(YzH!pZGuhbnXE80w9T~Xza$z_`Cg(MA<#wxeUq?CgYvag)$G)zu zwRe*y9=uw zr=sF#j-PaQG)@kcW_Z4ESz^~u&NOihD^U4_2FXnxJyJKX;OtJJh4<-=c7q>@b}wcQ zNm)X44Xu%r<6m~>4Cc97v6`2bEFxfe?j=0f_BSRH82TgJDte`ipHUpoH)Qw*!0u`$ zF*+LBCdCrQg+yagWjL@{!6^)CcM8{E$`nrVr!WsA8kV=5cvwe1i(7x>O)~N;8F?)R ztWbFVw}_3tfZro-OM{eZU!t*dT7I?d{O3 z3@gavF^p(>HoO2iR#ZP2uQ}~JgqR?uS2aEgTh<1}$;I7M*DtD8@Vv|Un(Q{%6)BEW zl2XhsNnhZ)9lJGW`KA9`jQ!c~F!ni=Yhm&;@iCInJ5qx-R^eTQ2c3i5eSm@O*Yn0O zpK{$S;x@6)vb$b!y>d@0!SDB~ey%L&NLWyONDf0K5w43C{~XRzrz)#$S`S;v-wFSa zx-W)IV&KMov6;2ysDTQ3Am*vzE>{`Fox~x!?C!x*V?bTe1WeDf_W#Z4cTd!X}*eJ z=YO^6OMi9YB)&S!|LP&;tB8G@yqDM^MS9BCuWs*U!3_kmQfnp#q<8D)d|=9^URf2O zg8%<=d%wBG^U*JxHcR*`{|^=PVZRO7yMprFWW(RiWz5ikq!1haR;>?)+{2%*kiY%> zB0w|g8oMCV1>=&3y-tZ4=v*iW?kv336rs2L?OpgAMlHkNxRChIJx+s^hlMY6wTPNe zBuzXo&R0ymFWG|3@KZT*dV+1mj(1$ha2H%{hx?o&3EXI;2A6D_Wrq7_9>dz$oH(#F zk=4XN4U5Y*76r}7eQA=s;vW}wz@vqY$8>p=*!JT?Rx$y=!%2y|ojETXtP31Go{4QH?fE{doGQMT`0&Bf zU;G>nVzQpzBjo|HdYLL4C#~Pfvc{+LP70$;)x0gon0f)QAAFUC{n4y5f<7UR)W%sj ziiGG)$6h6qKqF_C2g=;rEWjh^Hkbw2oF)tKBHDbBEWo)}YMk2);#hCRaW_6EtS8Nj zHdAuIt3rZd8yt_+0?wB1nc|f1p*U07ynhtq=*gPGxs3A~j2G)E^LNVpO6-}H)Pow8 zkEpE%m{7cTyht%_lsQC?^J9OMk_>9K{y=y{>-dwTe1oHB1n#X_XwV{gAAiobWkE4} z4?l}5D|x?MP5u`lD1p3fe_<){W9<4kxy0iY&zrz|{_?8)ZDrGB!0QjsXK5#1VVCw@ zL+&$}YDLJN?(8(I<*C#(sfy>GEF)9+n5Y)bPv{p zMwT(=s8g|2qzgu-XVoODnBT$>0{&9j4}(Y6d@@mf#%UKAyG^BfXo?MHl)Tlj`GdTS`EB_&bz^@J2*v$%=w-mjnNI&Tc>AJ zKWJq6T0kZ$0~@JmVxeV-_WY8^u@%^2-^{5-0Y;g#fIC#;L6_oaE*vlxNAop(?(j`U z{J<7HnmI?@qZ%5iw@~9$yipTEmAb5WGC#dF!7M4+(RiNmGUJpJ7qcaM^>W4!Ie`w; z(Isj=TP?Mt&<0AMkeFuMFfS)$Uazcvw4&T^2a)JZVWu zdgE7lrKT&idwuUQ)6+?!-7n4!mwxEXIbUUJ@&BT=GezIe+gA@}o}|v+H#DRz@x&@m z{7LQ?zG<6;W51wyP5eex>)DPz9Vg6XGi>HfuC&19fbnAHeGPG&t(p~v%^0jgZ44F^ z7w?r2X_B+x91;X;m0f-YU3;HjqTEGoiV_ZlrCof%Em)PbJ`@wZKc@bBmGKz~`75g>yF(GrKceep{s;fdZkx6-|Vv?Glam$XWT7c zn^X6#%Wt`Ax-<7CF$cKU7euAL_*HUKy4|Ut%tgueaOeX@_gUGz$BdL5Zu&q{&o;^^ zBJ*t2moG0PLW?E+sYRtroVk5@-xt7D7JL3SGoCK|;J?aD{jS*?9orF0KV^Q%J>4t6 zT4p5YLARW`)6j@I7NcEA}Y+q^UQQ~qb*mN-`dnnvMSZf3;!@ma0#r+dxWc?ejAmzieM_5k4H=76|f}{S1UiX z+BchP;VO$RusoAeX0l_2!ZsMCJe#~FEqduR{EXj_UCfqZ^3!IVVFEA8rBvTq7GcH- zJiwP+-o<|)Cu1U>mb2$-3u0mwF;ZGl$ZFBF;VoLq!dYnb#2*gPGdi4Qyk&;-JXakW&fD@zyTdtFhV$n6c73Tn zD8?`~OZ{_%A@W6vxWJAG2l$<-Jt(_;i~T*teq^H;fTntGy6W&rWXS8n6~(>cLn`$V z(X5{bXA^J>SRan4Ow1x7;>lN0z*?A@CyrzqNBPsx2yZ_s489;mk_G)FB+QxH6?Cwa zIO}XP$6Y`iyr%Y&*v|b>U8i9S&k=?T)cs$Xb1_&?jAwZu##0PRIBR$)F`fi?qIX$q`K-M`0^NOAqy>W zp8SS8M1%-qHNLhQkexiiqU`a?E?NeSv|8!a<5E`oR{WK1+YmJ!ynb=FV7xQNvypJ( zP2NY=ar_7H0}k|Gvp@-(+~>YcZa+4;el~_`qxVWq(3kPK_xCxvI#U9Q;7_#U*jQsa z6my{;mnBw2WpUPYxJt$`OGEXNro*dDkG(a9cX5Fl_$pehbU@Z>We-a1H}Sj+qbve4 z3tJB>S;-w7s6ByYb(O5X?;48dT`aG4OwPJ+oG$52g(K@d{$|&7yeO#y)<}I zd!{CeM8gm~X-X4cVY@cLlhQSt`FgL+b}a!TD7}UB(lg0is(M)FQso#Yf_6R3bd7Q? zUH9;MXx9=vDc#CrZ`)+uqzIlI-HR@X9rgKDl^(Jxqdhp#<+k_z{Yknk@}9X}Ibg?v zCl&ui_e~8_OBj_TBWM;%Ad%w&topquXF($m;%9xPB zpwxN@R;m7)`TWdVBk>Bt0#vOznU&doiDs#|uP4rtO&ToHnT`C66g^oxX*SvyW{S^_ z)+x?BEbxuLo7MLX#_?9km`0QLO+#tdPYr@bN8Z7A;AfD6#Mf`+t^@q+VtI-E#+M=D zdGE`MX*rt65DESGgHd+Pa+Qo*#Mk?>;=8(D_~B~R54YF4rPuJ7uoDb-6#-vdh3|{Q z*q)4?-rybFRrmcwwco|J81lb|UIL!Z3&ToGGerw;@)tYru4%tZl?02>MDeXmM^3mE zzY!%Q)ee(({rsd)YtOq;iV`WP5Mmo@)Ra6 z_Kg%l@Y1tD%oA$;btG&8(3K}8J8Ml9_!wg<-eEZqyN5Gp6N@gQ45C9a>Fx;dhy-|3 zo39F+*vx=UOj7OENg+NWd2t|#af7`_9Y{vn5yRM-j7V@VLp{DHzXec?{*sVsm4?@Q z7uQ$^k|_7gqKg=$i@DYqvnRk5y`VHh7P%j>W9s+#EJex&SaoK_ZNzCAo1&PE$M!W5 zA*FmaT|~%-8WDn7U&Zfa%ySaZ32JE^Y2%%LB{(Z)j8)!+e-UQxG>}h_g~{kH|Cg2C zakn%#Z=Yqo?|svUPIMw|^w#05^S2lQ9D8P8`}Nlr$k$`NKwaa&Smj-Sbt~vj3dp(X zY>JA{R^AoM$+dh2{*!Mq?#FYd{HJZZ;_Jf%&y#k=8|1aL+^3aY@!GS^jE-h2M95z6 zx!+Ugb*%Kzlh}UF%j(w< zV}IZzwha5A?^qE(n>8$N@Q(GrEnai@qHko<&(?olFzq&z^Fb`jCU4Go1@u+4<9vql zl=B%9uC|rl$P{h5o9D(@>8SM2s2GR-Ao8dr_pFP{%OPkg6I z8!pZk{58#buK1>|=P09*{gpeG6?vv6erHi~F$I)XSPt6$s)-JRV@1Jq=_h49<%d?L zzg${*ORMaf%2~Utshl;dr{F~6Hyq9hI7~R(T2=(an)o>08m$ga3^2`b5{SikzS*Ji z#Li?qXZYheit)%`WE?Vo9oz8_(ME;@hQH0FF;g1b4~Jb(Ba2l>I626ZR1SPTjejv+ zaAsN|aLZ6e_RC5OsXE2LmYH7Uc;!vIyjCi_j=jwA<=^sJ#Jvdqv4zE{*7^d8VSJh~ zTrcR|OfcwU`8t^i67`Xvx|?UjxTGkZf@&u8!{}jb-{Tpi#DB$)k8q`ew95tF*=kCF zXY|fW@dhcZlF>gKFzEdJ48S+3LcyoL**`0;)v}X|Nad>(COaDvtDq!w-QLS*OpDDt zF&3`dEBaEbh`(IKPN~~F`n>Z-Z6sow$O+*r(?P@ zn4;6Pd;F~to#MKF-%E%Dy2$|56V7e z4}mkXf972MguOVh-|ict+zkB`!*Jm{+;w2Ty+K|I?6=MGTF3U=eIpF`6Z`E^)e4qQ z?zg_Z!YD0gm`Sh?NHM^E{v_J=>OFdzOd@F{`)0={afY45g=#b$B~jpB{TQ7`wS>SC z^pc$nr6${#P-;@bq*v5#K6yQgX%4;24kKYg1^>FSMGfFZ-U`>rIiPP|b%0egr z8VZ~&s!`rGioi^8qQpEQu;rNBCd6rzK}-(5$d;1qYIJw8ewwT9B3+;Lca6blh}#eF zX?4es4A~-urqk95`BCOI6+cd{can}VHj0)Ux=67{@g=iGa)g9mb<7qZOC6Rs-DL3| zV)V3|r3lJwhGD#;;)%FfJQ%@;x@c|4_kA_O-o`U-@!r&p$!Yj8FxB&%?HZx;nqQXap4l3AExJSOPt3<~@pjgW3hk|rra zvCD$_j()uAxpq8VbUY;W+w@GVWRcQ0V;pHmRHcsMWlu+Ou(d*-ZwIjo@FW9OAK{DW z?CbTz7TCeG%z90+cN%`eTeRt7#+b+@l@!uTWSGf-+9#sQ0oqGw+~5s01|B#`2^D?R2F<@M4>X;+WS~%O zxv!i1fnf-oxW|1jXmcx=LWsTrZl*7_E z9X`pgf3?rQh$-S7KrQ(394Ey-f)rS z@aGsuilMVr-ba@jVn3EnqU8Nr^#0iZ({}-nQ6A3H@CKoENf9P4d53bXrL1k?6(<6l zc-~+5d&zlVC9bl|gCjQwkBG%s&5hH<{BfBxXdS~qjdXf%!A6}xA z+)wfX3xCE(q=pp}dYwxRW&TEr8+>Ye#l@2HuJ3OOD#_N`?dL}fIYmAwO7g&Cxk5>n z%;c9j)J|;+$=Ky&{v?JqF>@#KBhKKxBqjnpHOUwgmyrf$^apZ7Pq$S36iX`nPaPBM zy}y*3m3~OEsO=L7l~JGkpVaMQ!FLP>U2HoLEt^0p|M)uL2!*eF3P;G7vV^FJ_dU9g zRNC@BYdwzRa_05rJuK%=z4$bv?(_nV7mtvGK|gttkD&R*$rBe_pEDz+-Lc7ZU0U8p6lfFj*FFZe;vXsTHdk3sXWrjV5ZuF2{whoK5I5G?7D&r! zd7PpjZ?i!$4%zh?=>u+=Hr{66@gUx_gDv8TL}!ad%lys=8^jaGCZwBV0|VuhSBh|dnK;UK8Cv1g_GanlE( z(8qP}=y`(gP}y0L21BhqxpQY|R|L03-V-u}*nru$4$qo#tk`G7{$At07~#6Far1jw zMy1N^+6)HHSdO1zy{6)7##T@n&z;L8f!#-XKE+v1eHElq<9-`^(sFkMCfk)YY;{M% z7s4gvtLX_*Bl^_e(kD=(-93m!{(G@sqWu}JjA$KoDgwtuu}4(-h1v(dqFHOK^3Q24 zxEsuAI+kZb3Wndv6x5_Hb!T2U#k!;(WY`h+&Y|J@rCq{JABH3#_imoKixHG+?job; zw7a;Cl&`eM4IK#ggS(p@^C!2Zn`~dk0w}6`MIf zUkAUC&MLC0B|^2NkVmm0@1J%Hkr;--&9cT)*`hi=iRj1KT=CL)krakAZ2g9o2pBK2 zAj7#lhpld&$xyU&rfwTe6>AP+1xh32cOx9&5r>8z8D$Z&xP zkwj$J=>2_|qES?8G(NxpIpqZP?SQH1AYhTa&`_f&gy?w9)gipLYrMQaD*_$Vyi_7P zIT~Wl*HVyZaxxZsI!mfZr0Gs6$q2rD5Kz5OVw}blB&zqJ+;u?pey}eu1yt{o<+YBf z-Y0#-fMf`YZz3K$8R$9#JE!=kHhH0b3a9q$oR)uC`(9tMZz7+L*Yn3D>PJo(kr)Q= z69adment_#T}e?l1otAPb}Gqflw##!0mI`b%Y9jmDr}>AdyCIkSDzAq2_qMKsXZ{g-lQ>p=^ z{4;MQC9(4ooH3cHy8Rds^6`@_;hHe8mMh@Q4MS|8orD-5&yFM+{bI3URF_ct{0;KF z#8+s{8*+tFV;PYMqU;Cj;5=35_8bA;1G7nEs^a$*|A}irbN*9!p89!3^ zJ8T<-xaVla5E!h~Gr*;FBM*?$k=vi*s>V$g;6aFzA~r_n_Wj}F4zFYjNeM>>L#(SO z=?-7s2MoFQM2jImP)rz?<)_32)ws(hVjpaMMuavmMX_a%y&PbS<= zxWr{!@gp``yPFa&@%3I0|NFh^9Tc2_PrQN++!%UJc>op)ZhCL`F*}Vh)pc)X7bcpOw=fLPI1cTS#solnEz{Uh-8J=S>OOUb)sM&B0%$zRe9e1dc)e zkLX#9epTAFGdIGsWbVx%kZULrPh}nB_x8LALRF>S?P*8JTKV;EkKry;z1t^`6o!;? z-o#ln5Agdm#^8juF^tMDSb}Hvjtq6$JzOGXf3oAnW-a4wU=+#mUe8^o@#eH1@BKXL z;CS!-x*hNAvvN8--V9D@I6OqU=m&nykjy9xbP3(a^`mD7vv*}3=~4z_ccREpMv?2TWKPh#9CWk<~hXF zEoonoAg#R54##5Ps4(>v)LR-&Z{9&>>@%+ukvl$8^GUunM1_EFLqL*GA~_^}YJudI zC|9?Im(*MM+QJ}L-skl^S839ulFa8TB0Z^P<+N7fQ+jf0r5`2hO-#1=LVmT=&4&p$ z#x0z;i7O2{IFwHUB&wal49#M;^9oGu`E9#iLZo*hIVqakoS`_%$l#Dk-LBHE~h~PuK`Wolm}{+p^wFUP3g0| zo_tacZ2@sJOhAf}witVIZ%K~*xLC2!;l3Zg6r(sc8x-F0G(TZdgG z>Rv-llpeD&j78lQ$d@_M5)P7EMw&PFu|**R>P}2Sk)S!K-jy@fdu%0jT)fitgezM)EQduL%J1Ztwd+ zGu^dzBc$h+R^L(m((d1xC>z)u4D^uK#C`b2)y^W2Hh-cG{&Xn851Proj&bxfcB_c2Pp zZRDTD26QL`?YCq7RPR7q+6NO7g(a=d(gy#W%r=L5vaU!W&?8Y_aybv6&TdS~Zh@k* zxIJNA_CPRrS3+BPzk@rJR}FI{Ml@j1&R8h)oNeLd)r}hZcp}l z-7ZrLQ2KMjh?JOIiUrB4V#)3DTXg4To5{^AEF+d8i+-@V^}3x&&)&YH> zBcT3IHtPTM!^ubKTkB5muUZ<6SnC)1@n}YbypeHB0$AR!7`Q@KOt|y8@wfL(X~?1> zisZ<RT1Rn?$&q?&6v7wyet?x!l@kV=ePG=#FQ(Y+G7RPIqL6193V&fJUhHb5ZmqE8>sO-u zm|jNoS4kJ+LEHIKoUtj1Ex%nOnomzP80VJmpY}*9Cn(BbnQFn`Q{a!i zGH+iug}>M<0qi^6bzpzHL0*Co6G`)?pR@}g94EN|`wz1VAQ}poYGaB(JX2>(1>=YK z%_K^w<@o&L4fyBlD<-KTQI_mu3H-s1N2r!oI{C#rL5(rryRcm0HpcXa9dwh|Rr`w# zXCaVy%Y&!XrS>%@rLO|7$n@2kDYRh|O!5cizgl|?Q!%MN!|S>#=+WFw@Xe4bz7HMBSkl_Oj{OlL^I1uH=n;8j1HH;6=ROX@&MQ z@h(@;t%-L*SVee0P{RQ>5L__cC$dvz(!2nc!)~vt;JN(+;CvwzLF7`7QbbG z^P?lI_BZfg8HeQJ4$tPwkB*4COIk!nBtx50LL>U{QgYaSXhh2`ZhRNud<281Q|Im% z6wYnsW)or*T35IC(MKOW(P#@2e?$-ht6@tcYS59CM(nAj5z{QfoB94CB!Z5Xil!7? zgcBH-P-jZe5zz;}>9*B;%rcDbop~8jaXwLyB{RMc`7Q&6)e|jFoPfASZk7j0*GPFm zqWqXKs-(mBAMj3c+?nuwRUYf`-Gl8qsOwmx{V?_3TA-@f>JH)fsCX{LjnK#nZ=*-z zuf)xvY8Psl>R^!Ia()u552~hZ4AFr0(}OaDHi+Tv;&+Y_H3klrQ7C@*!c z`)5RFo)*Cc&L%Fm7FngDbztslVKnPH#$}#u&QIYo zyK9KTFrMl}Ty97Q*y%0uBnI0V)NTWxZ)B7y_&iY_bP}Iqypx1;CVYPUKtA!$JuI9h zu|K^$80Qy;&>5LA!#3&C=WVG4>8_J zu0tkzc>FWg;l_|%hliCOsHURkfoREUw%;t-XVdwv(^z08(_4Fp{xEGijp(a$GK04z zqFbRSv%E9Bmkc4OFYO_frnB;8Z#roozN6^b>&57m?`M`TWk+BLoslm;`6LzC>1>W? z$iyTf1PFF-68o> zL9g=Vv0sA6U(ScyL;XL}rqihZQuF&6IZF`rGvoV^e)8R*d|x0BItl+`-f18HlRg6e z{TQ<1dk6N{c#p0M`#Zk`?6>V~ANB(oSf^n>@j%C5AJDJ-{6zVd@h|)Kcbm;J5Sx@}LsUrd`XAW`nvml@V=$oIZK zKj2Rqatb2=-%%2+K6|)4=p??Mrql4{`b_)h^&bG|Qy9A9``UKp$rL}wZ)h&Y;+puy zMdIjiS6W}k;U+RF#o6JXQGypFT9ImCwm;wfd(G{_|_b%6cT_nR)V{lk4#?@AyMcvvpa!{A)Xe|9@`RBb_`` z)(Ls$0eWkXslP;ZdZQy`O9D#klH8van))5GK`m!aL&YEZrTo< z&tw*g_kUKrmuk28KgKCeHzge)O>gFQ%sSbRPTS)ym(!*NPUFgMW57nHxo=NqfT!aw zZOZ3s-vh$I{q$*h&`ErLiFcC2&ct7O(#l)A+rqg+`|13;y@UDhOYEmV-R7@@@n)yf zS6`(~r_sKEiDc4}TB3a${Nx<@b`btUG?&<=yM{#@1FG z_9ftd1RrgW?Oa5gPQ!oRXI}~Y*S@Rp$KPc4*Qez{C*l7R@3as9p0x7Tern-w^e3%P zBL3?@yvBN83|9Pi==olD~J* zK64>2CE=clzyIiM;C}um7ViI4{@(Ib52xYRR)7({|I{Lcm$*b{H8r545gsq7xMe~$QEwJ4@4$S{qf_rNJ0FVlYMm

zE8~6U(kf-nIQ_nYIUmYUb@t-^7zNvC+4%F`S`xM=1O$!mdzl$bxGOU|F0&di_YNr^4v{9lpzbEFR%dD{7l zgxv1@ulT>3Kch>|pPSCipXMEy{}!3QmwEn@$=UAwr+nG@`}W_IdKWesrne=A?=sW` zFmB_f6TtW-&D#gYrp*B3XYX3^-KH3%sY>I_eF&&P5YuzXOqT@ETk}W|;P0i9alqee zx_IB)C7A@VS&||^;V-E`5_VtWw~>Ack}$Fyzjmu2nhd23akYtpVH|hEO~hHSh?E2h zA4$r=3A?qgff2WACO_`t4Jg8LEzcQDX}0s<@g|*@#m2Vk+_9a{ z$%CrTY6YI#oL>}gqFQuq9NVIrUu1c|Kg zu5k9wT6ddST&Lk}KpSx{E1o*IG2-s2nERH~u#QKG{6>or6$T@m$Pz%+E*3;xg8~=H z%s~N}7pEFDeq<2gIzAw4rIf}8DzXPR`dM_8kc*v=tefdwJ0}Gr{^=NuIMK(53tKJP zx9wL<-QNm-e*^C{UvO|E+${+0ZmD0mz^Y5Sa8UJ4krXVT{zG&dahspB<%j&cV4H~VF_o&Lbi>92t658zmlF+#?^twkiJvI${xRv^G#co60NoP{F{ zdaz@xtrZsiIpAG0qqnp0TnY|us@wai5Z~Ry_)(U6 z45j;~3cH|K0$wq9cerFmmb=mW>_7i)4u5m*L%ib5CHa%hl$roEo-E}8@!5J~-`v|= zOYM-k>!b}uD=Zag(F#e-jrFDgLN%P43YyQqx4+qMFf)fOMc=97fcDq5Dv8tZJ%&Yr zje#-t?fCI0KA0~oD8hjM+uWR$HKVKLnAYrocP&b;f`a6uC?^T!)*47Or9i@2u-??C zXbpw0ZQI{m;ZDk}u75sPWqMwfK>H?nzox^rN}!oViN@kBSeaP0pPEl^e}tI}k0|E4z9W{w8LeyML-b zQKq@1DO$SJxmQv;=QhXi;Vt!^|Jc3;6-MV%vTpA3*tF=}U9sz&r(P_ZcWrU?l%{P3 z|0_!c=$k~qnpaaCb)F(!ddmF#DNSAhgwqIeG?p%j<<^fpsfc#@jCGY%EkW$67TcS< z(x6iXM3Cj}AF-!7O6lMqHf}GdUy(b1>`CU_Us&L^fJXM=Nf(=w2UGN&RCs`u+ki)f zP_M#ci_BBRDS?MX+GK#oWBOAP9>3t;hsVN?TEW9_|6s_g5PH3BIFi$P24RLN$_-O$Q{YdpP$$s7v?hJ@@zYzm)UlG?2 z9|zX>6_)CD%$CtpM2lQ+cWpH%Y`UwdX6hYYX1>sHNeC<71n_ERkzmzWZmZ*!In|}l zJ98?ziBfl?nsTTmn@O_l!}d!g*>{*}PcsDe16lkYLxKDd86A^*k^feUdOEbI2-Vwh92X>S_gk zGW;KKadtd+unzxjZgdq>c$u~!vj(IkF-PEF`NAb3$${hcRe&G;sDjt6;_JNIHET?XaN=y_(< zNi&LO%nuZ*}G67uxi<+br@1Y)UO)aX2g^f5ntAeP^} zyt=+Ir@H>V>=~~o5_)GZ~u;mbeJbwlDC8sS@~Mc~ZC z!tS|6rHh=ZMd9YAaQ2AaC2QPe)$WLb@ceU&WMxldTZq=qAHfmpE2ke@L7&b_>A1JdxH{ih(}QfI4T6Z3;a|HXidNy^rs{hEaBd#f(4up z(29T`l@|o*f6ay69@-+{7W6CI1N3Wip3+lqm3#u~)v>gXv_4LbyO4W- z+`G4@8TZGaXT{)kkP(FYv6MGn&XXuqdpLg~)Gd(gd4i%*u=VC5`K3r&u-cf+%Xm1s zNQiW3jeBpgoTw0XH&&G1STv2&_<4;#q%=MZ60(WsKH&CumqbeU%c~P1m)hJg=XOZ% zm+}7ONa@=g^TE~4Jbo@R{|ChlEG`s0zoB?GSG*wy2uDgklCFo$y&P&TU~TiG@zcgn znSV@xm}l+y0>muPtcl;NC6k3<$H<8aV`RQk#9zsFGKA_3FjbYM334q$HFSD!@k5M| zHuo0K=0eDKjFRtU?{*TVz)I{kmpz&7-3jJHa1=x6OFJNsF@`;DwKt`|&>Ub4m+la? zs?1#ycB-C>lx(G#AXgvO#&gReCHocBVGd@A_xPi(L8LTReA;w}HQdGl#?9W*mC%-w zp2#K0(>YQa8jH_cJN7iE5}b(Z5S-9Zkl>71k@z=NU+XJQzP@6$aXkbKD_uy*$Aokt zC+%jCE?(82lG23;BEEDnahrWDDQ!6oBIPPsX=b;Py29!9#WLZYWf`O{k+vW$cWiP~ z%&m^bhpEIx!JW}y=NXXIv`QT}A|i*o7zuIaK#lWL>F~CG{#YOLT8%Z9;Ag(X2F-AE zfC#fu5!-x0HWi+Si$9>R%CWSkj+Y1`VPR)0!w4d04Yk|IuYhpbyxWTVRmX42b)H%( zy9ZlGUzs-g@O&!XE%Bd;Xxh*Jp)!YQ%jPeKJtkP+Xt_x*5r0E}O0Ll{-23zXD+hn; zYr!=N$qT~zM3a%dVseTU*iV)#ARpTyr!v5R6xdT%E4Wm{67q`*>t?B(Irl0qQJf-W zxuyq}>k5C^``>9b?AVy_uF6nR>?~WPYvE}M=-8RCnNfL7?-v12g`*Eto>$tM&dYq* zMn=h@qOHaBXo}$sH74m@ec^=~H(XSM`{SaBd(Pn_j}_)EgOnhIihY~b4u=CVvKbGH{%G%TMLs&6calq{+UEuuWsG$fUC z`pyscUo6$+!+K@$&97fR`yQe9*$^&S4q^9Yc2Dn!C7(Cf{r8INZ>XIyF5-@!7=D^1 zMRc2RWku<-n?_W}&+R=WAz!%N;&q?B+uY1i+c$Cf5tj%}y~6P_blBY4z^P`=!Sl{O zSWL?Gi+Wd3Wbp<1L~gng{pt89BagUE$^M*$Q70NN>+SZwuj`l{)yRA^;D8s(mLo2f z0Oc5#ROX)+G$=fKp3H^)1tG-qE}i#ZcMRq z0E&3&>(jf#Kz|Xf@%H1dvDY0Z0{m)rkQGtvuEFf7d=|l1Yei3hD(QPRz+WZfOR?-+WW#Wkh-0_KNmE&UdZ53vT!SJayOlocnjQnX?4i+vZE zU+-CAQVr_}En4>q>so&VXN7%N7&+7mo4LXIDi8{O{t80 zR3dEtMW4=``VBMdu}N-+QMy*xSdU>Yv0(6y5nbR$DSI!nLnwBYI~2RQz`SvEC|2iv zh9uG!?KjMY{>s>O2{frAn>gK!)$IwG-yK&OTeJgRCQ4U53HjSCkQi^?f99ND6(G;I ziD=Mta6zd8P|6=2I_}Jl1fqA`)g18U-5rkS++CLypMq|3-sAv^<$!PX9k82Qq@sE% z@@>+ks_hsLff<8$l*L?xw>r4MXX#7Pg?o;xFPDmvU3r!4K#%KYXlU1eX-j{}Shx(K z`?lTzueC*0OPyu0z);uV9U=U98_{<&v?d>9UFQC3Hbp_!L(f;5k=j4YF*ZXK#wWlR z=B7fUW6P7xzE+u?yoTUKfd>RH$T3{X{>e>|A z9sj}IU)dLZ%Nbx-I-eSTGa;V$Ln)4XFwqzkuL;HT9*~JNH=a4jfJ2~oY=XUiTWAXe zK--{sEMV>s)LpJg{$w-EUJ5{@)xR5Hf4%E1gcn(QD1)z;yvDM=-~>)i>fzRx~~`h8s>)}yAj=26c~G}yPiX_N$5gu%}M6}*Bg+O z*sX5x;V-H8hCERYT%{k>@i{sc7$WIwua+{va315&bMUaD+#r{nW>x2a%kl>U(tQ< zYD?G1XY=7gp`y@im0dz^#7D=aWQyL&+K88fX!s>RX6|4am4xCs%k<<6gy_rGeXq`c zrKwpKfmfTf+t*dkUi5LG_?R9apCR1m34wSpLxR?BO3eN1$H_{wQZ|SmArUCAgSDc>@M^iP>{xxa2Tex<{R~Cd<|R?Y z&;fvP*Dwf`%$_)#fR zhj2B@*eNhBr)$i%uD4Vw z*@O*XqEvc{5?arG#y^+w-`0El9J(@oiSN)oemP@3e*9vxkT(7W%YCob)!DIZdyRid z_xPLCB&qRFhPeu5r+}cXL~-bRkwY>&Hk5)2sRINc5;e+vQALc>2l7a~zr6=KF@X+( z*=InfH3gm4UeM82W_II-K*&E`4jIR2BgTPP>qR=O@n3MzFfa07uur*?1<`{S927`+ z!{$-#@}ze8Htq6V+U0K=zAbepv(Y=odFuy^95~K3-yPx*+1EDr9dw05F8Xz*Lx0M` zP}$#@@>$AJx0pPjBWTka&*UpvzdpWQj)u=o6lKZJb3K%V_4@rHa5+9?(1ejlVXNw4-aNe6&7rrqTUjE3pVxW(1qI)t>|i8FW6N5D+zGvOZ>O=e-SG z$Xx}LnDP>3DIf$3&Oxk~gng)tWh)LsY$7}uez5tsXhqPdt?!4mkuL?lbD^X z|017OG_DY|8iSxNN#A%RGd-z0>(7qQdVBAzL0Hy+)PIg0Z%`*eItq8%?C$7{yhlGf zw4&8%E%uY;3bKqVB%9r-9vUF)pRMi|G3u%>EKvGgbG2?BC>9eF(e$Fh35Cq9iHDzO zX%kaoobl(R6LyUWMtI)rW%J=)tn^vJDx0aJ^0rhm-Bs`_)yDK*7YsuP#K_c4}g^rGXSxM1H&@p6p27wu5U#fK|%NW5kT^+DZoucV$)9c0C#tWAv1Tw2k4JZ~gFou=p&r_zo6 zl&R_B<-2+OxzRK4E0n#-trfk+^Bk?{RUUJ5LMN{X@wH|v$*cL1!TS_xx1IkXtL+K2jUim_Agu_S zxZJ7I_EcBb2-@!C|NAt{XR())?rq{Rmyx~1v%BHv7%?rpLkl-bn+tn}oJ&Iq8S+tH zZj`1MdgkR*_%`YFMf|@>8obHXbta8%Q3KYld7B1bA$bu0r&42gQ;_y5F?aI=bcHlU z3TcW!8d8P|MXv3&xr2vtqE;|X8NsPA6zFwts)pwan77qbnp@G2Lxh69_acKD78W?P z#w1%Zd-@dD6LP?&tpIo{^(-Nv1OhmB<$x^MA66VTEKi6v)okBZt#PZYDN`p{J#h-J zFRX>>ZwUFe)?u}j10R0nM~EiPGH|4VoR!^@)=G@v{TYheRD;YJpa$us z%VHwqPaEb>vjuo+d?(2G_L~%my#V7unJv zfHWu7B-f9fRIOD^ss=M+VOu(u2^gT8dD#L-%ptLA1d`6JNbeyK_TFr;kNX zAhNPeVY8|vVAf!|Gtvl{{vvkBF-Cm4fOHbWhBpcozf9zouvYOJ$6d0tB^b!-kMIpx z2@vOzPp)SA`*D>LAP?%K=ETCs_kqaPv{Rj2(iHTVPl&1M?A927b5y6T*fg72t{*Fy zVs4=G{L*7N*$o0HZ|Z7752V((1hoN?9t&tWt=SfC3lBU?EOG?tKyL;Kf_3BgcyPR; zI>t;y*UnLvhKhelx0>VpKVX)@{=5tnbthJHJf{rMpAvG%>vuCz0V66}_OA51L!ul7 z;l2;Zh!==`D280td9nFP^zC6Io^GZyfwAhL-SY>bs}#Tn6DyHa0B-^t6@;0HkU0s~ zx1~tr;aTS&LM?ikr?DB{FKE6U(1LH%M6F36?2Rq&4e~ddM+)VeShgs^#DbLe)L*qaS1?wA)z5U77`KSsq-{m4 z;3J0*<|i%hWgQP9K@TZnfrxWy*(%yC5D8zG0?`YJi%aDGj`=QK13F1_(TtXTgZ&L} zWe6N{5iBA(GTxUw0*88ErTH9Nh6RJNnF53Qvl)*){(biN>H7)j?JuRIR(=@v{#&~~ z2G?eQS>2@3vfi@zUqlOaUnFJfAe30oEZrxYo!Vcur}k)dr$U0Fhuw82nC)g+b&NBZ zWcipbXY9r?3eoguWWyC)%LJ)jQhUp#ikn?MyNOM<971bO93$%TF^c9+^aRdqCfFS` zGHjlNSXYd1ZGxIYChG>XIVUd-#YgL1IeKviHqjmL@M}uxwm{r9P(CI@(bYwV4xn?> zmhO>;)wzur?V1}B+eZmhwZ=9+7^X9L0Z3z@JH92`Sz?=G$o{zd&9T**BPRh(lQ zO4sx%ox^sjDi3Qb%4$MOnx*1U%VAG2Baq?l6r&BgIx*GN6Z>@4-F2HT{Y2YtRg>yt z?^ePYZo7|N6S_NC4+i$_T;HJ~m~{7UR-fMG5Gq`2#11kEn%z7`_Wcq;W8Q9oWJ4;I z=}s>L4xxwt9QZuoe-EFt&;9@LIkg)8KZwr-saseUVa9?coiY!pa|L4G9iwRUY5me@ z^<9W`mL(8CvUC?#|7~*r!4iWYy4H=M05lq<7RwGIEwM;tZ}7ACwU3AL3V}9|euxr# z(?B}WVuds-b4!%P1Rn-F6UsV?vx$m?GWP1|WV?!wHdyD1ZVPju+l2dNNMAtia=w%( zJm>RKd_{_6Z|R3*$4B4#ze=)$%jzN7!B~BUNB&qOJ2-~Ke>#%gr>l@`)z2@PWP^2e zDN1dhNLd$TdfjjndQFr`IRb(Y_oQ>OCWqa7XNg!}X?7sEaR8_;UTKY!UFt+Xgl=bL zSr#{YHiF6RDNJtH8qXsGOp33Jy?Z$CmOx#$07+w+ZdP*UyLi7Kc|Ayul3Z()%c3aC zwWgPy>g>&}m10|X zwi`=UOYUwS;V6ZUc#1dZvB^1|JAelT=}~IjxVGbPby;fY;n)rSkoiI)!VPuduwJ7; zrMXz_D_n(im`fIN%ROXXBNDJ~2GNB~o)v;+A#z-;NYrND1BtU&iA~aEG!=WeQ9^~2 zYmuX>oc!@;N_nxDG^bThjOX1a`46o;hE36APuScMHW%+#SYVhDgZxO&Q))0$6!D41 zfsb7D;zwQ~IMJdepaTY}U4hWKTA*ixO+k>c8wz}VKt~PJWDWy`PJ4>Vxdb|8mQ|se zQJJ7XVdn8u^qCEG&H>eqgE9Ajx?#+1=|uin7JQeGS%h##IvB45Sc?Z8oVF2vyPe}s zzBo&FRifGjy@0jAH)Q&~^q6z$!h2&g_rzxUE6oQ)AW5l{UFMoD(I(^O>j9B65vr8x zfC#fjJh(^Ri+DjKM*h{4_eoh{n7Jy8)}wMi3aoHExR>mSpZ)Dv(hTk$5u}Zv!wl{p z5!@3ptGv=9mY==qq$|r}GZV3yZ}#qrXr*gX-Jr>Y5CcT|EvgUFuXylH=~l0v)X$+8 zd#zsVmtLGIy{LRsVMTG}eh|u>o+xf9p1xPsff?L`>27R1@rb9_=&j>V1XET8ht4jp zsD>dQ?}^@{SZn5z>$9?4l{zU$Zw)G0TaN)&B>u-3J<`*xzNYy8X_sLhzGSaJNn~!@ zxEd*l6ABjcYL=epr_M8{lyICtFz*?Gco|}Gd-SzS#|G{h9mx*FDoS({z2A)J>zBp? z4~$Oo+m@rY&2D*T$idZ6r~?ohvWP-T`eNQ%!p)0z-sD!ubLyiA&swzEqDXA^9M-yw z*q_ufx#+DL$ZgA_qPJRrs-ggU895uB6Exq#NMV^WuMNlVbV;otYD%&@Z!}+|XJ+*S zqZ6lZvZQsLPhqpdE&7xP@XTTEMw_ySH%kr!3D9L#`NJv@vY~WYMvpGbKgKo!5FO0> zloHzS=XREK#ZqKR2a9aWfD&>fKKP~WrehT(CyWTq@Wy|_3jNN<5R8=aOot;02q%&a zN5YF_O7c`f|E49ciCAfNEZG1gnsx1|w@%l}J1jIUuXW}vV>l;CcgzYb62_q|x*QKo z#NN!xBJ~R@=7y71wAP=kn47`fo5ZlxnBGv!TzPC%i+fMN`C5P(6V%iXt&`qj-AE=G zIGwze(sZ&YHS7uTakF|lTf^5c*x3kKKfkjp?x(YJe_>C+g{rfsh;{*21udepPE22F z`DGZvH}kTR_=Kd`$6tzPiKU}`o3y3MC8gYlPU0|QW9+h$6hb|>!9uA0jFCxF=k2&^ zPR+^eXn2{&OOZs~<5tEtE2C0*q;hrP33^6TGdHFMU=A(Nu1+9DSogS?)VyV~a+FfN zd=3UR%ffNjGV%Ww^Lz9*hiJx<<<-gZ8PfH#q;H*ecQu%z$EypGo;N1WR-LS$j0S0j zS_>qq<#5T`k1=Yu=1JtyS)phf_F?=7k!J;)_ASU^fpxCnk|0KBCEVJR6)RP~u>NC| ziY!9WEHiABJ~B&|OJCaY1|$M&ILIjvui ze*NLGFOPnGYn`;+5B<91+0Uk5Zwmc-v-37Zzhxv|xJT!>5TJvjvRi$nWb>w*SoyR(E-FsZ`tPpiFI?IR-VwKZ)ySGo}l?r09`v`RNOU+PTeJ{ z=jai?cK0*9$O#+gHdsbM3i-_ zD^w~UYeL1XIJ7b1F3G<%aWz@F$68-%PIQq)$W2@EI$CKk*Kx!xZKU#s;x4X(Njo|B zBrc&`*tCWr^|K4piR!`{Rk@uhgG>e{m@@2sI)0j5bEHfOO%+2BTrsL%n%MX|x`d^C zL`Mb1mMraSo}8tq=$Cq^W@)_a6D!TNRM&DHW?-q>&FOwLL2q*!wA`F~xb%LHM~{Bw zjQALuRBqKlW*IoQ7gBX#q#{+s%7`%G5(~Ce1%Z2zI&ExWrxxsy&3TWEhEd7xY?$9K zY>+2*?~8xJbIDr4Z)?lO(j-H>e7$yFi(#(D7LngmT(^}+bnUzju}_mLw92w)DqzU* z)1U8g<4|k-chZI4V1427V?jwhREA%sK79%y3rrpc79|Og}F1U3fF%# z&7Pe0GR1-e4@tRVJf{l3BX+Ib*)NcGQufc%9(ghNp-l{TFy5iGA&pPyZv17N8L{oB zFrB&u(<%M3u$hYt6gIB_W(Uk03)FcUrzkC~=&}r!_aL;6?QB@ZC^K3f#0~Z!h8c1` zZ^SXE!0_^`a4wXdb6=2si_2)Wm2|+#+Fu@d<0OOpFJTa26QEX)EU@od=Y8 zC)G1R+()byA*Xa(*x3>=Uk;etFhs1Y)t`kNIF{2BhdL_4PVrH9{fT0v7+uB}K2RsA zdShEXr=u)eN7ukdJ(x%awZN7~UG>>Yv)Sc-)N7((2(&STfU^VfKj7RE@V!*$rmnd^ z<1OOjsLxaUo_M8+P0Q2cIYqj2qds<0fzFY4L2M$!qU$nJ8J@Cx>>gv<;JbEU-#QH? zm_LdV41yTRZqtX#Ft}?HJ(7vF3-6X~i}0Juvc-tk@y$ur@}V*YQNnU@CGY#f+60iU z;zJVV07vOQHs7~-k;D>ZI*Y(1j@o1{6HO27!@i^-ng3%D)WFaXJGA^B!wbdh8r<)= ziXo`_|7cew^)Hk6cvc4wRk7G5SQR4zO6_M;I~1-!C>Q6OGR<2OJN`p;wnz*{24U&q zO>Q+}H+$J8+|q|wdC_ATZ3ATVMr;vBJd3=YH^WEZ5l{8QwpsH}H{!Px?q`oteh|#8 zn@_d(m>^`hqs>*g*0Ih3VRyAT);mhK@#gMuyyVcIxRaXsmGc+JYx4B$al9_iyf+qh`&(Q}RAIfvgQO6N^ zjyvY~NS=PL_c3_}e&P6~JdH;j!@WGiD;>M#ch&D4zm{k9@H74>&zeUavxf7W(dyVC zzh`}Q`0wR;{q@6dko4MLIUbkaw`2~_mEUu;;muB-^~J;gL(&&K<@mMyzWuL`!;ZFK z!?TW`^Jx5y&T0!jmUJv2%O3;Y-;nskSnowV{*-Yn^H^K3`3&zW zM_X|1Y2L4r*k0mY&9CP+I9hmY-RNlN@xms@W*$4XIG*G2m**WX@Ys_)yp6}3FFSVe zNbGc+PYZinGyjs=7TmwWv4h9oc4ofJZyH=&e;;wY%&Fc!UccD?0LHBi(tS2!;G%P8DF7;Hvmu8>yVY&!H9 zi=_;MI*&sem0@V*Ev6%e6HY^t*r3WV4#anHcQO`tD%q2k+?yUlIn{Z-*t2$fQ&M&z zx4B^FET?h8Uzuywg-}s4TJ}M+mvc-*H!~{nz;gF8(!(()7GMxj9f_SFzX?rQ4Bfd z24ZAWmk+Z5oWN}e`8LnLoa=?flj1I`Znh%xB<}Aq-4im57$@D6-P$uJQiq$qa)oq{ z&i-@P-5haSo;|B%ADAVCwidExo3UZ5!F}?s-GXn*-bdya3MlsAwtq%1R&C0`&cHAh zZcJbZ7x!T!MtFn~SdlC|MZCgc(>H%i^sPIM7@8(W%UkZj33E`>`UQohyL_GVrgM>I zn8R$1wz@kK&i%f3=YN1qgrGKe*rATtAj>k`Fa0y5e`#kqhB?8_HOeO8S(5oz;-rkN zEflNZy3d7r>{c$BZ4`ClF+PJ|m`GRAmF@F?YsBz^idn`^J^IF-dUDP9c;4WE@5TA| zV?l`TgvI6YoUa&8z`AArlAv#c7PWcE$7SBQs2Ox_TrS*z0GQ2R4pb`KZ2iuidTfS+ zNy0d1+=+f=8Ma&|JH)5A|V-IIb0 zgZa4|4N;N~)RlsCR^!f%w!Ob$!Vgbne&Hnr+8I_aVly%=WZWG<{dLy>DtIiT^C{pd zlbH5Trjqr_r3YntZZ6~^alnUxILhOS!)BYs{*Q~sgr)R~X3U&|LVXLA-12C!==*Xb z{W3}879YvBM}y7m>)ymZ^;KC*$QfKz?99_zKMtR|FEf^yH{$-_Xuu~`s+O!SCG4Iw zES$;`+f+X-VCvPbJ7F{?rqtZ+$pH&CuUluU0D6u#}yn)n!rCcYVYrc+oz7)T# zvz4%^G?>*??fzz8d*oKUa)Cs1H~j&f;%}5BfjL(I zA>tvXwi5XVQ~)U3InxNh&Uq7CmmW=OD-ZjJACnUZ#iSmrDDc-`q;gW2LMkVKkb{st z-#?0&ANh)0Hy#Gh_YjxZu)~v2FE$-bUa+fcslPF)HLa(;fO#Ea+9#rjYTzdqlpc&r$r0weyn~e7(8l;VKL^HP1h#RWD!?v+kTA{BzcW zlntpMGHrhjX;MaP#98Ar_^(hn#_@)eM7_V6S09lt*l0|BNr@w`}6sC&Wu1CWsUbjp0XdQgT*{6SFR+N1dvDs)ex znn8+irt+f#&s_BH)~5jJSr^S*1B`l;>xoL{75b4bU+p@#hgbGbf##Yn{nh0 zs>I(HXgR@4UN42&`XGaR8OR?GTkuX0b#2IOrXIoRT=|Aqk}Ce!;0?zj!yIq@vVyG}wmPHSCLS?XCi~FA9qSPtbfKJb~uE8ZC}q#`&}uxCXN&Ds!de(Ut57wCdM%7zH27pI()uF5Iy_4Igd*Ctm9)&mfQi*VC&$bzXw4EBb ztKC`1blBdmCkW3mRS*>{_eu`I1G&wePROrJBjl=zHdTe&DkfFj)>Flox8*ZwPBmY> zw#+m9YQ8S=^qDWk#X)Q-f!Nqh^(=JSd#NgvMWJ5kL=(N}>{=_|D_Wn*xg4q$y-gDy zK_^9NX(vz63I3zIG0^EQtA-!-t-<0r_fka>OgHyZF-T0}Inh&h0jG2s^&{zu(A;hg zW~^1w)V>u_L&29zW1&R~UpyAR2!_q=AEWHlJ{V;o`YAb8c;qeF&zdMzHT&po*G)ITv&>-AK7@-zn1898M~5yMZr< z5gbqyW{cc)0|pz>MMDt+FTQ#RuFO198KRtrJ_Oy>a)S>c(Qum+9Q*3U3Y)({Hp6Vg zY%yN$rKkuikw;}6fR>R*Q`xsrV(&N$|0yBaCl--iL@cYm&DPhqb9(A4Ap?s~s`4y; zh?lWaXS@7)f>V)&Q8uVHXjf;MVvCTr~RA>ZkJIz>a7{@CH zsL`r!^Jj57h_i09s`!_Fsu0vbovQOcUXd*&AH!+V(gg8FaFktlo|^4Ed$upI>X|4V zW~x6?W@Pbk$AI5ARLgyUm^kop5B$iWfG5ZCvWhyFf`QQ^a5Rf~QCbeH883c!pxYq^ z2@<@dkw-V~#VeA1P$%mbV-*0Orbr*qcowrfYQ`wE%Uzs~1OoV*ta4Gxr2{@4-^N>6 zX4zHu#y8fVC(JN`1GJH&@|2{E+NmNQxD? zwm{^`=Ok^9q!p0G5lkB=CsM~`d^xD6jp`rs`a!&uqW3tw(?)fsp&e>F zsS*{Yg-}Wv{ag>?z0?=+4x|tdgi|C)=!UH!5X_^(mVdxfWEPdKE)7wH|2bbFz(*N< z1Uxlw6cJtBQRy($v3trb1bfsf+CtG@2u7)1GGv35@86DVLMb9rrxxhyY%DQYk2_CPkJ5ZuVJV5xV z3-dIK+VW{C4JyjGNfi^NnY1QlRCaCDJ0bIBE0wnJG8TuHYom6f>Qf~O=85#5>yX@G z^Z9W6N+G--h0GoE1~Yx6U#YZwHo@guo*%2UwQo9kwy;cWIky})ntPKP_ zHf5T!)6khowhaDwL=ULyv(}H2eWgc|SAOu>p)I|JO)!-r{py?~Tcc9s1=J>KEAkF~ zlFeQz{D)*$OBGxeeV#2DH(P}oDb#E6 z^rFrcR;Fw0ntSW>4zOG}nL;A%rqNpN=oBZ@y;fN`$#Yc)3;K2tWT%eJveeyQI*Ar~ z+J`&%3>sa~mpAB5qqR}5GHdV~BJ(NE;BP4c4MwHd3-!?>Oi0H+7m4npFuru8n!lQl z`XZQ2oX}`lR-k70oLea7wu+rWv0fUg|w9YU8CSr<7&>G|IMJU!nOtE!v&Rt2gTeTn3`hmGwAQ$LfBJq}kD!lm=E zpNgz0Hr7)5^<`s!t+YekB-K`Kulq;v66s36t(=L8^fpVRHAFC^IYcndhY-Pv5WzS% zSQ}lt4SXr9MB4FvQ zpJ9w&NFR8uRmmc|l9cT5>H5F}`+7j}Ir_i>R^7w;tNT;*fzN+U4SVmw-ox&rl=-cd ztCd`RlwP9y{6hM`o2)9L{Z#Sa(gzN=>hVd3zmPug_j`Nb2O<9=`oLE|%>Kgq!28Zp z0Q^si^a0Ih>jST}%GFWs)9~#ZR+cKe>fZP^R`9J^_@U3%2fkmZ`ZxIa{(Xu*a7ot} z)(1Xd)xF|x$Bq4q=mTr4(%+?YIt2Ql-UU{!iT$+!AMgeBfqTzXP{=y27TKr2xIXY# zRyEIjaQuK-|NZC#N5AuT(g&ira|h%UDXs*EVCgPgEPsuDg^9!`mtgKHK*O!B>&QJO z5gx>>!Ba()(<_J0Ezn!b)KSv&!>#rIzKlqjF|Coq6wG{Ai#9`)8P{~1!NE&9u) zgwdkZvPBZC-+EF-0JFq1zZp=9`@;j)um@SjTRo$8|G#9^L36^;XiKI}oM%y;$uY|TRM0`+PAz%@VxZio zka-blbD+YE{1j$9=~W=ww%;POyYSNuS`2;JLW{wXZ-N$v*lp8_5FGMvN|0i%bSsB!A}gSzvRADKMIp z?0Pj(_QR;;?))xSmOJYhxU1cw2 zS)#eh%=B8B9?Q&Vt+kwI$+v60YN3rxVNu;z)$qUnt{T2-o5t(b?%vuh^T- ztb6{=Ua)zEk7m?!acY6fG5<8Z)xnw6M$|u!p$dkll9^&%u1br>)#U0=v0`oeZZImZ z5HG6Avx=@Fj|I4(e)mGPs3ih`xFhoUU2{*7nyL2JUs2Vr?y}Sd*+#M%lx=28)VgTW}ogst(9{5OSWSBTw@9k5nP6W0zUwzC$@eOST(aUKbObMcoyD-O4b@ zu6Q7~pSr6CB2*2Ps5w7AUe*N>6x81m)s&HHivGQOiUL6Pas3k!2)&JAZj!j^e(|_K zrF3*m;y-pNG3XgV8$1`0x>7Jl^DLE=_;{xRmal^Odyo5TN*AQGLg6^-dk*wHA@gQp zJ=J+b<{}RF-{|d+mw01<$3CG?(YM)eEBcnwzUTB$-@Mjn#*(=geH++^zUA~s-+p4# zH^0oL*bFe^oR=R*?Vdhaf$W999!Kra@hfV_32qMovZ&ostI*FV^r_VDS}V^YyW(Ed z?trphN5c=b8*5WLY&q4e_NI12ty;d`r+ZMlZtd%ruHira`2RB${GW3OYbp3e6MMXd zKczJNr#t&kohey_uLrBU3E$F`HH=r557saBtU(p#?!QC--uztpcap+oHyQs<^v`PG zkvIOk^v^2y9m;(Q{j)MmvMc@{)4vlH0J4wk-)GRj+jjmv=^ycYiPBp@R9r1l;e`sfF(4<%M-RO zd<-~O*AKxPCoyE2gW9UCU0KS-Qo|iXxt;HF*Pk_;z<7~UyKA*;jM$D?GE19r(7>)! z;jIKjmEsf9#D9$CFEsJ~e2I?`IVrgXfj$!xTyqW3>MT}QvAZ(mKKmaF_cJuHO_Oit}o@`os%Ohy(SnFZK`-OC07Y@4tArd5-8BR?q}- zNjy8~I}*u)2k0WE$*T2+6Slp~Lt*75*Ce(C0hFE1I&KSqgt(A6DRI#)$8b)OSaUO8 zO}9o5CnMPxGzwg_%r1WaR9$9|D|r3aD!Y0;pui9%AH-!gJV_|s8g6% zZ;SYRl#@y2EDscdrO-Upg?<~&wrZZn!UlRJ)+O*Nf?`+#_V|wx5dvleSN5v8$L5)l!8rfH6~%KzyF1awn(bgsr^H6H z(8cmwX8C3mw2_{IHYK3Vm=xN~=yfD!(|7Eu6cSlC&r?J|T-B^Uo(d3K=&TcjkSQ`S zlxsVmPX_h{V&6WV416XDz=Luh60n#>66s3X%XspxJJwbCnHx7^z!tp#mj#2-`@a?WYuiM^vB|dMN{Z%Jbiid$s z%11%=*TuzggaBk~@Q<}S^0MXZ0)*}BP(X!3e4|@>$N!7YHTn)*Ue$tRb8&aXHCp0n zT%?;Fn)o}FIG(5FG$)*hE2o9b2@7y&VP=fb-KOpuq37U~c|kaqlZoT1ypT9A*|LUc zx@rEqC?77!Y3_82(JmvLAlc$BhPuU1mGD$r z!esu$TDhCQL%MK7X|oY?;=zf7;d0hNxmUb7wK+xlYAbiig9JDJROon>d<)0wJh8fh z*v&)5&lBOKPsbsE?a(UG`9}%(7{N!>#>Af~+?6N#MmVHq*rq>@`{6Z!&PbVsu6 zH(rR+e|jZ`ocOrDlIjfE@}}_On^K@f4PKZk@wiZe&#V{{lfb}FJA}S*nF|ZdjN+qa zhWy^2%)oUA{$%jnVK~3*X-Y=UH8bQJj?x*V@-VVrYsrAnYfW2Z^cmC6NU~onbayuK zbBXx#YN(r;4oBy=1di=8u%HnuGGetru@)%S0>#>*Ht{;|X!F}ptaY1MXJtL`(cz>K z`z|^4qS(R$yoO0GBX)(i>sr%kI;m`0sy9yAc7knAt0#-x%f*!+zP`339y;e3eZ$Yf z-Ls|e&8Xwbm3yue(%f^!ZpLTD#$^6=k|#domVqFX&~w2iTycPmKn}d};wmhjRVkm< z4;#UNcKsdVPp(rLcg>$j{2FHs7l#{u7j8lCuB zME4`I@c5hXJ+c#rDcaqmMD}bP!C!GqR~5jki*9Z&eu;q5zU_4bTlFeOr+6|;{1pFp z4U4MCe258>c*O=DnIZ$s@grm9BO4Y?b3{&PxO19=D5@a)@|vUUVG~P?_;^OQzJ9a} zag>?MQg@l2Sgy|#Im4Xd;^zRf$`za9LirZajOaqQBSHm!tl*(LDtNeGJV5@Hpau=0 zmcQab@?gD}sA{!nC04S@;^t-WTJtn~X!K3_jZq^!a=NX7aBg8Ko3Xi`lfA6E zk+t)ydUn@G>)aP<8+S$0w(mPNb^f%*M_cg7`z@ax66zZ=y3Xo?xV$n=DVJ=CsV6<4 z{M zlYDh4F{_&i);=;eWi$_H&=f!a4Wc{LGOKe+o7?m%YmHB-j!l_?HD&|t@emfph%I@@ zdI*4K$Cf-MzuK1kk%tsYYtW*HPbEmT3He>ulGh^S;nHpT6Y>dyl&H80y3>n>+bd84 zI&Ex={)v1rPM5Yto2|EDiAzg9fuL~iYEy&cS|r-uOHl1MYIWh!Dsd|nNZUBMOiVRc zA?A3GI1M~OHwjelmRQUC^&|_Y++&U}U~?fzArT!wiy4b$8z5ZbEf=vO354@@knBVc}WWYFvYJ#p_9Hje~+*N&_&h%T&g)Sno= zjlVgH>$P1T$r-tjDf3Fm&YH1T)YSX&6k6M~tA0eld>#gc)s?J2$s81IN3*qF*MiMW z>m$x+yEyoSuXraT^0Gk78*R_Dt8Ch(HEJ0$0cGGDPWq8Ch~BV}AL6tK!Ub*qK=f;7 z?MG&NbiHTnDBQ5)3C`?@Zs4d4jxazpN0(meHdja6{RdmJwZLlDx^%^(I?|~HTiEKY zezeh#<~-$K?KiTIP`&bwMAJBQ&D5Hf0J2JR@&ZP+u+pqpKz6rkKUXiVI&5w@v{N%S z=)Mi}FV~@oq@X_Uda#!=g=e?vQym#?`V7f| zN2!+AGC}nd0%nW&N1eDJvEgz-pz;N2h+@+WN~f)6+kYrdiAIxuXJm@ZT}f$j?82IP zNL=uzVM5A6;-3|AkDKlVX5KOwMm;%Y%*6{AF1)h-go|r$z46NW?2B)^?Y1i;1CwpO zMKyB?NFOVQKvGw9QHdjRvN>^d;=T)^wB^L27T2RCE_!Z67maa5n7JX7UdYDv8%Q>c zFqACm_>hN(WH=JvIbDX)UfR6h(0)H;1euK3#4)`F<)1eFGD~BEoK)kM{8w)joT>TN;b=Lb`(6y1AM*BoWfO`M zP9iF`;L*}udTbaTubld_Q^iAb6(z-0w81mz`%r7VjlJ4zENtet@Nzfv^WsU9r%lir zFJetxEFP@1rs<@LBQ&mVQk|5G3R8x2;C9M!cQ^W41_3P!gYii6N!jmKxQ-S_e3E-^bcr zB}{dIwd>W*kM-hD%(hN(5?PEcg;#O3uD}%=2E+hY-A)@+z~xzBB{d7Y1Vm4cl->%y z+VHve>%fN%$k7@oJbw{DI+_AfxbVVdxIZzo?jQ@&-38jptogi>cwyq!W!*5FQFvkh z0Fyx~fSpe%VY|kvLcIXi>Rb%01Z-KY&Y1!=niP;}OHWsW7O)|S0=8-)U7Hg}r+qri zWN;~%4eblFF4SBSBSMf-{AdeuipOceeDPR1xSZ#bwX!rU*JoGHOh06{_y=cfN{K}l zx_=k+`CXX)8+m7nbwJm%A5&5V17(4G(9+!BEW}T7_SdXQ1a~Xfb3;;6m)d5{X*Is1 z^QMRs!)_u5M_!IYHaY*gPXfciTz)*&W-iaBz;T(m4Vs>LE1651V~c8FlLx{hTfC#i z#i>0otye-4yT?1)8XtUn(Nl(CD)@)D%7?EIa4PZY8af}ti=!@L69Sg*_s)1@0Qc>`l&{Y+ikH0?!>j*4<)6-Vuo?q zKG9DsV38ScA44A5D?bfyYz|9}Al@;56-A1==8Kg7J^2{VTJvN!k|K%M8qn6uY%Rtl z23s2aq+5Zp+%Ok`thNGU_o?=3Xl2I=$F7srkQ$Wu7bl59UB{rnonMfLcCMnGG}UgA z+*a>V@6PBYoPkw}J_!q$rVLN1uyAfF1U8=4{)7-18=-qiFE;(y4Cs~2Bs!EMmcr?A(t6X6Uy>r-ElFve zu0WSU&&NoMC{#8kRul-lfW-sVWNjPIo+1;u>Om+E?AyWmuL55X;%ax|`myo_+__n@ znjcU{%G4he9Hcw%Gk5NW7*U1{+^!m)AslDJl6hR&}V;7&*AOOB|xYxo+CX^ zk>V2US|A@5uaTakq<1Y4x8rLWlU@s~(ebtTd)H$0SBsHeOI3fhRQ0ZE zQpAG8QyIH%M@-KvZLW;nytOj6s9hZx{e&SY*UGx=g_l?M{35n(GQXl%!eP-^$as_a z=kh^*J<6}JnW$`fv;OOqvU>=@EuIh`D%&@}+Esr!C(z0%_;ZPsLCI|W+LCybUtMEE z=5z4BVL66o|9n-wY)a<8$V=ycK@KFuuH9;wFfKh!8s;P~L4Xs|4D_NlG4)AEOFaKS z-^+4D7ZkV+t-MMs70L#PcL1K*x)qKq=-VIEDq0zS{rHfHaz2qBKgc|VGf>@@#5N`> zgC8eju*i3EAWQ(;@(ervDDiGhG0QNb`!XUMOLql{AJEv$CL#uyh!pQBtG!V1K7w6b z{6~}_A@gI)hL3oPA8;Eg>z5>Immjnun)k%}u!psWVI>}W>KOWmoKYB5zxZwz+QKyq z%oEniiTa53z(D>~Nt}l&H&zDQ^_JI(Hl|Luv(k>XpO>TUZA6gJeJ{`DF!gzygvE1y z#DT>30Lnl@65()FMWJ3fHAjLEv`a;#3{pRM8Jv1?SpXzy2o25FZr!O}wTm!IuYRCi zv0DXQH|aKp{zD66IErDU9VlWp0b-MyX6CICV{19 zY~}q0!ZlsNOU?6mUhKMrDo)Uf2-I1oNw;+8hE(|$?W$(7wNj?-1MQl2%5UWTIVsPN znvGh~PJ%uSL%D%fsP21JyXzs$Kh-T@_Ei`NWyO{Xf+az+1ep~YUd}dcnD;dBJDESh z`k{zH{>AFY=5Xx)$j5N(caj{4&0CNtuaV$pAfiN-<4pbf!dc?lT^JARfF!zh4l$sv z?z4UasCeM2VFJadf@NIGG7g*Xgw5Av4c~({$6CXzT~IcXA6;0VjA*DHaQdpx)Ms=a z#hHjG82;=Q*i4g7k!>(*>o(@zx_X~=5lqzf%^=y@#8T!pvWkr0A z6|BgMFy%*#?jHzO$^1@!%bMm?t?{qIf60Jf;ia@WWbVdx=o4II-NNrc{OXUaDCT-g zS7v4WayRF5Z7+X4*OcI>ST?4(aQR(=%avdvsIJwjq$}R6Tck&RG8U+$1vDb1I5>+EYAK1 z8?X4dpBf3@6J6~gRNGxovMc~&PUjNP1|exN{!k{x^M3Scpe2aTX9BmM#xiNkMSYKV zd6k@Wu)2g#I74igK^ks6G zFvFy$NKHY*kVLa3%UMR#mErp|}RyW}BN>n(+Tx#9rX zF~ow2XOR(I;B{zC1DIs9#vL|Mk=R7Si>)DIcee0UH+9Wka*Qe(>Ml#S9$AOV+}6Zg z5{``t#};__U%-D99}9Y0kC1@%NH{j%6T7CMZMWUr9W9cH$f%~W<o4>(HuLC(>sjaSc2y+M_ylfpU+Ms3dG0 zCs9W1sxkbp>fQI#Z+k=(JoAVW>e9^tGG8z8d)e^B?TUAjjvnM(nk}yM%BWp|k zx92OK^~UQW`tLNxs+rT8Bs#b38HSp)u=#tnb1_xk5V6_~v#EjE(N;~bHLf$f;p_ZE zC0M4mVndkNQY=gdpN*DIPiRTAyb=P-11L`qj4dyUWR0CTvi?LA2(gLuWn+L|Ci13y zoD@@2&KJO#O={0b3>&{sj)a=TU{}nc{A%wIY^oBZsX@7$|A#X9h62R;W*#;NCi8!) z688%MxLK4KvkjAaC5)%J$viRfh^jXNa#JpNK{LiI`qDxddwZV;Q=ckzDQDI`$$?+Y?v=~WwEy940B^5`ZvKDnC5d-+syMB>ZNjl zYTGaeCcG8<$U?tmGOA>fj8J^iI3vEq;o`L839(%;eC?Imc+8gp^!yVfRH-^)OgwrK z%cY!{pcR;bs#Ro7U>|)Qi!3pA3(dsyGhdSl-JH0IV7E%Ab2#yxo!#o4hovn`y)*e7 zMpzV|LV!dW>u0EUt~n%CZAo0t`e5JyKt|rVM{3=e_`TAfi2hA@deMgU(tKGOFz|b! zV8m>!_b00GiXZZNbPVP;xui-zE`qszas^t(g}^SBYr;qR0Go!PdY~FDg@#6HVvB zy@5SnQD#OAW{%+4EIFXMsYvqUDW>af0fC)bok~p%Dsebc+CKD|oX^m|(^skkrU#z#G5}kt^k)VWMzRwYX|qhFNI#5J zt&3SkT(1hn1_&UElm*&w7(yXe>ydur`Bk)&SaY_JtQ}HA(<4%`;9xTUb}F`$mEAI! zgU(P+p{?^uwjVhW;=fl8g81*}e--~}HP#^6a`pX&?1nEGaZ@T4bnxx0&r|!WM5hOd z#M%PB@j%!da`Y0i#Pgs2qYQqM7lBYBbWsuK=`DxEGE(eslKI=nSGp?{yBc2X;I~sJ=@t{uI+akQ7@88beoeB%W0*@HqH{u_N(4o~&3goYQ71O- zqU~e$w!z^F`ha^xK2Ef{3-V7Hdi&k7y(2-#z! z13P8P zBjZ^ea;`zh20*hi#lV~xa7r3Zwg;Ro+A>j>r}#qxnGvoG>BCP*`GHtZSD&3BHq>Ve zXWH_*$JxQJoU>bAD^PFYvz^Wj0bhs21obDo24G}Epv0iB{f?ELQL0rPWQlbZ0Y7dmR|yoZ&Ane@2mt6j<%P-qS!_a5O!f?Y2 zy0Om*tqaSp5QNbRMO$40dNJ?@sRdo4YONImeUWzEWjCS6?{{x#E!2WmnDJC(W)_PgOhSxM~OVt=5d( z$?cyz|B?mGTb#76Z7F&kFe`^~f9e#mYhxSs?baG!0vyb{#{cnYq(UyUoJrc{1LOmA zL0y;Pj?U{5b(2S3bg?c~NpX-$1k`|U{oH|2MK?`%<%E!SjkwFt{d_;T#~LwM(&}o} z2JRlcX5IEl(HuVeiH%-`T<3Qh@kt)Fh@OP-Gi(eUg4wQzJ<1OF{cjPUzCpfy-#ozzpNnng6dmH!)#~zAJA zJzgpnVQWreJBOX-i)zlOSj`!=*)?N2e700;?$^!TvOu(zMXZE5E&|{>J9YLU60-u% z1NC)cRk6Uj%9q+tw3U-sE)`j7hJ8Ed0<`TY%brJv!4k^5Ok2s0G(i^KTI*WmVGFM8 zTJ45&Gdq|4!CE8)88%-|oD9HyHSW3DrOlnSGQUb$YE80rOQvY7rCs5JSNkDh z&lUeCCYNIpJ2=D)$1m2mgZqNlo=^`yJl`{G-xZaVRVS=_;un;XfUoU|f?Ar4zdiaIDeYR6Ai%67-L1DI z2I|p0!vfkbo3-cjg_{Ei9S6oYYCe7NlVa zqX9!u88kbg%M}(~wr?_W<<(*v7`VC<+8z=lQFemf#ELPBe|IO>_;%0zRachWZek~; zIikZ_nj|Gz)fbB8uL^bAvy+B!K2}#1$c$#cE?*`j5_~}xZ;QmY8Z2_sI-rE zRl^ZCuCLb{79`J&{9o+73tUxI`ZvC|g5veyt!TP!OB=das9i9-92E3en51S_Rv@5| z2n6SN>F10GK?RTKQ4~p2@s65?hze?n*5su!tW29}#)H%4AWbnfQ`+tPzt7swg3XCz z%{%Y^|Np$7&%5B+&sxv=uC>?ww%1zcTIUR{pW{mBr5X0?@qr6Ji;l{NA)F6m(1yQ~ z0h+wyj`tcmV;Dh*&SXm(Y(Dega~QVTA_Zs+o;Q(78A+aiCW-<@#~sjGf76RT4!!H$ zbPFYwY}i7qd$s!eVeOm|+|QAXwZC@wJz8wBjh4CFt#C-~eI2HCEgZ7;zTj!?3x^!K zFL?Tcg%8y_FLjvKos3sa55`a7HMF(tJ>jg!{_z^yDKGtYm7_yVT~K~(klqj^@T7G` zAAaHYV#usAdfGGT#cv=ctSy&M+z$GC%$R0k-((IS5(U%hA)wh3gS0RW*mg zO6EWY=K!b2|7+=QnM++?!z3g1oANtw`Xf`2{`IY-za?)jyrSd}i@Egzr8wol$izP( zZGZNAo9z2kco-m~$ z5~eBX4gGU|NKH)`XYWHi^$B~goF7u`Q=h~hvi%L$HuN}?c$l1Ju6it5@K+sl%+ao|y$4rO zr`hk*cWDg!6FO7+#4`h1&yGjY8CR5*x2b4gS7;fMe&nq`${UYHxc-H&kaxLo;SSGb zZl2XAjy_DrLL@)DTVrUytNZ~T`u^VKdRSon7gHB}1AjaSBdXyc-wd&YUh@D=Kxk%x zIR%9LEgj!t&?3sk30vDUQG?IYNb0ogC-HI5{54&UwD9G50tODPeMJw(N2TK!a|Nkk zcsr$OuQXloZCrkO+WSyvd;uD7d^Cq|UGdRdfh9o;Xgx8vNw4CHxeb@j?A* z4}ZU+${%jI<6{Xy(30@Uz%t}8!$QOG{T!d%pZ>Gu_K#j@?+C^(BsUDeFH_^&J-({r zicdV>{>Jjm;f4_CPC<7BU)u5Ief&|ct&b4jSZ=F91{JiUZ|!dy-`Y1~qTh7aHeIg} zjtr64F3~uV@{Yc^mx7NdETr1$UAh7@bJv?_ACT*`eM5fOQ#FDp=I>Aem(;c?y&s*~Hq$xWqWvC@DOX{blB}G~C zCQ1Foge>UkMu414sZ&Y+h}7G&r$Il&&}U`B?cGw3t~JJzcZ<|#*%NG*yz318#AI9j z7kE9qNlzF#{Vq#hu(U`^u#d3h`J_!&LdwIIynh&|q?xhCg#kI2lHj7AHu~n&C#5Hk zwB((TdU+%)?=|Ri>pNTWXtP+(rEh#c2)SsPb15s`F?#wqOWt~Ek(!ngXWXiibBTI2 z#9Yc#rl2F81@vUcD7!u9($utsID1;orA*-MNjaBhq=QdDu{%h2$r2dWjLo;cjMbFFF7Isz!y()#qKut@ti~&LxX>0mG)fL$dFyH-104r9<=m-w336z^JFS$mKABjDSu8%MY3N`i- z;-WN+izZ;Pf^I!>!Vme`rczE%27ZgNM!Q&8(A<;_})Z6qzU4Hz3pNbfsY>c@mcAkF~5R;l)f$fyIJ~2@<9Gk zvyMxD+6|~dA?!x?ML0Sg9ZnZb3%Us?_fQRV7+f~a4nii<^`73Z+fmZdMgZ(08H%kz z_c&+A344F%>_>&;R_7m}?@MVPju_yhjEn?^n6#|eeg@qbL*WsY=ti6C9d9sll=7?u zBCNh(Naco3Z3#Lm%LPizgGcArKn~sYO@#{OR~1K;UwOaV6zmYr4l|F<<7rX6i0e&1qVt=S8#wz0vMGJFbXVKjlqr?tkz&>4dwxBc>x5iH5T4~RUWP% zY>U<1pIyW0@{0CHhf`mG@Z=c_oP`f#VHsUDCbZF5OTz{Y`K>6TLZj@XJk)XRPpH@Z z%8$r4`%SjOhvTvA8e2Ft%p3bM$sEzBO*r`X<@NCP=+H>Rdkh2qN`k`R&yLXa$4C(x z0mozX`^#@&^s)9M*-AA(tdEVsesI2|k3NE3!qWXk8Tw#-K0cz;riqxZa9!SPyk{D+ z4cBO8;Kqe$mt%U2tDY7IZLuyKE~g5NB{uL#vWQ2;$CY05k?|AA2eh#% z1K*3qR1dMoyoc&}CaslXFKF@#@5MI%@X4!cG2e=H9VkI|yIpN#3;wVe9wt$>Z;NIH zJLYibK+OF8wCoPUL+AzG8sWkOFJ`Uf=8^d7HWkSnb11gpX?$pV`keRFI9e4y<{e~} z9KZ1T7M)mjedv9B@Atm_w2DtF$J-dzy$SX%!y*8~YMmvI8lVxbAZ(bz5T6Q`{EcC` z-sX(Va6Ev8K)WN-Iirnm48R!yt86X0+6E1cw8v9Zk!^K&k(v?WTU5$M1o8|_&-{S$ zZKS*fUDDNU+6nKsSI`N3$F14{BxGPv23`rR_$hU2=dqahTwxpbe%z~jDN zd#{znL8tkVL92?e$z$gtxw4E_o?{@e-_Sb36?-ZaL2jTZHU1Dmio4&5mZ zmb?(;2*=|S)L>h|V-$haI6>NQFWi+G?ksaXGCUk~cKbGD9DI}8ei{{vm~$gs-^m3z z`U!(r*VBh^MdLn{y;ovgQ@6Nc)=qNcO0}p#QDK(3@4+8e%mx^)vCKUJ!^lCYx@B&a z)Fp&l=I)fbnGu$`8=;GFJ!*{}{Mb>;++s4(`fjC(!Xm=RaLQscdQT$_QGh9+1eEE|XJfI7HOMcGqjz$lU z+YypbVH^KAO&(X3UrE+qjr^x=)HU{aTLFFM!ZmA0DNAHcvk#_CVGaaGqGtgu-$j?K z(2MIQ;#)QDY{NG_`;Aeq4)}-eDqKsWHT0k}lbu}csBfmj!#L`Q`Ze+^+7>kiRTkf2 zsDL*w`aIS0<0P6TIX~YFkpKD4LdaT-OJ}QbDQ&^PZFs03e5~{A-}t-hq2J-1N7b>; zQD{JS7?MbMhWO2QN@g6;#y*|JG;5+WL5uUD@z#6{e^~#?TpH5iBhwV}0fRu^y+-3z zjLu?lWfQF|P~oD@A&bDVz06ovHGa?-D^i2so8At^?zV=uG5FX@S0%*WdV*GDBCu@U zQ^P%ao%2I+S2o?tcr2>{J9@LPjK1|0wtUeB9daXAV-I#mzmE0p{+8Du#y}b?JDm=b z0hd3VB0iAT#*e@txg7M%Go3h;PoeC9+SPK*Z^>&!h|TG1nfo_LR2t8sG&bKwX8$XX z{hvbb+C28pErBCr#E&9?{C{{n9iz-GB{56lr9^hWEJ=|P*%PxQQ%a~ZD_1k5q=qHP zEMrDYp3B}E4oOHECy}!6W}%yfxTWYv+E7B<#WsY&Z#64v?hh$HZLZ+Ci+DfY6Exw_ zvBjsy3piqVz3?8$Ld0nw*<0xG)y}+efTQ0=Md)Z7{FXh~yIj5|_yP9DevFEYE;GW= zAy4I0ES7G;@g;<-5WqYG=165myZY+a!R8yQ$i{U3XKRS1CM)G!mm8^iIgMW-tck3+5G4}R_i`3_x{66 z+v5#${{*X}!Mk99Z^D}f5XL;Cyyq}i@($^OM*<$`MZTwkRoJBg%zI0y><4f5b}-<` zkX|PY`vYVj1pA}G6W}R2H+Ynv-YtC*02IxN>N}7 z;bVU2%^O|cV=EKpmzF`jYFzEbZ2FA-DMF85!oZgG=~fi@XzGAzlSJWotpVGn??d%) zokiJ?psTQ`FGXUx&d|hUEB5ii3au6me~Qdj&mheWt6U$x*2BL6a5nHgayA5Z)U_=? z?0wg$9koKf)818Ke7*j3B{JG)56<30FWmk0PgDv=u=g9}0S4#v)g1+b+IX4i$nR(CS0T)l z&uAZTZxl+xi4m?-UX(1OoKOX!RUPY?7+09h_2;PEzh6YB5cRFV>8w-s9#Jl9$jHRF zpzqGc;y`}lvDh0=jYxd`Ay>~(Iz)=gMZiM7jn>*)>^L_Fp6h9hZF?+sAYOC)srp{% zbY&Scwt3>WCdb)aUm!4{*k69!vL2VlM7!RL%K17qJ$Xb_PGh<~IV~Dn=Ut6F8nLX8 z=~P<~(-@WW&*91Gj)JHE71QZd!N`lQO9hYp=y=MO+hxiBv=_dV0Mhn%%+IGo)x+7&#xpgn$)_!zd+ z1W$mrp*>_{ppjo>u(9GJ-0K#V`*ZtQ$vC>yp2Ch$xxPk#5MBfb!LjWBdxz{!@B}wC z2VV)dD5SHl!WndwSljm$*+0V#To~}GKCp-$+&HU;krMBlEm2t3q2)e+#t_ZD=jWrr z#V}Hcj|RJ;qxQm95c~&f-S>aqGy7_QzB(HGe6!U=XbY}QF#uOva&LuWyhy9H9X_wy zI@MzItHbFvmfUa2FIS9y!|V6HZhS&?1xLVLg$MV&9Syz~S`30jLGabkMSXi%w?CbG zOg|bN1Y@wYXaij}Zi+;&7JOkQE&#dlIKuN20{AhRaLEbg6L`UqdyhDJ1M?=Nxn17E z6HScgF9p}W3N6q(!5Xl;ICv8@mi?byncdlD+24o{Yr#d3L?MNHWIxp8l{LzBf_|I^ z=P~;FM3Bg>YhMt&l4gH7$HQ^;i|xBpwi~-VA^q+$8VngSt&=Uc?vSmZ%MioE^S!ch zFKvvD_jr0_cL2NV_pm`ACg2MS+E9BRY6e4brjZ7H@?43I2_sEUUO`7AJLR3w_Zcy7k)d5j)SD`dfilv#);PEW~rUQ1?I@HAot!Jp5i zxV?j?5x1kz8F4$sIu%@s+i}P+yNIwA^u$_emjM*wksM;##>pWOHJ?`GpRX77S2ovy ziwHlBY2z?V#{3HR6;Zc~fDf?cCiRJg9X8F;S(iB4Fo8Hm&^ic&@ni@ecwBmmdunBG zJ)utu(!wgY`&h9=(e$*}V*OFd2{JufW?@OWg#W%kX`;KD!WVU=C zjX8WrbA4@Q?UHYN<`;X!T8y{Q_h7oAtML=B^Iv_i@mjWq-Dta$+50$`eGy^ zMh<>I`-(|XIp;;=$ih{k5v!?hwk4^fG1djQs1hj0Z_r^C%75=u$a^GI?_`@RsBZ+N zBRYhJV4U@_;{ZNQ&AKc^GwApdi`7&>u#)&4_eEa(3Z1M3-oIV)`5LbBHf;aOhapZ7 zT1$8tG@z!Tz4s?zu3tZe^+Wb!pw_&3Q-Ag z`(2lxeBQ6|V4)iSG@nD@&h-)vKG46`duO15!*Jk=+#fVYH`(9YT<>6CB+hNf+CCPW z{;&a(d)=lxtYz0b0Ku2x8z?=oV{M|#LaM=tP(2P3W1ZyFMjQk~58huwo8vhWft0Xl zsre!tcQUqrGdKpWHSfz8eLnB4u;4iN^j>EeIv|C5K-+MkDS}3O<-ET$TngMQIT_m# zr$6Uihm}4gb2yHe^g*b;MSb%wH=;_R{F%&ijZoi?R2?|Uk`Y|}k%pij^Wg%m;6E7^ z^duM=iKD)r0edre9iEyD04`UNzvJZ1LVF|242G_Ut42PF)ANIZ2W|Vp=a^wj?2-lz z2F5oNYkMMRP+SZaq@S(o1V@vwX5ttdd+QO)zDIG(=#em73uM_Bg}V+qJ8?GR1nPR9 z5ra?J!(0z_jvahBtD|d3NZZ4)gKM%-P>+N+oWmhD3?Qjw^vr#skN5-WIvOk5^0y^& z-w1o%NTUTGd0pt{2EK=M>6AyuHRty_NzEm-y!RZPy_-AzL__wq zU@F3LEQMUxZMpZa0T{Ekj~wm24upb2UE_~|2u7QaBW0tpCzTPt@hG$Bgk*1X|5-AZ!N)tUuT9#amJG z2EXpG+j5ifGna)UaY4rk3=(aw7!1T>8hyRqK--P|a{Wn9_hr(#v5{ehnHp7B3{F&y zY_uKr=(d5-4~%KF4LodktB@MPZlaFxRg~Y%!mF5qjy5 z_ucmYMC}Oa%&+^L>=Jn>CfEK zxZZl_=4u+>c;BE^N35cZY>cX^MfP~91d`F$>r;SjuGL;@;|iCbg(doZ*;~9$HYhUp zsn)yDBW)$9xdq3qf`wkPpgu#UEHpX|A~1Anyq^bgl4^Mhb<<+7SdV4w5nPUe`!p=$-nJa6*DPcE{o4WLgm)~DePkK; zI=ZbUHOX>sNR8Gk@%6ocwD9#kD4(y%XPJEN|AqXRl$?;yx8;-8EPQ=y<+D4=uCH$& z0;pVoJbV1 z8p|?#>xCS}_cy5@tFfL5RnB}Rb0_m8=5fsLV}2d;Hq5`QGW_{~c@6V2=5FRQm``9n zjQO3+`!Mg$ydCq4`waiTVE#Ae?=e5Zyps85=F6DpG52tIyYDyrdy~y7u|~7}0p>R5 z6PQn8p2_@9<}WbMW4?&_X66T(tM}Y=z<9qh-|J@=q`~&7+GXI%*D3|}+ z`8^SAwsZV`$MWwvU2JSWp806TooD+YY*zV+yF;ARXDY5g)kB)Ceq7crCV#`~R57(9--^4INWw!tFJ?#QTRx%EkQ$Gnuehj}COOt{mBj~f&5l!4bL zusi1Z(}r2SH}sj7X5$Aal&vPFI@0W^{iY^l+mo}hA)cCS&q__q?l%n^uoLX58R;Z6 zskj$g`j^RON_$dnHe zM&~Tm7WePO@D5#thECX3)K)~E(8MjD3b7&!OR0l|*nAB>HDQ6^W_Yk1fq=DuwV-Ih zTHwR9fVCk1DNGb@6&Gm#x2fBo72=Mp?5srg@s8VXPfwVdoHQvTYl>N(m7Ja7$VyDU zeG=rr-mU~N^d)mtW@cJ)bcSPMS~A&B%1F2OgC|oH>>|V7FMHZ#A;!+kOxF8jpHctB z)Ffc+FvBPkCruLeEJre#VU%i0a#nh3`eZRVZDwXlzogVeyCKia$hK!EW~FA5?|20T zmTa;o!GJBEY3zgD-Y;=#LS|Db$;`^gOwO{WCPPB+xpRQwpL%b<0d5?l+@fN^3#Z#PW{8V;&i!wx(WcD z0C2dI03=_ppDvT0ysV$D&`LnTxu62jLYSRwp2sp5 z_+ro!QMckHy{@=YuXE?;@7JIQ zX4yO;l|rw2-`djX20d%-Sxpd`8%pxC+>91?hJ zAe{v7gU&^nZ8$@*b-M~gBEC3yw(c#$3}gp#cy<7z3RM-f>RgLZ?~lcdCK zc+qUwXf|w822r;du~~$eEqYn6TZ~j%v=Mv*_-63s;=<0Q`h}evK`2!_DnYM7zXG%x zbVyv-Sq#}h=!-z5Ae6uz!0y}xIspHxz}=8lgAR!E6$|zA6^lTn`uW{!z=_ujS3|Z`G`dR* zk=Uh3Sa<1edQe7{BE{XMMf9LND%~vbKvuX*7tjOA&KAK8_U$5Px*Y4A6U(-+Jh*M7e zRIYw15B|H+6uRAc^l;H*1wE+5xvA)wY^4P?7AVJfP$_g%P~C^s8Gz^oP+ffSA~TR|_2W`EbhjEbF$Dv*n+An{v7-JD%|-5fMNbE-iHL9m+xzvk=)?HA2v z!oc4-s6NsS;xK2sIA58gpRZg2nghxM%>~T|Edv#c^OgDFs2Y{UAQbz`T+lp_3$$LG zuSB(|MA5D+0xbujh*z!xp&C?f5Y2v)e`HVZqj#YyRjw9w6=+~l73wMw-ij&^(z60- zS%LJcs1$V-NXv=}HX}_ckd76IN5w0kSH<~qgtr`imu~|h{N?bwd;w@X2-Qy7D>-3M zZOaihiCG5wJ^J}wu-~;3vPw_|Xg|z|LphoSvR87#>_QssLVP8L>cYYbl-PxP@hGIi zUr4oLA^LoGA=T4Ds)-9RHZUM&3vseYKe<#txm-V4te-5=Pp;KZZWSb1CM9bOp*UHg zpRCePR_Z7B>L(BACtnjMcj+hh=qIc7lZW(oo%*}E`n!4hy9E-tTR*u^KY37pH%EVW zp8oE9{oQ=w*@m8V8!FQ_RE}*6L8wgIP?@%s>z?hKg=bqa^eaFmpfw=$xZ6;{wxP0Z zdr27j1<<3CZAT^BR$;Kcp6!L6Z7ZdG+e-$kf|c-WNA=pC3(5n!SQ@vjk`iKh0BnXO z>f?3L))-*H#ma5 z6@e;4TcG6fJ>);4ScYUE|Fx+3*-b9iVJ82FKjGPX7Kfpq2EIT zd12!c@RvYqNPhuiRv0g!`Ma=j8BC&X4TdypFpOD))@uz~hc&2OYxat|HO{)VOYwxs z&=Jni&1ur1Wt8sGa<0M9Y7JV;HK?^~P+Ql$2&xcuYZgm?Fqm1hvTiMTS0M#ty}oYE zAs~vRfN^ze$+J8u%4tFxFJ5MNFjtD%H|2QEAvjwlZI(%Ix1jmnvQE@(!Psm|weajm zita}ju^&zU{&gU91^bcB`;jaA=L^H0>`>(P7lKHRu0vwh3(tPkmi_BNYeB1p=fE7@ za{%S~0J^FD$mRXW<^8BZ`(K4@9{4L_tZvg|^e6RE`cVB*eT*3UWRbEf{hJ{kC#;`|(^etr&`;5lga=AfCLlP?Sz zn$-T}I6ntX^&B)^bC!b8T+cyMJqOL{9&{Ib&~5D5 z0C(sf_MkBAK@+=YE9_T_^Eu`Ek=^?F9JGWv`yfVER$@q8iJqtOpkZCD<3bI93?Z8F zN_0hgazx#p`QZ7W#rlbI{RA5Fy%=BR?1D`Jq)YV^yY;u$>u;e~+l!uHF9v3NiuDul zVGqi8(K`J?5oQ-fyFeJb6>SBr1nmLs78fwGzEFfRUbF^8Sj<3*FuN$iSg)v3cq*6b zo=W6eB`P_B>#0NzS8gNj*;B|SsoN%+aVQy;dqHRmB_5@vvO+W#SEG3^uErdwxEjNs z;%YSS#nl*N6<4pM$6A5M(-%WuS2itEUa6%4o^e38#+<9E?3k!(FQnyapr;0Lp#ws z=b+f+U`mza5{4YpB58+FkQ1XIiBa}wTbw8oIhY#dU}}{!4`z&loI6CF69vHuoD=>z z35TMWgLmbiUCAjB=iK_a0{z@l{oGppT(N%cCH-8fer}UE=hV-Y=;zic<6`~XD*c>G zoLi)yQ~Eme;&r=Fu67~3yD<9NwH~wyy>U5>Ov_8?v4xD7)Ua%`k}Z7=x*{5s7a`-^ zn8`J|G1Y>OM!!pGuw67yKvzyWiIWyIf-PEv$5I;KE~Q!4(pTw0qX3j#JZQ8~M02nr z=^rLe?jjoB7ttuW2)XPoqM)Iu;~_1iGZYCosskPpw^u-ilH@L;Fc($P17*csL<4Ta z0;K`AFfN@3-BOC>QkuXor5G)xcPynj#8Q+g_tFgl4-^>pQW+2Ff`%_kX|7?okT?`9 zH->?D5Ez3&Jc{YDT;Q>+*+{x2^l;OX#)b8$sq0Zw*Q0i>p94ZqwH~v$^_a1(UnL9~ z))Ch42VrKnei8gzvK$^Pd69JF^AdW|63V zFQIfi$-DZY7j;Wdn-ZvL1@bN%@dxzOQ1*BA??ux>_y|S z7hS_%j2O^XdG@{nPVO+UA~$J28ah8*={Cz{Qj1)^>z>do#vabep${ld0oAS4+EY!|j|7Z!~ zUZC|nzXzlJJ?OgjV1&L0qxnkoOXzOSS60KkNL*M^s9z{S`jor~LXj&bLJ?brLDX^# zkj(ZgP#g`pfy1)OCkKl4PY%4SfAVUn{>f|e^iQ2j^iT84^-q^B)IWU*{FQ3`)AB;l zF8x!)>9hPL`e#@M`s~Fy`e!fY>YuINq<=nVzwXU_RrkW3ciT2xM^>qO551_@J3+55 z&}ZqN&ReB_>V}W|D)i6t4#9`@`e!9;L9f6kQ27%5^SN8}&li>JpD%t*|J*%K|9n}Q z{`sprb?@dJ-Fu)=ub;C)ub&G(f1zGq?9%I3?bGXDs?h6Kuh;9>y(T`X+NOU}wO{{a zKS;)ElV8kSEn|oIu{m}vV^+`{GkQPAY8Kvb0B=BSR+Z|X?nL}^cOyoNImB!A&zJAj zKYz)ke~x7~8G7ej-8&y?f?Dj|uny@mA5;Qbh4ew_a~6S$5W74hW~C*#2YYUT_M>ML*otZH@Qe2~KJxbLCG@eBdG{ zcY>1|3r_yn*}RPH%h{~l)w2AepL`L&k2tBFY(5E2{t_qkC3EH9&y2f{5*_LRaKb;s zW`+AB%oN_uEI-a>;-nOgwsH}!k>w%5hJVCK>C6>=2h4E?%{Epg;8Zpo8MxxWi$!av4x2RPxDD>FVoN;7?kgi`MIFzz(t{tZt4^kUpy z?CvptcPu~6@_&O%cl_a0`F|J8^xmia1v`9+q8;kXpVC!G16;G~p4 zu`Hj!@-#NT08aidVEIbs%H2lBRk8eSHq-eqaz~t05G5{@au)_Oh36iYk7aW@IJqNE zYCd!2ZYkqvw>&8&e~;xq`^m4vM|OHo6n$)mN@eqWaC*-smcP#YJ+@c=Hn90hi*(-f zzN=v-_k&sf6ga(Sx*u)@%ju{Gsn@{C-BCZBdf)quCr(Pq8(99mpS)|R@!q?^NsVQm z2u|;Dv3WN*h3{=PD}VpO^0rjCp_Keqm8+%6#zpwy zN*Kr8wiwU2T0h)I#&I_-G8yOb!@bNn?q-FPagBbsD#mg5DBO$_Wkx(yxN8{4-J2+7 zTqNU+*a>lraonAWa>m*GaJ7u%?nl%xu4;YD^z$%|${MM&jPq`2iSsg!y9eQAT#Da& zFEWmsc_G#r{$%>$Ldp#}H^(BBaZW#6DC4*p6*}Yc{czVXj+;#p$GCFFsdNr!95-7c zpK%xc{EK89H&3F3abj!BbctphHzT5kaiM-V8{@e8i?fUi^TUm299K`#$T-~(m%=!% zt|Elij>oKz)@i}UlZ zigDL6u8eW{ez+ROsrgn7M;L z;u#mgxbcje;fG6NTz|%8GS2OXOJUpq#yJ^R?uW}{+(5>;8RzlC&0yS}j4Nea=#G}< zz{$9~7+21?Fh5*A&E7z|kIDQjLr&34puT zfMFrPh-Xaz++fCqGA`6_Tvf*5Q{IIY82(wAr!aRjuVU_D9{!Fdxs{$-IntE%S@ab+_Tp#ypdG3G*7}Ugn`o416T>c;@-c%bA~L zF1S4mXCB8~*KeL?Di4^69S+3$s<2#a5{9-^#PUAU}Q~Vw_$!YvXa*AJ^ zNlxQ6l2iP~nB?dN`5oT zDc`1<;{~%^<<~$zxymmZ518>Pzo?Fzss5~Aw$)j0L z!4`Vr%$1^7RaF$bf{If}JV>y+_znSDCSWe}!&Ln?`HFXb1U=l%rlwiGcRRc#k`iem$@i5{0n0q!Q93?p7{*sZsujo zYnY#9-pD*;h2gKxJd$}F^AzSz<|WL_nIB{BVSbT$XbH!kxs~~N=9$d%nU^xJVqVMK z%Urz3@n;^v+{Qef`3&Z6=4H%ln4e|d$UI~v$Des5^El=y%$>|jn3pp@#@xgFBJ;Jzx*Y+%Ci+ zkWx-G^ge3rmBQV|57Pa{N(I3lL=%WRKpu1eK9Ch*UJG(!0J4|{Axa_agF*L$;y`0S ziJ(cK*`R9OAWs?m0X3;0#0%7NDl52LnPM4GLK~JHrf8%83bq59F_O2xfyyLF7Fp%`Q+S zs0wrdB~R2ciL_4I=Og5r9koPgqy_WuL=BWN~=CWo^@`WCnYJrDX0^gYN2 zia>;(0>y(eC~`>Cc9gEzkm5U|L1U6%yzYEr1fuYlsO&`_^Ua+Kw@AP+Lx2Z~1|W>Z91)wG8kq*NU0!faE05S>xJK}waQ zuK7&$%?bT0CbQ^*b^xT56Ls~RslLVmJKKbJB2GS2yqs4fy+Abx!@H(%I6DCcQp$-q zoHNCP764|0l#1vFGpI>*g&EYOHep@B)PB;$YLuxS(L%#))B6PCaEB=#G@qL(9I zL1Gu$H;{NA{TYZxo98y8VB=T49^BVPSV7mL!0Vt_PPP%{psyNWj}2DWe-F+o8ke;_ zkpm&(g zgZ~}$Gm~;R8g2I&P?JKR+y?Y}(4C-ROilKz`3h~uKSBN~7kz92NcFE72;*$f8W8of zO$y;?1G<+f3fu-7$wd9_UXK1{U?a}+7|sSd-yc^)@MNhm8WGt>5qE>eFae- zXfEj0>ye+JcR=rg=m$E^f&Kyd3iK1`XOL1k9fgEF)8_f%Bf$>0ab$jM492IP9W|?v@h*LQ#w%pI0v*2 zv;(Bn9Q0L0HJ~G)cbJrYIpRT70jdP;166@u104b#W>R>$ppJ4D#Pk5T6*LSq4m1&z z2=Z6`QTB-L1l1rcU5QeL**YlnS$8EfsVZ(>>rsgP0xwe-QLM=#L;LC=WCbG#^w5ItWtg zmI(CYAk}{>x#DQzq*C+K8lE@0f8+d=esPd~X)qnXFi5{F=$M)?gnp7YDaA2l>Xd|` z+35*GQ?n9=W+kT#wP$7wwc{5D)3Rm`l|R>;l^va$VvotnNFGjsn4FL{JjI?d9Czpp zr=RhqpYYAXuMeiCB|MxpHRWN#(9ikOZ`h{W6Jp6s%8{KKOFs-eDJgm6jU(G`kne+`rZ0H zdZa!`%5m|?Lb`oqr!)zHi$~7x&_8mLkuC-)1jlV2E6GgCxW5C3KDKPe9UI$3-D(_M zS-qI9biiRFzW-qr#u{|jMbS#QT|ie%;F<_S88#(V3+dQaVJ`NkAHtDpAmmABI_0d6`fkNx-PMTaMjRB`=oEEpOQk&ZVDo!Z#dDLwL(qkjFToMdz)G(7Z^6vsUuxRVhq3J5_E-5nehcwSlg8 zSVG;9z+ogD4k{O(SByc7aWH7R@a#hPcWn_kC?lQXFb)pR-~dmxTbeJF;6@C2D5g?m zK=S!A9BNrbL7}lMk)aYZGcuK4@#ta0Q?t_gJ$`q;$45NUZ^$r`LzZDrNlok*Gep5i zHZx;PN=Cm}yGdqCPHi$7n&@G+G3@$rT0bU5vXQvt2(BNeVLU0b>>fh|*~1B`^o}v+ z_ezK}3Uop;}i_7}3)R9dBORwNsloRsRA+AND}1!#!wRMD5<@r?(AY5x4r!8eA#F(2h& zUG#=JWS76Zf#nqquXm3_qnh-kbMF@56PFjA9N!-EgbSZ`BYFL}Cr-}AAm)mHWzC7f z8-_JJF7ffFUi|ji=Y>f5_YLnI1n!ZBiH1Kbu#m%5~n2rtoq}nTVp;=BAB3Xso5=+QQE_ zm!J_b%j5C>ia8al(`(SzpZRRe9N@zmhD!e<7Ixgf1I4SuooB!KAK-@l`{VW@;O<#J zTW?t;#2$N2{0qQGb}wik`3E0=@?Hk=yy)vqi>hG$(f0!_H;O9TnwQpNAlF@MlSyVJ z&kcIA0F&Hu{P;29o@iKYe)9bEbap+T>kRS0kU= zKAfJmv`;f$`BVG-qkl8|lQiv}>e5n`fB}&Ck-)4Oa z^5Sh1R;|2VNriZ;{{AjekWZT4{R8I>&GM3)QXguBeAv(~cb+iegWkOJok=7Q{U)v4 zgzq(G%hUAUXP>lNJtn#B$Hy9vK>q&U#GtV2XnE^O5s%lTM^yf0+jyjdZRm$or^h#> z%KUm^`RNIdJclvQfbrisk^Y?;?vV18OG0OFMN6~q^E0z1v_bxJP_O`zcGMZ zxf4Gd@AGheD7lsM-Fm>te`m76HTfjH2-Wp&p#yvO#%qKup=8&((%Q5Q3U1dvL~-^mAk%+EY5%42 z{rq2g@E4)IYQ@d0G6Tlq zK2N&uQ{@Kk}Bzv4Me|$VO$({o9s7!lmVnW&&{3y5>la`Q9Bd-zmgtXK| zLL+z4o)Ru8Kzmy1HR^NIxt0!Xoz!Mg-)RL8B?DBg$H3{I8QiMO=L~ZM`{QID_oX2h z9S#5Vdc*Ae!r-Os&hQ;`@ShF2hk2&YFxPx-aO-ylcYkZ}Qsxog7-sRk!9y>xS#f?r z+)svFXaCiE|5IN3gW->p!&k1t$-I_%oG{{D-eBN8Be)$_oL^kR`C>b0v|stEJ!7+K z5680H`KE#Mvb}2G!d^AxPR4~QvuZyX?;qc@>>u??C@L)!jf<4xVjw&L@Pus*?+t*b zhOIUH#Q=CLYqg4x=l0$|{CWU<$WbGm2;V%aF!ukT*=|xQzF{W3k`d@OklC#C;U>J< z|J#8#n-$&~03Q(mKbG<2m)SoUTbPyq@rMBLKcC06sqe zp4L@c^S{J|H`}KLz?YfuDvW^2J%(oY%C0H^p4!pY@W)K}4&*T_8Uc`>T|rc?mH%f0 z;KLcy5uE%{cy9pweT*Uh$&JEa41mW_Tw(}I%YX{s`Iu4uDQ@QQ&tQxyHwxb~0G{Sp zgz?Ag0q`}9SNtgL39sTt zc$%}C%_{tvj3>Kx1XK!w*4j6x39tMhC;7me{a1Q-0DM6Je5nar_+yNxv@@4a+DkzGQ@?>vs!eHi)`X{W9?`?- zccE>eRD8XD_{^S{$N$R@-x$_9Ud2}&H|iIKpTbjm&E@f-et7*?!XM_3@7%ioD!vhZ zcu&{M(v!2Z;rE#48Np-esn0u-M?@1gEjfJz?RzB^n~*-)kuW)Vcvc2Njs7kn zJ9~OYR+6;DV@R4Kc?>2BMrhcak~+zVonap4c!8RAsR%zV0S~;N)F^vOaux~MY{a)& zV3=E?#@Lf=kHanaIO3$R#yKoG!S2Z7fQ-S90E|gb$g~;Oz#3*1FXU4~I?axTB_!H2 zvc#|q{FuU!j5HOoVfZnF=2S;}pMaTFb8-RS!U+GfGNvS}*%Q(h_CtnbQ1>Sui5@40 zf=ERtXQxh1AD1j&3NztGCg8U;Bob#yOyy~eV`3I3ix`@ckcD@kq#2U9tkh`<_GF}g za(a^CsmgH)Fv&+IAmgMtYDQ`{#Q_LozSkU%A&%6vBzj3yR#pPmWs{R@|VIJoth=X517czre9)EUyWdH{ym7M-+Rc+PH=Ga#OUP7jO_{{fGm-fy~646I=&|lsm?#*X7J>n0uHTs9%4EGbD7F;h&RvIrCcPzwVQP zpl|9_0n;WM?X=O7HMchY^I>(HhAeX29IO2f4ud0!@it(T!LW^ooH|?^FZ@afB&3} zcQdb5?wL0-7o1L^%u88b&b)?s1l#M(t<2+?$1Bd|B-5|FWU{?~IDgIT^m7;gpphO< z=AJ0STsp+yjm*{jJL#NJUetPI&0B_9tw+Yc&GtNh9nbb^e(z+nn%~>lT*KuspUo-! z9ygoS{JxCMnQULi@AHp0^~*Hor}oi{0buCwF$S5Z3F{Dxa2A)~BP4FLI|eT!{f)3My^MVy z*l)ayeP7s@1+b^|y9xF$2e79(Z9ClvJ7JZgbqG>q-(JUlByh7mwLug&vJcUJS-!|U z)h)8`0DJ%VlY5%K5_RZ}{e|FW|6!Dh-q8{E$G`*GcY^)fm$C1tV}1KF_MKq=K>&LS ze`omrv7bGCBRUHr`!2Ajb#!z1$o?Y`wNG7P9}Ro_|3Xn3SzvF2rP;j#lABQ2$6m(1 z8|>o(*pvU=VLvv2J;b61?8jfuUdKND%h>mXef(wYd%->_fIZdE_Wkits+IPyTSVaY z1>TB2aK8~eQ2OL2VcTmN961b_V9H`PDbU$*`|`YZJh_Lr@Hu)l2m!~1Lf!lzP%(!Uez zFI)fM|7GhR>;u(5^1mDGFIzugAEz7rn&|;zo>L`ih%yIyzk3EN;Qg6Sv`@*X=m05h42H?D{|)tGG+tjnli4IFWlV zPTAfk?iUZ>1_`T(5<|pL>~V+@!^CjRkw%Dz#KR(1jKtB4Q5cszDn{eRgt6i=F-|-# z#)~I#Pr_4Tf_PdyBc2uUxE*1lNJRNe#(fBrG0sR8&xt7*PfQi**r}E&o)=m8bw|5! z;68xqVuqM0UcfECv#`qhN1W7hiX1TqC;#)rTrp3~7x_5tzd*ReLQyCd;e@|iEWx?` zBJ|J8MX^|ce)vVPQmjIGUoF<)Bzvh?C)SG%XdgD={Q4HO16y&PX*>GE9b%_=1$)4E z;cU}x)c-wVuh@q(VAVL^bO8InU&TJ~L!w3;7DsT>{0;FZ@uoP6dT?Bv5O1NpzaviK zgm|qug*%4dNBKRCarGJW2_NAc_+L<7|B7?p=Y$8Ryw8iji%*&|SQDR$&&21#E9!A8 zafA3m{6l=nxtWNw+>PR&IJy0e_!rJ;e=EMjju*t%ufA>!n?xU8#j>S82b~uGX&6uGOy7 zuGe&}w|0Yeqt-|3tKFpiUJKW5)^5>m)o#=JX}4>4Xc1a}ZGbjVyHmSMyIZ?Qi_`{b z_iBT+`?UMD2edUv;|=0L&8kIdL$skOFz@0$8}3ELA(y zB#<)+GA)rJ)iyQT|93j0^`JW<{@22NNrmG+9{|6jLRLFmgvv_7D|pqnTNQr*EH z0ch{g&|$;GP~#H-{RVKqw2TBA-bqz^L9J^Va}OmaPGb>&Ig(ofm{$K$7_yG8t0QmR-_%{OJf9rlAIG5_T?gvu%-?|@2;eYFX zAcg;}`+*cbg!fNS**E7`ILxi(SC|RU0}ScaZFri^Qiw;m32*lQcG#KC3jbU811bD( z-4CSjf%YHJ{HnF^2ikvdIsiVC%NzM+j^DpvZY@2X0q_?C;PV6E8w21=0^kFc|8f)F z+#Vha;D4a~7J=rwzjZ$rUMJOW-H)a4Gq}7_TAR~9Q2Ub~03WFRDKX*A`I(0InawIZ zWhT5iJb~KVssMOuV_Wn8mo)#dS- zet5OdTD||jxxM#b;-OSbg z?$8QD9x(jupR#vyI+Zf7{grg{uze_pS7+}3-CBL0)xR*}ufDg2@iGP8Q>#AqVge`#?rbnv|U^hn2&khs?BNBgk;(upgS?P_D7J276D; z4#qH!P9FPct?pD>*x*X=BZ>Xk&v(->B$OLlCEQV?#-z3=~{8?*r*K z@b(CObaHlv13Pp2aeC0ct1NqTf;|D)JF+LG+l}oo6hEC3OYbjVFTabDPXEX#Pfq4; z=Hk!4QqBx-nw}cUbtFu2U$$N!nt-g)KQ{aykH*akSp-!dsL+#!-1=VY@2@>=$n_5m zUdr6_8^i1Ti{Z}wzQL_*wsN?`|6zn*mG9W5_!!|+&mgSE(s`rKIB(RM&Mwh;qad6& z3hD_86Fq~j0qM~90S^b=27LthouEh&5_BKP3W^5VK(Ua=fyRQy13Lk-cu*4bDeARN zoRdpLa5}2~B;s#Iywn(~hRv!EuQ_MfH+jUG%t=}OrY2(pRbsY?8#Y?N+ybJ`iRc}J zob+yWP9)HIj24bzQ2Q_9IXzW-k;!J&Ud&*#O8@cSsPfd($NxKDGSY*_PbzQCDHO)z zAu0!|tdRX}erA%93OC_ZSt9xWU-Ko^e^c1$TU?WZAf(CAtZ{OGPk3|q^C2Lazj6n_ z`|s~o?n+H~Rkz5_e}A{amz%~P^sUOQTFWp0@lY+-GqXFhUhSt=;~_K>vR;}oE%dzq zSK&RD%j4s@-YI-s&&%Umyz4g@X#8Xa?&ARCCr=0CeQMlR!|4%*#HaC-%G6R};6j58 zULI_4PdkI_?G0YT{(0C;UbL#%T_$tcXWltLo&%(=bV_>0^mK3yg^c>Uh;LQ<_(;hEV# zxb2Squn9v8bx?GUm;CLH{*wG7zq;c5ZdaW5HSEcaVegMu{*m1MZzH{f@MV$0PyU77 zNB%{FhJkFLhd{BQM?i5HYmWwv0gZ)u9Qb(fCqd|AwP(QNK@*`*0wsecfhI$i0{_!M znIJo82IRBAov_OT%>(5lT^ES3(1jE{5zqOoOB2pl>Mirjqs+fCzu6n1`a_+|n<{tt zoE{3NIPD+SO$SmRPfbtCn4YZjj7&*gEYcN_L`%$0kcH8uSWd$r%Wmd*Nae82L~$?=I`Uh2og zIbE#Z8R?_)<2IJ7`Ai(!D}NOaLa+5($~Q)n!h&*bL7lXq4q8wLEvPRR)E81@-v#zv zVBZDyU0~k@_FbCngHc9leyM@lfatphDi*6CtVZ;Jkz_qkPn9A$owFx7ou5}K2&*hq z&r};hZ35L_rO3WB>^mbo>MTE<&sU1h<+m1|5Oe?`8rm0xmBP^jZAuTcDN6kocj}yf zH+CoQf`JE-k#`MJ{@`|)+xrh1BxgM%MvoH{lO~C{p~FOG;v_L9Hi~Nl&RI-MqXQn| z@t6_+4}0$&URBXGj_xz3q=zJ=lZ5mWQcrpzr1#!CNlubO5=b*e0Tp*5A|fIpDq_Qq ziV6q{Du{(*L!?-EEu18W5= zteHJYO)IL&iO)`ENfag*m8K^ZrE!q>q@Uv?P0uN+DNL`xIJn*ga(AiDkxANi8Jmpu<)BaQQ(D`8=I+x~w zU!RALzI2}PBJf-J?>rA&F%O-%dEj~Tz-#A$w-ETP?b$t#9PXG0zIq<|8|Q)Vm z%mbg82d=O8@BFl#2ktcwJZ>I%**x%$dEgu8f$y3JzL&sn)k~-5f&VZMokL_^{DaOs z@G=6wb>4-{10SBJ-s=Q@D;-LIo^hE6u9ycNHxE2-9(e6M@YVCcH_ij!F%Nw2Jn+v5 z{8s*_&BM<#^U%385B&N(aQIZ{fA+&&B*bk-85$XzmE!{=>bF3QUb9^`^#`B6>Z=5l} z`CIA5m!#Gt#^oI8k35Xl2hV~vx;gMJO-4MTv(Kz6VD*BC6ba$(i4+wQgXrj z)j8AfCOHTE=e+nt;to?O@F*;hlAc;zAZREhOaD@#}p!>IJcn)sa5EVe1x@nv(`m7Sh5C!dpBkj(*da*LpEY;{zAaeR`H z;RW%fHG<|)Z2p!t0fUL*{~R+8e(RVqaN(FSc|kW>dP3eZ?{DQLSFffjV;P>Ck^+p=!F5~%bp>MqbJGvru{sS>XCGGYu&M;+2&=LRi{cB4IOPRp zgzM-+vUpD-X+lC7m5^SP9iPY2$t%bOc_>OxW;CQnQv>`D?JG+uNKTFjt4Yl&&r7Q* z0L8+-XY1jV7?fl40t(El1V%@}ASUFNQ5hlIPo#EiVRB&jV)ok^-7X&g!ONLowM4wBL&-AK|MB;8HYLnJ*#(jQ1VOw#LI zO1|6X_Di^ZAMU&&Wr6!;Mp9>zDoCnN_N}5xK8~bGBuyh}7D@9+T1(Ovl5*!MJ4k*t zNjH*o7fJV$^cYEhAn7nkuai`NA#S%VNxAbz+&LmI0_XPK;z&P22t0zMaU@M6X%-^Te%Bt5nd=R5Y|^w^s? zjoXh?4u9_!l7ASdwInq&#eAtH>0Xjj3o!i5C#3vmINf^`r_4OCh2Ia!J{EV1Dv#hX z@Bi&5Z#%|UJWkTba2iMQ9L}ZP7_N(NllNv%VEC?=aN6+-PN|o1dWq!o2>#w37*6lR zY2Gs=eG#WzeR;3pJjX8`zX{)+-@xzBkhFFW&U5_U`ys(6{JHcV&U5^VAQerVz;OCF zPIr;inZUXB{I`^&r#Sil4n59)?jZDbk#sLf&ye)LwTpYt(Nmlv?IZVsY$f?!B<0Hg zx75}I%VQi#_mXsiq_u?K$4F}S4z73N08V!sWBjcoJw;NkUbqM1|JDy|(BKPU4G0=u zpP89kEVQ(;wz0LdU*zEEwAk6j)eRT;FYmc_Fe@x6{6grT{o(8klV{#BzcTn`^4vRk z)WNy;Ov+Tul;M6jd?pWfF2jxl{>SD8H?->Vq?9htmSJ+Rj_In0i+uQdbeOApvXphI z7W|sxuI^#73Gkc9{K9{UX$%BXxax>p;fnKcl@EU#5xj>y+;pVsEX3!(bonl}ICC%2 zoCa|B5Ea%p!KpIv3)&i(CNL?3noW+%*IZeiv!`B0mtEZqmbHYnlK2z1% zMow_C<(WKOuY|8Ug7QVs&{YhOX<2etJyRc*-o+eeV@Tolrgw2C!npk0d$7{+y;vp8 z+f49lGV{{lw+w#E;Tux8FG|_b0mtXK?op(Hz@0Amz7+N~80Nwcd)|!gIh)1#IUEqe zc~0PSYV1WxEGO9f98L)E1RP<@2{V=^w!mBOiWy_A&0 zdH*)J*o9NO)7lDms=?i69i8nBJ#cogqnW+QL6JsFwD%s=C#VLkl8g_ag21=9sTBr5BB;3BSioFvvOJE39qIBBTwY*%(u+~v%;KGo{_7G*1S zTMzWTp$?eR(^|(I`)q8Z8rp$$Ck0o?v6U%X;i(HQn!|-Vn;V;;ugXqUTZ;;ASYw|s zP}v2XYVKM^b+q(!QT6S>AgXCiN0SP81TWefsIC@eR}-~X)!9z9x2dS^JKCvkIGPC^ zh69$=ie~6-7hFQt1>J6=uqJ7PYvh1d3-qT;)!K}onDL?J3=lL<)x{16boGDo)pi{- z;Z@yipX%TdHE-FDn*CdZc2y<>B@F)NyZJf(u$24Vafl#PvGByhqA4<22nX)se77?DuI zEa+&W>R`Tss%L9usnvo0)HPyG2G^r&63(hxTADk$K;uIV-A(O1L=5prv;2U1Kxl~c zvqQ6@MYWp3d}~#L=(hn=nQ6pNpN3{=CPS4yyUb0Yrk=J&WoJ)o3;Y!#s=X29a}~@d z24B_6b~`?qf;$ISfDp1WnS~`Jmn7`VR%KUx4|DM$rDQ8)E`01xq_m(x}v$bXf7^Vh{v-SV-yQ8igg&p7^57QDc8X(Fs>5A zl>%H)@ZWi zi?$2M!5yH4Tstlb*LgBc=)z6!!5BRPj2<0E55`!7%dFAC*ODo~nv1ShCD_k2!9>9j zY%$<4R9E*JP%=2HlNp@>!G+@)ONAeGRzz2pw87#@fJq=wt+5m}P8TAnXxgt9Aj(v4A>l925b-i%-A4ZjrWsKjSUu{BaFz=5 zK&gY*>7E!(s>?L!o_I~stb?`ao?3NJZMrAHB-g>ZbWeO8;LogJR6OW--I#zg#29UG z1Q=V-PI?_EQKxBfC$N>*5l&@;*Jm}!Me@}`+!!qDkN1Dgo^0_z_9jCBcqP9k#_=MorGg&z|c+e6B5o*&L;vt|uH zuV`+B>t}LN z%P=fzYKEJ5VY;yoU95MflLTh2@fnzFx(v)U{+XF;x*SVemt*FdF2l@rT?e6V-7{3r zKQmKMmt$JMXP^bT477lMW?G=ju`ST$m=@?V%+%Cnu%gpt@jTaMS;e5sVUvitjBO`* z=G8F)uu7Xeb9$I$8N)&z$>iazDu!a~NuF6%PM&YAL}zgEdu&n3vj9(Ef62?a4Fb;u z!?7*K&)DXYX8|#Rg(fcrJ=K|P@``j1dsi5SEi-u*&=uHm@^Wq?u_?!|Sf>d;>P$P% zDineK3Wb8gX&_01NE!@x7c+MRvo{7Oz~8^5ve`=9L}Q`}(WGcvG%LC;`a|@m=q6l;gOCKtkUla*@Hd^1 z8L~i@$Qs!qd*pz;P!NhmndqFj7S*8!v;sAum8b=^p$^oEy3y@uHCl`ALhBHX`p|l` z0c}K^&}Os+ZAIJAcJwTI0lkT8q#e?`r5mKDrNdHtS)!~~mLV&VwaOZ0-Lku7J7w!- zTV>D7j>>k+4#m(<{htPA94(b=Q8t$rD zAbvr-PrQk0mfkM?U0Nx*PZB2%mmu+WaS4hQ{UUjaTA~*u`xcENN3oAMO1w;*BQ6uK z7T+&^UtB1CNSY;mQu?Cwb?H9o5$Q?k1?f-H7pY09p3GF{E^CwgD!w9~5MLAjB{q{- zNgO5Kl0Zqes4Z_!2c3ykL|nng&w zK+JJEPMpeeyHR`_%kk~(SiLVkAwDPmQOxsJPr`FIToNOR2ObwmDq+M|N!ozh>tIwj zN*O*tJ z_%u7p!_rBR7fQyAv^|Wqk1PmAG?A6%T9D;dR+<@E-U-so$nsHEni*Nvf;3+Pd1j<} zk)EsG61`x(D7_TDGQCE<+x70#+p711-a)<3^v>yB(i_pct|!x9sPC-rs~@GGreCaI zuYZUB2L0{&&+6~iKdAqa{^$DV^ncbL(*I5WhQ8Ebfq|WYgMqVwyFr*ixaK7_|4$D!QTclLlZ+w!$pR! zhD!{?4dV^d3=0kG4Lc0)GTdmm-S7p&Hw_ONo-{mX_>1AF;qQiGBQqmcBVVIPqhzB3 zqe>%{QK!*8Mw^Xx7`6r&_QqbuVaAEZdB!!yZN_&QZ#3R+ z{Ic;r<738O8lN*(8;=_QZfs~`XX0TJXp&%(Z&G2h!lct=oyo%{Pno=Kvft#W$rmQy znGBiCnjljXQwLLbQ(w~%(`eHK(^S(e(*o0SQ>AI6>71$YKg#^?ePI84AJ}D(od3NK z?BDJKi)2IO|9`#@3@+YWiCz`QN`8{vZSb(6jnMVe7eHd@p_HL4zIp|4$LU-ZJAn1=~O-9M?BRc(M{ zl^5W~%VD^;@`gwcqdUDd@cX28WJFs}OU?|APxos^#_yn=-W{4$&#Gvry~E?s{|KgoD6M8v zGo|gim-)A{^GC!?c@M6Fz+$FMyJvD>VW~xSU2s2NHr3b7!9FGbd&Fx z`4~?&Xj(~&w*eoZxxFLWF%3bJjq?3*1^FVaoSi0ZtD7F5=vQ~rqQ1ljs6=tG_#W}c z;2!Rr^GK3!O|y{4l$xAen)(W>G2^finK@{y51`?6n{>-E;3|ks0q@cCJ8vyvy$f} zFRS_1q^o2SiNsdoCTWy(Nj9qcuMVrHwCXXQOCR!&@&+VXA}Q8P0c!^}ok$WU$@mwH zqddmDSYD@i$n-E@c_LJHRXsJgzAqVR(+;Rdrlu#yuL|VwP%|xll^vk_VX)a=Unk6) z6^xSGIA1|N>3e&As{U${NnD?J4 zkjDvgnr{lmQwKn@T>HY2@_2{UY5cuhefTc(v>81i6x{pt@ ztt3)Dd#ww}TxCl})Kg8+5v+h4ILUu-?Y*K&@ZK|J9fX0$RY;aEQ~ir*T;lsE9TqfX zLGm^#S@yE*J=sTk<$6!*y{z}1-Z_0eeRut8{nzx5=%3NQZs2RsYS6{bgkI`%+1sRZ zTCA2tmi1EEm$I|6OR^EYTs%1TSpIPVCkKJxg)*Zho0k2~jMn>j0^Lu2p=YLNtLLoe z151inJy2+j<#9SnhRK%K>L-X+KPJ$dpOE%kAzJ-2ofelgi1n0utMu;CX>keB;=Rb0@m{lpfdr;U=VaMDG+Ytl_*Zd%sz%_aD8> zdNV`AFqcL_f?XQtDs$QRwDz)AGsxG_(1P?$^lf>-B2ao`1bbzx7?x6L`h~2r?-N<* zN9e~9K3Nl{Sn{Y2yzca9ljt|;cj@1+zmtFOI7n23^rM=JA}NBa>5_hF;MY{ZSt5*CjDP z1||kB1|B@n`QOSoT%jVuKKa9D^!lpZE!bXoD1;d5R#lKhV@moiQjPLNUSk z6unL#8mP#a+Rse3)6RSTXzCNaXKOb4K$GF${8Cdln*>@;Z zZ1gt72oAp!OnZED0RDUZU?A=B#{T_#--FEaXSgBxQYkk2!Dz&o`WH34`(MO+|K#A5 zc1X})?>b~`W9+~~Vn)h1);Nh7sUzG-xi=u=LgVE`&(Thv zVEc?4j9WRObtS~y1;Xdmj*Ra&-o|q`4y-OQgTq7`n`Xv_)RQx#BkGy%-q~-A4`TT2 z^*^|7Z%yAur5leM-!T5$#K^=Eq9WBM2O<7($z;;xrm4cT#I)Y@71Iw)zy6q?3;`Lm zDCh#8_a|27YZEI{?jy&e#Tp$x9}0aG;az3L!hf%mA|NIn^vSm6@8GI`gQub4`We)bRM^H2>PJ z6`6*aX0qbmEAlpt<6rgjvcCkpcAauu+AcO-WqP~mI=-lgsB!;k<-Ou3O&>6Q)bv@M z(s+E36Cm;HM6Yh@LZ*96-@$6Qnar3c@RC8~WqO?O#rKb4?evrqnf_opz*p8ih`BFd z)$JJ@sEh@&1r`gIEC^kYxFA>H8^?pXtw#$MEpTRr_ajcWLj>sh!y19&%@jzpH(~P1 z%*|Bhg02O3FSy^#!Ytk_%WS3D!)8yL?KV4Lc1EW^@B5OI->;Q=3!Yf;+JcW3oLkVp zV0ZzneWr%5g2Ss5rCrdbw-+2_ofCx)YX2`&dgojf_vyq0EOK_&zYy*dq^(ZmwTu z_3RFzYBd)4sUZR;`;0@Ekl7KlQ#^ZU;^_X;h0MM)>(}yc+OX8D%GyL_nTyP&<_6}D z<~8Q`nLld&viUyqBcKINX3?`BDUtaCb8BqLB1iiNfoV_GOU&iw{^sH41(+4fI94oW zWW+qyoYj9Hvodm>2w}94J4?Y_^@(E5o6S49NgT_T>vakgvex7mAdqwf)Ut!^!{T=tXCHny?+x$248y2<}E*4Q1sTPG6 zl@<*;>D!>LhrKEbSg62~^o)fe5#6_05sTrRj!&2cjKva*AWn(Lk$xs<1Z_?dw91bV zYGn*56-TNt%4VPO#r!WUQ*iW2K3 z7EfEeXtBrQBxZUl$Mj@|=@thp4l@(;(>YAf5HdZPZSqeR8m`Gnq{%7F%ox#JhIQF9 zu-GR)PZRL_%Y_C4ej5t-ohIm+|M)dtt)-A|wvouiw+lJ_{~Pr8ncRn{+=aI!qS~*P?J>TinkyC@%vc$60a!Y>; zvRrPdB14*oi6CR5*!!sOEbp}3z<260p*X7x(tXv4ET6S}9U@6r372lL{uFiA@*Prm zvPoij-13a&c`H|bREk?^7teNNdC_uEXXQ>$w%sS%WjSSe!%AjlYGqG)d6Cy#{iK&a z33~Yp>D?uP^FfR9ntMerScT0slBTT^t6Zy9R)?%Wh+#VQiL$IJt?EfV1%!B>W=Of- z#nWny)q1PVR!{T2uO+(cwaM|BF~Op2Z8x%d!D^p&dSsk0d>2?*2){k7Wh&|wKWFs` zv5}j3^BbU(?b>!^rLnrsn%iE{6)SN5aX@v1T|jN<5?jlxU97zr71BrjU~O(~N58%jwVmXkJA zkv3EYOYBPRYU~>A+DVCOQlf^Gs35H<3Nf^M$nG(_XY5|Kd(-Zq-4VOvc3<0FAnj-- z?N~wDQA^s9N7~Us+R;dAX(F{WkXlrvmhw=ko!0I*yWj0a_6CG@8KGT3XcrRNs|f9t zN@QF9aQ($e zcJ=TzWuNF_`yP9mpJqS&)0|yo?3Dde_PZE6b&B)9s|51_K~%0A*&nq($xVP-G6CxB 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


yq0;ntP&!b24r8-wNxCcMg{5_?ChcuThi@v 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 z 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

R=o+!MEG)3fl`i44RqOd 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

  • 3!PjPq?F5bzd~SvR+!z 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 diff --git a/.venv/Lib/site-packages/PIL/_imagingft.pyi b/.venv/Lib/site-packages/PIL/_imagingft.pyi deleted file mode 100644 index 5e97b40..0000000 --- a/.venv/Lib/site-packages/PIL/_imagingft.pyi +++ /dev/null @@ -1,69 +0,0 @@ -from typing import Any, TypedDict - -from . import _imaging - -class _Axis(TypedDict): - minimum: int | None - default: int | None - maximum: int | None - name: bytes | None - -class Font: - @property - def family(self) -> str | None: ... - @property - def style(self) -> str | None: ... - @property - def ascent(self) -> int: ... - @property - def descent(self) -> int: ... - @property - def height(self) -> int: ... - @property - def x_ppem(self) -> int: ... - @property - def y_ppem(self) -> int: ... - @property - def glyphs(self) -> int: ... - def render( - self, - string: str | bytes, - fill, - mode=..., - dir=..., - features=..., - lang=..., - stroke_width=..., - anchor=..., - foreground_ink_long=..., - x_start=..., - y_start=..., - /, - ) -> tuple[_imaging.ImagingCore, tuple[int, int]]: ... - def getsize( - self, - string: str | bytes | bytearray, - mode=..., - dir=..., - features=..., - lang=..., - anchor=..., - /, - ) -> tuple[tuple[int, int], tuple[int, int]]: ... - def getlength( - self, string: str | bytes, mode=..., dir=..., features=..., lang=..., / - ) -> float: ... - def getvarnames(self) -> list[bytes]: ... - def getvaraxes(self) -> list[_Axis] | None: ... - def setvarname(self, instance_index: int, /) -> None: ... - def setvaraxes(self, axes: list[float], /) -> None: ... - -def getfont( - filename: str | bytes, - size: float, - index=..., - encoding=..., - font_bytes=..., - layout_engine=..., -) -> Font: ... -def __getattr__(name: str) -> Any: ... diff --git a/.venv/Lib/site-packages/PIL/_imagingmath.cp311-win_amd64.pyd b/.venv/Lib/site-packages/PIL/_imagingmath.cp311-win_amd64.pyd deleted file mode 100644 index d5c20f65b2e29f04e9af9b273c5c73a03f1b5941..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24064 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 diff --git a/.venv/Lib/site-packages/PIL/_imagingmath.pyi b/.venv/Lib/site-packages/PIL/_imagingmath.pyi deleted file mode 100644 index e27843e..0000000 --- a/.venv/Lib/site-packages/PIL/_imagingmath.pyi +++ /dev/null @@ -1,3 +0,0 @@ -from typing import Any - -def __getattr__(name: str) -> Any: ... diff --git a/.venv/Lib/site-packages/PIL/_imagingmorph.cp311-win_amd64.pyd b/.venv/Lib/site-packages/PIL/_imagingmorph.cp311-win_amd64.pyd deleted file mode 100644 index b9c223af4caa150e5d1586f1e09709b896384df2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13824 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 Any: ... diff --git a/.venv/Lib/site-packages/PIL/_imagingtk.cp311-win_amd64.pyd b/.venv/Lib/site-packages/PIL/_imagingtk.cp311-win_amd64.pyd deleted file mode 100644 index 8b2e32f199dc96fa8ce2c985cc31c6c74dbf2ddf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14848 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 diff --git a/.venv/Lib/site-packages/PIL/_tkinter_finder.py b/.venv/Lib/site-packages/PIL/_tkinter_finder.py deleted file mode 100644 index beddfb0..0000000 --- a/.venv/Lib/site-packages/PIL/_tkinter_finder.py +++ /dev/null @@ -1,21 +0,0 @@ -""" Find compiled module linking to Tcl / Tk libraries -""" - -from __future__ import annotations - -import sys -import tkinter - -tk = getattr(tkinter, "_tkinter") - -try: - if hasattr(sys, "pypy_find_executable"): - TKINTER_LIB = tk.tklib_cffi.__file__ - else: - TKINTER_LIB = tk.__file__ -except AttributeError: - # _tkinter may be compiled directly into Python, in which case __file__ is - # not available. load_tkinter_funcs will check the binary first in any case. - TKINTER_LIB = None - -tk_version = str(tkinter.TkVersion) diff --git a/.venv/Lib/site-packages/PIL/_typing.py b/.venv/Lib/site-packages/PIL/_typing.py deleted file mode 100644 index 09ece18..0000000 --- a/.venv/Lib/site-packages/PIL/_typing.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -import os -import sys -from typing import Any, Protocol, Sequence, TypeVar, Union - -try: - import numpy.typing as npt - - NumpyArray = npt.NDArray[Any] -except ImportError: - pass - -if sys.version_info >= (3, 10): - from typing import TypeGuard -else: - try: - from typing_extensions import TypeGuard - except ImportError: - - class TypeGuard: # type: ignore[no-redef] - def __class_getitem__(cls, item: Any) -> type[bool]: - return bool - - -Coords = Union[Sequence[float], Sequence[Sequence[float]]] - - -_T_co = TypeVar("_T_co", covariant=True) - - -class SupportsRead(Protocol[_T_co]): - def read(self, __length: int = ...) -> _T_co: ... - - -StrOrBytesPath = Union[str, bytes, "os.PathLike[str]", "os.PathLike[bytes]"] - - -__all__ = ["TypeGuard", "StrOrBytesPath", "SupportsRead"] diff --git a/.venv/Lib/site-packages/PIL/_util.py b/.venv/Lib/site-packages/PIL/_util.py deleted file mode 100644 index 6bc7628..0000000 --- a/.venv/Lib/site-packages/PIL/_util.py +++ /dev/null @@ -1,31 +0,0 @@ -from __future__ import annotations - -import os -from typing import Any, NoReturn - -from ._typing import StrOrBytesPath, TypeGuard - - -def is_path(f: Any) -> TypeGuard[StrOrBytesPath]: - return isinstance(f, (bytes, str, os.PathLike)) - - -def is_directory(f: Any) -> TypeGuard[StrOrBytesPath]: - """Checks if an object is a string, and that it points to a directory.""" - return is_path(f) and os.path.isdir(f) - - -class DeferredError: - def __init__(self, ex: BaseException): - self.ex = ex - - def __getattr__(self, elt: str) -> NoReturn: - raise self.ex - - @staticmethod - def new(ex: BaseException) -> Any: - """ - Creates an object that raises the wrapped exception ``ex`` when used, - and casts it to :py:obj:`~typing.Any` type. - """ - return DeferredError(ex) diff --git a/.venv/Lib/site-packages/PIL/_version.py b/.venv/Lib/site-packages/PIL/_version.py deleted file mode 100644 index cebfd86..0000000 --- a/.venv/Lib/site-packages/PIL/_version.py +++ /dev/null @@ -1,4 +0,0 @@ -# Master version for Pillow -from __future__ import annotations - -__version__ = "10.4.0" diff --git a/.venv/Lib/site-packages/PIL/_webp.cp311-win_amd64.pyd b/.venv/Lib/site-packages/PIL/_webp.cp311-win_amd64.pyd deleted file mode 100644 index 03d9166fbe60d5bbce01df5515565e0319c3e9ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 412672 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

    `02!d;#bZke(D52T2IzRjTMN+f8bGGLiIvkv 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 T=B~=S6L%N=QdRk%KV$wEF-ziE diff --git a/.venv/Lib/site-packages/PIL/_webp.pyi b/.venv/Lib/site-packages/PIL/_webp.pyi deleted file mode 100644 index e27843e..0000000 --- a/.venv/Lib/site-packages/PIL/_webp.pyi +++ /dev/null @@ -1,3 +0,0 @@ -from typing import Any - -def __getattr__(name: str) -> Any: ... diff --git a/.venv/Lib/site-packages/PIL/features.py b/.venv/Lib/site-packages/PIL/features.py deleted file mode 100644 index 13908c4..0000000 --- a/.venv/Lib/site-packages/PIL/features.py +++ /dev/null @@ -1,340 +0,0 @@ -from __future__ import annotations - -import collections -import os -import sys -import warnings -from typing import IO - -import PIL - -from . import Image - -modules = { - "pil": ("PIL._imaging", "PILLOW_VERSION"), - "tkinter": ("PIL._tkinter_finder", "tk_version"), - "freetype2": ("PIL._imagingft", "freetype2_version"), - "littlecms2": ("PIL._imagingcms", "littlecms_version"), - "webp": ("PIL._webp", "webpdecoder_version"), -} - - -def check_module(feature: str) -> bool: - """ - Checks if a module is available. - - :param feature: The module to check for. - :returns: ``True`` if available, ``False`` otherwise. - :raises ValueError: If the module is not defined in this version of Pillow. - """ - if feature not in modules: - msg = f"Unknown module {feature}" - raise ValueError(msg) - - module, ver = modules[feature] - - try: - __import__(module) - return True - except ModuleNotFoundError: - return False - except ImportError as ex: - warnings.warn(str(ex)) - return False - - -def version_module(feature: str) -> str | None: - """ - :param feature: The module to check for. - :returns: - The loaded version number as a string, or ``None`` if unknown or not available. - :raises ValueError: If the module is not defined in this version of Pillow. - """ - if not check_module(feature): - return None - - module, ver = modules[feature] - - return getattr(__import__(module, fromlist=[ver]), ver) - - -def get_supported_modules() -> list[str]: - """ - :returns: A list of all supported modules. - """ - return [f for f in modules if check_module(f)] - - -codecs = { - "jpg": ("jpeg", "jpeglib"), - "jpg_2000": ("jpeg2k", "jp2klib"), - "zlib": ("zip", "zlib"), - "libtiff": ("libtiff", "libtiff"), -} - - -def check_codec(feature: str) -> bool: - """ - Checks if a codec is available. - - :param feature: The codec to check for. - :returns: ``True`` if available, ``False`` otherwise. - :raises ValueError: If the codec is not defined in this version of Pillow. - """ - if feature not in codecs: - msg = f"Unknown codec {feature}" - raise ValueError(msg) - - codec, lib = codecs[feature] - - return f"{codec}_encoder" in dir(Image.core) - - -def version_codec(feature: str) -> str | None: - """ - :param feature: The codec to check for. - :returns: - The version number as a string, or ``None`` if not available. - Checked at compile time for ``jpg``, run-time otherwise. - :raises ValueError: If the codec is not defined in this version of Pillow. - """ - if not check_codec(feature): - return None - - codec, lib = codecs[feature] - - version = getattr(Image.core, f"{lib}_version") - - if feature == "libtiff": - return version.split("\n")[0].split("Version ")[1] - - return version - - -def get_supported_codecs() -> list[str]: - """ - :returns: A list of all supported codecs. - """ - return [f for f in codecs if check_codec(f)] - - -features = { - "webp_anim": ("PIL._webp", "HAVE_WEBPANIM", None), - "webp_mux": ("PIL._webp", "HAVE_WEBPMUX", None), - "transp_webp": ("PIL._webp", "HAVE_TRANSPARENCY", None), - "raqm": ("PIL._imagingft", "HAVE_RAQM", "raqm_version"), - "fribidi": ("PIL._imagingft", "HAVE_FRIBIDI", "fribidi_version"), - "harfbuzz": ("PIL._imagingft", "HAVE_HARFBUZZ", "harfbuzz_version"), - "libjpeg_turbo": ("PIL._imaging", "HAVE_LIBJPEGTURBO", "libjpeg_turbo_version"), - "libimagequant": ("PIL._imaging", "HAVE_LIBIMAGEQUANT", "imagequant_version"), - "xcb": ("PIL._imaging", "HAVE_XCB", None), -} - - -def check_feature(feature: str) -> bool | None: - """ - Checks if a feature is available. - - :param feature: The feature to check for. - :returns: ``True`` if available, ``False`` if unavailable, ``None`` if unknown. - :raises ValueError: If the feature is not defined in this version of Pillow. - """ - if feature not in features: - msg = f"Unknown feature {feature}" - raise ValueError(msg) - - module, flag, ver = features[feature] - - try: - imported_module = __import__(module, fromlist=["PIL"]) - return getattr(imported_module, flag) - except ModuleNotFoundError: - return None - except ImportError as ex: - warnings.warn(str(ex)) - return None - - -def version_feature(feature: str) -> str | None: - """ - :param feature: The feature to check for. - :returns: The version number as a string, or ``None`` if not available. - :raises ValueError: If the feature is not defined in this version of Pillow. - """ - if not check_feature(feature): - return None - - module, flag, ver = features[feature] - - if ver is None: - return None - - return getattr(__import__(module, fromlist=[ver]), ver) - - -def get_supported_features() -> list[str]: - """ - :returns: A list of all supported features. - """ - return [f for f in features if check_feature(f)] - - -def check(feature: str) -> bool | None: - """ - :param feature: A module, codec, or feature name. - :returns: - ``True`` if the module, codec, or feature is available, - ``False`` or ``None`` otherwise. - """ - - if feature in modules: - return check_module(feature) - if feature in codecs: - return check_codec(feature) - if feature in features: - return check_feature(feature) - warnings.warn(f"Unknown feature '{feature}'.", stacklevel=2) - return False - - -def version(feature: str) -> str | None: - """ - :param feature: - The module, codec, or feature to check for. - :returns: - The version number as a string, or ``None`` if unknown or not available. - """ - if feature in modules: - return version_module(feature) - if feature in codecs: - return version_codec(feature) - if feature in features: - return version_feature(feature) - return None - - -def get_supported() -> list[str]: - """ - :returns: A list of all supported modules, features, and codecs. - """ - - ret = get_supported_modules() - ret.extend(get_supported_features()) - ret.extend(get_supported_codecs()) - return ret - - -def pilinfo(out: IO[str] | None = None, supported_formats: bool = True) -> None: - """ - Prints information about this installation of Pillow. - This function can be called with ``python3 -m PIL``. - It can also be called with ``python3 -m PIL.report`` or ``python3 -m PIL --report`` - to have "supported_formats" set to ``False``, omitting the list of all supported - image file formats. - - :param out: - The output stream to print to. Defaults to ``sys.stdout`` if ``None``. - :param supported_formats: - If ``True``, a list of all supported image file formats will be printed. - """ - - if out is None: - out = sys.stdout - - Image.init() - - print("-" * 68, file=out) - print(f"Pillow {PIL.__version__}", file=out) - py_version_lines = sys.version.splitlines() - print(f"Python {py_version_lines[0].strip()}", file=out) - for py_version in py_version_lines[1:]: - print(f" {py_version.strip()}", file=out) - print("-" * 68, file=out) - print(f"Python executable is {sys.executable or 'unknown'}", file=out) - if sys.prefix != sys.base_prefix: - print(f"Environment Python files loaded from {sys.prefix}", file=out) - print(f"System Python files loaded from {sys.base_prefix}", file=out) - print("-" * 68, file=out) - print( - f"Python Pillow modules loaded from {os.path.dirname(Image.__file__)}", - file=out, - ) - print( - f"Binary Pillow modules loaded from {os.path.dirname(Image.core.__file__)}", - file=out, - ) - print("-" * 68, file=out) - - for name, feature in [ - ("pil", "PIL CORE"), - ("tkinter", "TKINTER"), - ("freetype2", "FREETYPE2"), - ("littlecms2", "LITTLECMS2"), - ("webp", "WEBP"), - ("transp_webp", "WEBP Transparency"), - ("webp_mux", "WEBPMUX"), - ("webp_anim", "WEBP Animation"), - ("jpg", "JPEG"), - ("jpg_2000", "OPENJPEG (JPEG2000)"), - ("zlib", "ZLIB (PNG/ZIP)"), - ("libtiff", "LIBTIFF"), - ("raqm", "RAQM (Bidirectional Text)"), - ("libimagequant", "LIBIMAGEQUANT (Quantization method)"), - ("xcb", "XCB (X protocol)"), - ]: - if check(name): - v: str | None = None - if name == "jpg": - libjpeg_turbo_version = version_feature("libjpeg_turbo") - if libjpeg_turbo_version is not None: - v = "libjpeg-turbo " + libjpeg_turbo_version - if v is None: - v = version(name) - if v is not None: - version_static = name in ("pil", "jpg") - if name == "littlecms2": - # this check is also in src/_imagingcms.c:setup_module() - version_static = tuple(int(x) for x in v.split(".")) < (2, 7) - t = "compiled for" if version_static else "loaded" - if name == "raqm": - for f in ("fribidi", "harfbuzz"): - v2 = version_feature(f) - if v2 is not None: - v += f", {f} {v2}" - print("---", feature, "support ok,", t, v, file=out) - else: - print("---", feature, "support ok", file=out) - else: - print("***", feature, "support not installed", file=out) - print("-" * 68, file=out) - - if supported_formats: - extensions = collections.defaultdict(list) - for ext, i in Image.EXTENSION.items(): - extensions[i].append(ext) - - for i in sorted(Image.ID): - line = f"{i}" - if i in Image.MIME: - line = f"{line} {Image.MIME[i]}" - print(line, file=out) - - if i in extensions: - print( - "Extensions: {}".format(", ".join(sorted(extensions[i]))), file=out - ) - - features = [] - if i in Image.OPEN: - features.append("open") - if i in Image.SAVE: - features.append("save") - if i in Image.SAVE_ALL: - features.append("save_all") - if i in Image.DECODERS: - features.append("decode") - if i in Image.ENCODERS: - features.append("encode") - - print("Features: {}".format(", ".join(features)), file=out) - print("-" * 68, file=out) diff --git a/.venv/Lib/site-packages/PIL/py.typed b/.venv/Lib/site-packages/PIL/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/Lib/site-packages/PIL/report.py b/.venv/Lib/site-packages/PIL/report.py deleted file mode 100644 index d2815e8..0000000 --- a/.venv/Lib/site-packages/PIL/report.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import annotations - -from .features import pilinfo - -pilinfo(supported_formats=False) diff --git a/.venv/Lib/site-packages/__pycache__/pylab.cpython-311.pyc b/.venv/Lib/site-packages/__pycache__/pylab.cpython-311.pyc deleted file mode 100644 index b3d40adcf3575bf420eb68d90da1a9f18bc1ac0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 351 zcmZ3^%ge<81P;%qq~!tW#~=<2FhLog^?;1&3@HpLj5!P;Aet$MA&N1TF$<=GA&VKN zDT+CTDVRZ%`6Wm|lkpa#mY*ieErHy`l7gK4lAO#Wy@JY|#H3qX2$5T?5Fz&X_>}zQ z`1q9!pFx^`RXAJ4gche37009&rKIL6?$zxa4P-=BDPAq{al7 zl%`~s=Ek^qIEBZA7#SEC#26YX1m~xflqVLY#uykXxQBYilz=4S(@QgB%2M;nVtg`_ zVu~|MQgsUwld}`kQ;TE3&H%da7l%!5eoARhs$CH`&>@UKT&x2mJ}@&fGTva2y8uHs a7{o8Y&DxP;w3!yZW-_Db$ypImZ< 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 J{T2t{{|6JGbie=r diff --git a/.venv/Lib/site-packages/_distutils_hack/__init__.py b/.venv/Lib/site-packages/_distutils_hack/__init__.py deleted file mode 100644 index f987a53..0000000 --- a/.venv/Lib/site-packages/_distutils_hack/__init__.py +++ /dev/null @@ -1,222 +0,0 @@ -# don't import any costly modules -import sys -import os - - -is_pypy = '__pypy__' in sys.builtin_module_names - - -def warn_distutils_present(): - if 'distutils' not in sys.modules: - return - if is_pypy and sys.version_info < (3, 7): - # PyPy for 3.6 unconditionally imports distutils, so bypass the warning - # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 - return - import warnings - - warnings.warn( - "Distutils was imported before Setuptools, but importing Setuptools " - "also replaces the `distutils` module in `sys.modules`. This may lead " - "to undesirable behaviors or errors. To avoid these issues, avoid " - "using distutils directly, ensure that setuptools is installed in the " - "traditional way (e.g. not an editable install), and/or make sure " - "that setuptools is always imported before distutils." - ) - - -def clear_distutils(): - if 'distutils' not in sys.modules: - return - import warnings - - warnings.warn("Setuptools is replacing distutils.") - mods = [ - name - for name in sys.modules - if name == "distutils" or name.startswith("distutils.") - ] - for name in mods: - del sys.modules[name] - - -def enabled(): - """ - Allow selection of distutils by environment variable. - """ - which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local') - return which == 'local' - - -def ensure_local_distutils(): - import importlib - - clear_distutils() - - # With the DistutilsMetaFinder in place, - # perform an import to cause distutils to be - # loaded from setuptools._distutils. Ref #2906. - with shim(): - importlib.import_module('distutils') - - # check that submodules load as expected - core = importlib.import_module('distutils.core') - assert '_distutils' in core.__file__, core.__file__ - assert 'setuptools._distutils.log' not in sys.modules - - -def do_override(): - """ - Ensure that the local copy of distutils is preferred over stdlib. - - See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 - for more motivation. - """ - if enabled(): - warn_distutils_present() - ensure_local_distutils() - - -class _TrivialRe: - def __init__(self, *patterns): - self._patterns = patterns - - def match(self, string): - return all(pat in string for pat in self._patterns) - - -class DistutilsMetaFinder: - def find_spec(self, fullname, path, target=None): - # optimization: only consider top level modules and those - # found in the CPython test suite. - if path is not None and not fullname.startswith('test.'): - return - - method_name = 'spec_for_{fullname}'.format(**locals()) - method = getattr(self, method_name, lambda: None) - return method() - - def spec_for_distutils(self): - if self.is_cpython(): - return - - import importlib - import importlib.abc - import importlib.util - - try: - mod = importlib.import_module('setuptools._distutils') - except Exception: - # There are a couple of cases where setuptools._distutils - # may not be present: - # - An older Setuptools without a local distutils is - # taking precedence. Ref #2957. - # - Path manipulation during sitecustomize removes - # setuptools from the path but only after the hook - # has been loaded. Ref #2980. - # In either case, fall back to stdlib behavior. - return - - class DistutilsLoader(importlib.abc.Loader): - def create_module(self, spec): - mod.__name__ = 'distutils' - return mod - - def exec_module(self, module): - pass - - return importlib.util.spec_from_loader( - 'distutils', DistutilsLoader(), origin=mod.__file__ - ) - - @staticmethod - def is_cpython(): - """ - Suppress supplying distutils for CPython (build and tests). - Ref #2965 and #3007. - """ - return os.path.isfile('pybuilddir.txt') - - def spec_for_pip(self): - """ - Ensure stdlib distutils when running under pip. - See pypa/pip#8761 for rationale. - """ - if self.pip_imported_during_build(): - return - clear_distutils() - self.spec_for_distutils = lambda: None - - @classmethod - def pip_imported_during_build(cls): - """ - Detect if pip is being imported in a build script. Ref #2355. - """ - import traceback - - return any( - cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None) - ) - - @staticmethod - def frame_file_is_setup(frame): - """ - Return True if the indicated frame suggests a setup.py file. - """ - # some frames may not have __file__ (#2940) - return frame.f_globals.get('__file__', '').endswith('setup.py') - - def spec_for_sensitive_tests(self): - """ - Ensure stdlib distutils when running select tests under CPython. - - python/cpython#91169 - """ - clear_distutils() - self.spec_for_distutils = lambda: None - - sensitive_tests = ( - [ - 'test.test_distutils', - 'test.test_peg_generator', - 'test.test_importlib', - ] - if sys.version_info < (3, 10) - else [ - 'test.test_distutils', - ] - ) - - -for name in DistutilsMetaFinder.sensitive_tests: - setattr( - DistutilsMetaFinder, - f'spec_for_{name}', - DistutilsMetaFinder.spec_for_sensitive_tests, - ) - - -DISTUTILS_FINDER = DistutilsMetaFinder() - - -def add_shim(): - DISTUTILS_FINDER in sys.meta_path or insert_shim() - - -class shim: - def __enter__(self): - insert_shim() - - def __exit__(self, exc, value, tb): - remove_shim() - - -def insert_shim(): - sys.meta_path.insert(0, DISTUTILS_FINDER) - - -def remove_shim(): - try: - sys.meta_path.remove(DISTUTILS_FINDER) - except ValueError: - pass diff --git a/.venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 8ec9b02306b9128b5e96f8a19c89c6108b64e5cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11213 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 LfMgm0XQ=-L4@MSY diff --git a/.venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc b/.venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc deleted file mode 100644 index 4b0b672b679ad389c63e15f84a9e7a7e66dbca39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmZ8cO-n*S6unO&e~P5}aOP5r43} zKiS8+CZ&-Sr>GEF9X7B^x2D;ZmSaVBY(zanSTmLj8)4<__zExgf*`ZTDTCuuU5OW!y~y?evGs%t0i%?b4yjxNPz2dedFs iY0vXMz`ye+*^MdWXOMq~;u{pFP?|w$k{q?>9{&K@%4ISD diff --git a/.venv/Lib/site-packages/_distutils_hack/override.py b/.venv/Lib/site-packages/_distutils_hack/override.py deleted file mode 100644 index 2cc433a..0000000 --- a/.venv/Lib/site-packages/_distutils_hack/override.py +++ /dev/null @@ -1 +0,0 @@ -__import__('_distutils_hack').do_override() diff --git a/.venv/Lib/site-packages/contourpy-1.2.1.dist-info/INSTALLER b/.venv/Lib/site-packages/contourpy-1.2.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/contourpy-1.2.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/contourpy-1.2.1.dist-info/LICENSE b/.venv/Lib/site-packages/contourpy-1.2.1.dist-info/LICENSE deleted file mode 100644 index 96837bd..0000000 --- a/.venv/Lib/site-packages/contourpy-1.2.1.dist-info/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2021-2024, ContourPy Developers. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/.venv/Lib/site-packages/contourpy-1.2.1.dist-info/METADATA b/.venv/Lib/site-packages/contourpy-1.2.1.dist-info/METADATA deleted file mode 100644 index 7078d82..0000000 --- a/.venv/Lib/site-packages/contourpy-1.2.1.dist-info/METADATA +++ /dev/null @@ -1,91 +0,0 @@ -Metadata-Version: 2.1 -Name: contourpy -Version: 1.2.1 -Summary: Python library for calculating contours of 2D quadrilateral grids -Author-Email: Ian Thomas -License: BSD 3-Clause License - - Copyright (c) 2021-2024, ContourPy Developers. - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: Science/Research -Classifier: License :: OSI Approved :: BSD License -Classifier: Programming Language :: C++ -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Topic :: Scientific/Engineering :: Information Analysis -Classifier: Topic :: Scientific/Engineering :: Mathematics -Classifier: Topic :: Scientific/Engineering :: Visualization -Project-URL: Homepage, https://github.com/contourpy/contourpy -Project-URL: Changelog, https://contourpy.readthedocs.io/en/latest/changelog.html -Project-URL: Documentation, https://contourpy.readthedocs.io -Project-URL: Repository, https://github.com/contourpy/contourpy -Requires-Python: >=3.9 -Requires-Dist: numpy>=1.20 -Requires-Dist: furo; extra == "docs" -Requires-Dist: sphinx>=7.2; extra == "docs" -Requires-Dist: sphinx-copybutton; extra == "docs" -Requires-Dist: bokeh; extra == "bokeh" -Requires-Dist: selenium; extra == "bokeh" -Requires-Dist: contourpy[bokeh,docs]; extra == "mypy" -Requires-Dist: docutils-stubs; extra == "mypy" -Requires-Dist: mypy==1.8.0; extra == "mypy" -Requires-Dist: types-Pillow; extra == "mypy" -Requires-Dist: contourpy[test-no-images]; extra == "test" -Requires-Dist: matplotlib; extra == "test" -Requires-Dist: Pillow; extra == "test" -Requires-Dist: pytest; extra == "test-no-images" -Requires-Dist: pytest-cov; extra == "test-no-images" -Requires-Dist: pytest-xdist; extra == "test-no-images" -Requires-Dist: wurlitzer; extra == "test-no-images" -Provides-Extra: docs -Provides-Extra: bokeh -Provides-Extra: mypy -Provides-Extra: test -Provides-Extra: test-no-images -Description-Content-Type: text/markdown - -ContourPy - -ContourPy is a Python library for calculating contours of 2D quadrilateral grids. It is written in C++11 and wrapped using pybind11. - -It contains the 2005 and 2014 algorithms used in Matplotlib as well as a newer algorithm that includes more features and is available in both serial and multithreaded versions. It provides an easy way for Python libraries to use contouring algorithms without having to include Matplotlib as a dependency. - - * **Documentation**: https://contourpy.readthedocs.io - * **Source code**: https://github.com/contourpy/contourpy - -| | | -| --- | --- | -| Latest release | [![PyPI version](https://img.shields.io/pypi/v/contourpy.svg?label=pypi&color=fdae61)](https://pypi.python.org/pypi/contourpy) [![conda-forge version](https://img.shields.io/conda/v/conda-forge/contourpy.svg?label=conda-forge&color=a6d96a)](https://anaconda.org/conda-forge/contourpy) [![anaconda version](https://img.shields.io/conda/v/anaconda/contourpy.svg?label=anaconda&color=1a9641)](https://anaconda.org/anaconda/contourpy) | -| Downloads | [![PyPi downloads](https://img.shields.io/pypi/dm/contourpy?label=pypi&style=flat&color=fdae61)](https://pepy.tech/project/contourpy) [![conda-forge downloads](https://raw.githubusercontent.com/contourpy/condabadges/main/cache/contourpy_conda-forge_monthly.svg)](https://anaconda.org/conda-forge/contourpy) [![anaconda downloads](https://raw.githubusercontent.com/contourpy/condabadges/main/cache/contourpy_anaconda_monthly.svg)](https://anaconda.org/anaconda/contourpy) | -| Python version | [![Platforms](https://img.shields.io/pypi/pyversions/contourpy?color=fdae61)](https://pypi.org/project/contourpy/) | -| Coverage | [![Codecov](https://img.shields.io/codecov/c/gh/contourpy/contourpy?color=fdae61&label=codecov)](https://app.codecov.io/gh/contourpy/contourpy) | diff --git a/.venv/Lib/site-packages/contourpy-1.2.1.dist-info/RECORD b/.venv/Lib/site-packages/contourpy-1.2.1.dist-info/RECORD deleted file mode 100644 index 4b28095..0000000 --- a/.venv/Lib/site-packages/contourpy-1.2.1.dist-info/RECORD +++ /dev/null @@ -1,43 +0,0 @@ -contourpy-1.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -contourpy-1.2.1.dist-info/LICENSE,sha256=hamqU9Nd_wIY2d9WcmYV8GwT4qST4_FAeIK8UeX_91g,1563 -contourpy-1.2.1.dist-info/METADATA,sha256=2P2_nKjGaPLSnVIu_O4EdfAkPhic9smE2DwyQuB7emE,5802 -contourpy-1.2.1.dist-info/RECORD,, -contourpy-1.2.1.dist-info/WHEEL,sha256=JdLTWhc73oJ-lqTBYGgiVontr_vhzwzbpAOin_2bxTI,85 -contourpy/__init__.py,sha256=8K6slO34VoahE8nknU93GSGeh7h1x9oI-GAo-UGTJfg,11597 -contourpy/__pycache__/__init__.cpython-311.pyc,, -contourpy/__pycache__/_version.cpython-311.pyc,, -contourpy/__pycache__/array.cpython-311.pyc,, -contourpy/__pycache__/chunk.cpython-311.pyc,, -contourpy/__pycache__/convert.cpython-311.pyc,, -contourpy/__pycache__/dechunk.cpython-311.pyc,, -contourpy/__pycache__/enum_util.cpython-311.pyc,, -contourpy/__pycache__/typecheck.cpython-311.pyc,, -contourpy/__pycache__/types.cpython-311.pyc,, -contourpy/_contourpy.cp311-win_amd64.lib,sha256=wkv6ousv10sXsmJME3FNpN5qC-2xX_gEodZ2SecLLV4,2068 -contourpy/_contourpy.cp311-win_amd64.pyd,sha256=rmspptZ358b37z3VdC9qHUfwT67Gu3TmW7gZ5DDpAh4,395776 -contourpy/_contourpy.pyi,sha256=HZVjmlE8MJb31mOnxuipIcrqrkGpyGILOI-z8AAb_I0,7167 -contourpy/_version.py,sha256=1y7BBR2l-3BuWrDXe70lefKZxLd53JVfWAfn4y7Mn_0,23 -contourpy/array.py,sha256=B-VnRnmWOfazZgJt_-5ihPxPk1NZdaSIFW9E8eoQa5Y,9273 -contourpy/chunk.py,sha256=vk1Eg6NVxz13MWz4xlbHA_PCGTaD18IeUZG0r2Wc2ZE,3374 -contourpy/convert.py,sha256=O5GAr_Q5wXABMJ0Cw1MLbU0qbNax1EkPpa_g1hMbC70,23953 -contourpy/dechunk.py,sha256=YAzM0dgd3xG-sdecVlAGWh3_UEcWvToWI69Q-mbN19Q,5642 -contourpy/enum_util.py,sha256=hSwkZ9OZ4aVdFh6D774C0xzOPrMw0bxAbZdWFRptRtw,1576 -contourpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -contourpy/typecheck.py,sha256=xySA3K7iawICRjJEisFU8lZi9ca3w1OlksYw-HlOZgg,10950 -contourpy/types.py,sha256=Ob3EIVmG5oc3HjP_MX-r7RsJR7hVnffqmI6xR_1qcgA,260 -contourpy/util/__init__.py,sha256=bqLYeBm_n6tulOyk8mgqdLUbwX2GttvCm0KkeNbASlY,123 -contourpy/util/__pycache__/__init__.cpython-311.pyc,, -contourpy/util/__pycache__/_build_config.cpython-311.pyc,, -contourpy/util/__pycache__/bokeh_renderer.cpython-311.pyc,, -contourpy/util/__pycache__/bokeh_util.cpython-311.pyc,, -contourpy/util/__pycache__/data.cpython-311.pyc,, -contourpy/util/__pycache__/mpl_renderer.cpython-311.pyc,, -contourpy/util/__pycache__/mpl_util.cpython-311.pyc,, -contourpy/util/__pycache__/renderer.cpython-311.pyc,, -contourpy/util/_build_config.py,sha256=PRG7bKZtauchkpS3a1Jk3hZ8-AC0eTygnW6rI_q6OKk,1977 -contourpy/util/bokeh_renderer.py,sha256=uc9rH7e2U5faU2pY06uvLJPx6iiuc03IfEjQExRiYpM,14107 -contourpy/util/bokeh_util.py,sha256=0YlD2IPzW_TSS_s6tG6zGTThJwPfqsEo_pJJsUVbJhA,2878 -contourpy/util/data.py,sha256=X_7Tyw0Z2fTgVmAwRef43KG6jzKOk0n5m5WFZ-Majxc,2644 -contourpy/util/mpl_renderer.py,sha256=MtdWmWote99990cn0Tig9D9gnfqnWVamz23nEGljHiA,20595 -contourpy/util/mpl_util.py,sha256=Vx_yIkMCIdy_Qpe3d_2eURPAv-hDIUYcprbE9b__DLk,3514 -contourpy/util/renderer.py,sha256=_46HG1jOmWLJpRpRUcTX6dS8oSZO6UV25RF8j7wGHF8,2473 diff --git a/.venv/Lib/site-packages/contourpy-1.2.1.dist-info/WHEEL b/.venv/Lib/site-packages/contourpy-1.2.1.dist-info/WHEEL deleted file mode 100644 index 7f839d4..0000000 --- a/.venv/Lib/site-packages/contourpy-1.2.1.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: meson -Root-Is-Purelib: false -Tag: cp311-cp311-win_amd64 \ No newline at end of file diff --git a/.venv/Lib/site-packages/contourpy/__init__.py b/.venv/Lib/site-packages/contourpy/__init__.py deleted file mode 100644 index aa6baf9..0000000 --- a/.venv/Lib/site-packages/contourpy/__init__.py +++ /dev/null @@ -1,267 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING - -import numpy as np - -from contourpy._contourpy import ( - ContourGenerator, - FillType, - LineType, - Mpl2005ContourGenerator, - Mpl2014ContourGenerator, - SerialContourGenerator, - ThreadedContourGenerator, - ZInterp, - max_threads, -) -from contourpy._version import __version__ -from contourpy.chunk import calc_chunk_sizes -from contourpy.convert import convert_filled, convert_lines -from contourpy.dechunk import dechunk_filled, dechunk_lines -from contourpy.enum_util import as_fill_type, as_line_type, as_z_interp - -if TYPE_CHECKING: - from typing import Any - - from numpy.typing import ArrayLike - - from ._contourpy import CoordinateArray, MaskArray - -__all__ = [ - "__version__", - "contour_generator", - "convert_filled", - "convert_lines", - "dechunk_filled", - "dechunk_lines", - "max_threads", - "FillType", - "LineType", - "ContourGenerator", - "Mpl2005ContourGenerator", - "Mpl2014ContourGenerator", - "SerialContourGenerator", - "ThreadedContourGenerator", - "ZInterp", -] - - -# Simple mapping of algorithm name to class name. -_class_lookup: dict[str, type[ContourGenerator]] = { - "mpl2005": Mpl2005ContourGenerator, - "mpl2014": Mpl2014ContourGenerator, - "serial": SerialContourGenerator, - "threaded": ThreadedContourGenerator, -} - - -def _remove_z_mask( - z: ArrayLike | np.ma.MaskedArray[Any, Any] | None, -) -> tuple[CoordinateArray, MaskArray | None]: - # Preserve mask if present. - z_array = np.ma.asarray(z, dtype=np.float64) # type: ignore[no-untyped-call] - z_masked = np.ma.masked_invalid(z_array, copy=False) # type: ignore[no-untyped-call] - - if np.ma.is_masked(z_masked): # type: ignore[no-untyped-call] - mask = np.ma.getmask(z_masked) # type: ignore[no-untyped-call] - else: - mask = None - - return np.ma.getdata(z_masked), mask # type: ignore[no-untyped-call] - - -def contour_generator( - x: ArrayLike | None = None, - y: ArrayLike | None = None, - z: ArrayLike | np.ma.MaskedArray[Any, Any] | None = None, - *, - name: str = "serial", - corner_mask: bool | None = None, - line_type: LineType | str | None = None, - fill_type: FillType | str | None = None, - chunk_size: int | tuple[int, int] | None = None, - chunk_count: int | tuple[int, int] | None = None, - total_chunk_count: int | None = None, - quad_as_tri: bool = False, - z_interp: ZInterp | str | None = ZInterp.Linear, - thread_count: int = 0, -) -> ContourGenerator: - """Create and return a :class:`~contourpy._contourpy.ContourGenerator` object. - - The class and properties of the returned :class:`~contourpy._contourpy.ContourGenerator` are - determined by the function arguments, with sensible defaults. - - Args: - x (array-like of shape (ny, nx) or (nx,), optional): The x-coordinates of the ``z`` values. - May be 2D with the same shape as ``z.shape``, or 1D with length ``nx = z.shape[1]``. - If not specified are assumed to be ``np.arange(nx)``. Must be ordered monotonically. - y (array-like of shape (ny, nx) or (ny,), optional): The y-coordinates of the ``z`` values. - May be 2D with the same shape as ``z.shape``, or 1D with length ``ny = z.shape[0]``. - If not specified are assumed to be ``np.arange(ny)``. Must be ordered monotonically. - z (array-like of shape (ny, nx), may be a masked array): The 2D gridded values to calculate - the contours of. May be a masked array, and any invalid values (``np.inf`` or - ``np.nan``) will also be masked out. - name (str): Algorithm name, one of ``"serial"``, ``"threaded"``, ``"mpl2005"`` or - ``"mpl2014"``, default ``"serial"``. - corner_mask (bool, optional): Enable/disable corner masking, which only has an effect if - ``z`` is a masked array. If ``False``, any quad touching a masked point is masked out. - If ``True``, only the triangular corners of quads nearest these points are always masked - out, other triangular corners comprising three unmasked points are contoured as usual. - If not specified, uses the default provided by the algorithm ``name``. - line_type (LineType or str, optional): The format of contour line data returned from calls - to :meth:`~contourpy.ContourGenerator.lines`, specified either as a - :class:`~contourpy.LineType` or its string equivalent such as ``"SeparateCode"``. - If not specified, uses the default provided by the algorithm ``name``. - fill_type (FillType or str, optional): The format of filled contour data returned from calls - to :meth:`~contourpy.ContourGenerator.filled`, specified either as a - :class:`~contourpy.FillType` or its string equivalent such as ``"OuterOffset"``. - If not specified, uses the default provided by the algorithm ``name``. - chunk_size (int or tuple(int, int), optional): Chunk size in (y, x) directions, or the same - size in both directions if only one value is specified. - chunk_count (int or tuple(int, int), optional): Chunk count in (y, x) directions, or the - same count in both directions if only one value is specified. - total_chunk_count (int, optional): Total number of chunks. - quad_as_tri (bool): Enable/disable treating quads as 4 triangles, default ``False``. - If ``False``, a contour line within a quad is a straight line between points on two of - its edges. If ``True``, each full quad is divided into 4 triangles using a virtual point - at the centre (mean x, y of the corner points) and a contour line is piecewise linear - within those triangles. Corner-masked triangles are not affected by this setting, only - full unmasked quads. - z_interp (ZInterp or str, optional): How to interpolate ``z`` values when determining where - contour lines intersect the edges of quads and the ``z`` values of the central points of - quads, specified either as a :class:`~contourpy.ZInterp` or its string equivalent such - as ``"Log"``. Default is ``ZInterp.Linear``. - thread_count (int): Number of threads to use for contour calculation, default 0. Threads can - only be used with an algorithm ``name`` that supports threads (currently only - ``name="threaded"``) and there must be at least the same number of chunks as threads. - If ``thread_count=0`` and ``name="threaded"`` then it uses the maximum number of threads - as determined by the C++11 call ``std::thread::hardware_concurrency()``. If ``name`` is - something other than ``"threaded"`` then the ``thread_count`` will be set to ``1``. - - Return: - :class:`~contourpy._contourpy.ContourGenerator`. - - Note: - A maximum of one of ``chunk_size``, ``chunk_count`` and ``total_chunk_count`` may be - specified. - - Warning: - The ``name="mpl2005"`` algorithm does not implement chunking for contour lines. - """ - x = np.asarray(x, dtype=np.float64) - y = np.asarray(y, dtype=np.float64) - z, mask = _remove_z_mask(z) - - # Check arguments: z. - if z.ndim != 2: - raise TypeError(f"Input z must be 2D, not {z.ndim}D") - - if z.shape[0] < 2 or z.shape[1] < 2: - raise TypeError(f"Input z must be at least a (2, 2) shaped array, but has shape {z.shape}") - - ny, nx = z.shape - - # Check arguments: x and y. - if x.ndim != y.ndim: - raise TypeError(f"Number of dimensions of x ({x.ndim}) and y ({y.ndim}) do not match") - - if x.ndim == 0: - x = np.arange(nx, dtype=np.float64) - y = np.arange(ny, dtype=np.float64) - x, y = np.meshgrid(x, y) - elif x.ndim == 1: - if len(x) != nx: - raise TypeError(f"Length of x ({len(x)}) must match number of columns in z ({nx})") - if len(y) != ny: - raise TypeError(f"Length of y ({len(y)}) must match number of rows in z ({ny})") - x, y = np.meshgrid(x, y) - elif x.ndim == 2: - if x.shape != z.shape: - raise TypeError(f"Shapes of x {x.shape} and z {z.shape} do not match") - if y.shape != z.shape: - raise TypeError(f"Shapes of y {y.shape} and z {z.shape} do not match") - else: - raise TypeError(f"Inputs x and y must be None, 1D or 2D, not {x.ndim}D") - - # Check mask shape just in case. - if mask is not None and mask.shape != z.shape: - raise ValueError("If mask is set it must be a 2D array with the same shape as z") - - # Check arguments: name. - if name not in _class_lookup: - raise ValueError(f"Unrecognised contour generator name: {name}") - - # Check arguments: chunk_size, chunk_count and total_chunk_count. - y_chunk_size, x_chunk_size = calc_chunk_sizes( - chunk_size, chunk_count, total_chunk_count, ny, nx) - - cls = _class_lookup[name] - - # Check arguments: corner_mask. - if corner_mask is None: - # Set it to default, which is True if the algorithm supports it. - corner_mask = cls.supports_corner_mask() - elif corner_mask and not cls.supports_corner_mask(): - raise ValueError(f"{name} contour generator does not support corner_mask=True") - - # Check arguments: line_type. - if line_type is None: - line_type = cls.default_line_type - else: - line_type = as_line_type(line_type) - - if not cls.supports_line_type(line_type): - raise ValueError(f"{name} contour generator does not support line_type {line_type}") - - # Check arguments: fill_type. - if fill_type is None: - fill_type = cls.default_fill_type - else: - fill_type = as_fill_type(fill_type) - - if not cls.supports_fill_type(fill_type): - raise ValueError(f"{name} contour generator does not support fill_type {fill_type}") - - # Check arguments: quad_as_tri. - if quad_as_tri and not cls.supports_quad_as_tri(): - raise ValueError(f"{name} contour generator does not support quad_as_tri=True") - - # Check arguments: z_interp. - if z_interp is None: - z_interp = ZInterp.Linear - else: - z_interp = as_z_interp(z_interp) - - if z_interp != ZInterp.Linear and not cls.supports_z_interp(): - raise ValueError(f"{name} contour generator does not support z_interp {z_interp}") - - # Check arguments: thread_count. - if thread_count not in (0, 1) and not cls.supports_threads(): - raise ValueError(f"{name} contour generator does not support thread_count {thread_count}") - - # Prepare args and kwargs for contour generator constructor. - args = [x, y, z, mask] - kwargs: dict[str, int | bool | LineType | FillType | ZInterp] = { - "x_chunk_size": x_chunk_size, - "y_chunk_size": y_chunk_size, - } - - if name not in ("mpl2005", "mpl2014"): - kwargs["line_type"] = line_type - kwargs["fill_type"] = fill_type - - if cls.supports_corner_mask(): - kwargs["corner_mask"] = corner_mask - - if cls.supports_quad_as_tri(): - kwargs["quad_as_tri"] = quad_as_tri - - if cls.supports_z_interp(): - kwargs["z_interp"] = z_interp - - if cls.supports_threads(): - kwargs["thread_count"] = thread_count - - # Create contour generator. - return cls(*args, **kwargs) diff --git a/.venv/Lib/site-packages/contourpy/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/contourpy/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c30855ac319049a8a5c63066eb3774e5fdc926bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12968 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 ImPBg)7o$J?lmGw# diff --git a/.venv/Lib/site-packages/contourpy/__pycache__/_version.cpython-311.pyc b/.venv/Lib/site-packages/contourpy/__pycache__/_version.cpython-311.pyc deleted file mode 100644 index b08a847061eb2f6e08e689e8fc7a8553718fa53f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 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 diff --git a/.venv/Lib/site-packages/contourpy/__pycache__/chunk.cpython-311.pyc b/.venv/Lib/site-packages/contourpy/__pycache__/chunk.cpython-311.pyc deleted file mode 100644 index 6774e65702c967e15db7c1dc301847d2632395ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4021 zcmb6cO>7hCb!Kd5#-7-Lz?uXC`H}{R!Gt(vfzYMh5V{a3K`iW|23N_%GY&)SnefdF zB-TXAqCI$5J-8Jsvf3hL5A0HH59zIkR-(5(jw2tek&rA^tBPAB)I)RX`@ZpSBG~QN zdh`9g_r3r3=G$;M#K80ZzaOWE!VL2-GO0bBH(*~MgTWIy!r zIsB=A$|vuZJK*h?xtmO^^A$miv92g-nr=#_s%yri8%o`^wE1a6%_&J4$Wwi6 zPUgM=vwc@J9pD98=gS;9Gf(%iPZpLLEn#zZpuQ4>l|eIDqX-nZR=$=&9@}5lg3oSS zX0=^*o6L3BQD7!CW@&C2H2TRGrdU6~*sR&!n6+|<+iW%o{4Mj#g66l`MV5@-D6z0Z z;;P14slJ5*zk@K*CmCy#b?UQ(-3tXp6C#m4GaO+`;9L z*4v^t=B;{TsNM*c-)1~~J0uHrKMdB!+q^f_$~Aai&<>?ZD2q}8+s@ncr1?e1(Fb?Oza#QCmDf~gZM{-OL4Rq zL$ZpM6wMiM7Vz&X$dIy1{SI;u;eepb>gL@h1f-^su4R@0z_x*m1tq1XRYe{`<1`nc zSp{jz9HgWN%21tRQ*QY`*rw^}t$f!npe%z7sE+f~8J|d_jA9s|2T4PTI5HFynL0`| z*x!*LsSquSzD05<(yZ*Pf{~u~>|_j~A1AIYQEFhU$vXBNR%NuHgG~)0|I&%N$r?;) zi$99D*o;SY^&w5)4R@kxyx}{|4r743REq*}2JoDwS*+@ule(!is7)zYCmuzd19UJm z)9}`rnRtCpZ8S53Bu$339m<6rj5^YJd$w_6=Ol5RSPF~dKt*oM%O7f;@ z$*Pr2Uc7wacJkK9@bGXlkw7=~wE0lNN^&@XE`2nSG|9&FoTVloDB6SMZ`9eOp_RKY_FOYW`|q|7FVG;lv~Ni<^o7hGe7`OgR=i1{n4veVwb zc6Hr!27ck3pL9N+a?VdV;+-O&Eb&QadS-*4arl{+kuIluwirp3A}L2mRrp|j?9qdj z2Zhdp^v7r+O7|yUj5yts@c+Kkdjl*+u9qU$9pQR~?{fHo@_~b^(wC>!`qyrJJ@Dm; ze83=c*%gm&Kknc0=rQ#J+O({`{5vm2&vd+R2S@ z!U-qJ-MwVxhiISE|MOz>R4IBYf2rKDyKv$2hxv!)Lx&4uL9Fy1S-bzI-19T*iNBn4 z4xNS-zSH3ky%gUm%s+d#D8@=+Y?JW?&z6s$F18QmudSY6Jzt5RaoW$o_}a^^15d}- z!q4v)dlIFd#QMm(^w(3xuCt}Cv-$AbH>3L>t81NWV_)xmez1s67o%rN(KG+p`}gh_ z7hc@|=f&@@6~}*D9GxnSPC4(~$%iWZZinwKA35p>NAv9kyI{Wz?kQY(7AOXfl!8Zq z$3UWd_+(M&huuseQ#ms12*c!Lh2K+36y`C^-4DGY;I0v&St)1o^ET$9MP=gFZoz1{OphWtF`xttTG}7WUdqWT-?~6c@NuiRJ6o!1MYI8J8>yRGs z5JI;hr~JCR`LX=5GSIm3SzDgn^f6+4W4+?7!)add zE-82HD)i;eyjZCX@XvseSi4thNCbKHhK^{_Aq~1$dB_(oEkBr!$d?C(Z(RmdL1f;( z8gN6?(`gGnB$erDOjO}1i)3)Bj6XBSoJ diff --git a/.venv/Lib/site-packages/contourpy/__pycache__/convert.cpython-311.pyc b/.venv/Lib/site-packages/contourpy/__pycache__/convert.cpython-311.pyc deleted file mode 100644 index eebe820f33d7f09c6794a1dcbbabe9f12ca56eb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26388 zcmeHwX-phho@Ykh37AYE6U=2NHwosx3>aS=Hf0+h7`yDkh0{c0(*>DSWa4sFC)KW= z>X~%Q-J(V{YI2}vz#3R)!LZ2OW*EFTE*KY0w@r)Y+h+3Hv|zbyh3Do4+oJupebI5-AwADo%)OmQ z?kx+47V~fCFFJ2K$#3g|Yq8*V!D8X@m33vZhIcZ{QEucpsC@^#_BYh(9tP3Wj~gGF-y>z9*xp}DzmATq;}EUcJYfPHy*cIn+#Eb>|) zvdjf%E-yy{+;E76LX`4mA|cKSjYwKK66s~WI?=2&zSvNM8U9QL1M}5?ho?U?M41SA zOoQ(+@{hMj8qOFsOlspOxk+)#qA*`d<%BR_J~Y4+Q|ifx;g|6CQzgcnanca6DL*lG zTKZo?9X?g+!7^`QjSXB+#F0wzJ&Sz5SK1Y$Dh+lKIn=dNm$zaHnpwk&5&le?zENr{ zwc8ps-e;nw`wX^66W1=6CB?0vaUVmz!6H?ylvYJe>YC{0OV%*vE#=!7HIh6_Re9#h zrSI80X1V@RGn8dou|zEy?Z}gJlFA#7njSk?!+l2ngLKwlud4K{En2au;vJIn-g7)? zEp5=#w3gPW6=qMRoYnwzD9Ze$;h9n0dp~4+mI)50>Z~%C;0Ml|BAorbaPu?6eVBW9 zidUFOTAb7xh%)LtKQcZonKb;$@GE1|FcMnkmfmfHyN3ZT(z^8S%bXJn^Wn&BXmRP}d!0~Q@+-Sob^X$mO}HvNEoOn{Ym;ZSup%y zIr!FaXz?DY6zj^`;iCXWT`4TjVdMZhL8ZysFOh- z!4oxK4;v0Ds}1L*G9(ys#VW?!R~>miTsTKHla_I6bjL35Vy|VX?Gj$I-$&S`x0} z)we%((2?7Exb6SlyKpa*Uln1Do!5B#wJ&WsvEJ3Hr~Mzi|Ka;<%#N*;x0UV|xW$6% z_1=xDPx^&|7O|iuX5Doai7xMY@doorso-iBUCl8|%<{az6SF2CmqNlxDDRVqF1#v(7+eQZ zQOdpv>E%%1c&|G<{iQ2ck8uuQRubbZo#e^6dH-3BSk@jd5z6|-vVQsyLP8q2qgVqh zoby5;@k_1>A5>$2nUNN7wQ!frm-wR81g;)mqkO|PV9>9_4-{>s(gmqJeorITXmWGr7|U~4CNXA^I4(r`Cqcn4=-g&wi6cKyc2nNMyB zg>7PCTg(=-Q3h6640o9fY`t&&6!NHlZxWABY`-HMzbPKS$(Oy(J8$v!TRKc_t#8f8 zJ8OA+t%iZ+7RF8`hR$q`ZC&3Q+rGX%#t%*s_Tw%Q-Ax;Pg1bv}cg02t`{|C~*gW(3 zEurF+SaC{bKg(JGB{*tXSaH{tA5unR9q4(F3CB*8bkAH z7@A6kLXk_w){rn0HS|Bg&Ax2yAZqB>W_{^wjWw&-2a2%d_)7z8K{bQ5KC`IV11K7{ z34Jnk5|T^zem4d||_jE>i%N-SpB3;~Gq zE)7B|?%2eKDoz3n3t3m<~ubD8Z;dSkt((kO<6KhH#X$MG<*r zF*8l%m4!>%+?#j!H)q6~ccFEH%P+e8F^fz~dU$6QZ?6LJEs^)evq$35em?IFI5(s8 z3gJJP80Q`4{}?cQVPG707%J6O@3jahkI-KR*I-ucyA0;;gJmM3*gg!Pz5diNVz_f< z8o0%Z38Wv>@Bcq(FYCD9k#Hp3ksKkldjC8O@)zVbr!=eOB4TNT$r776}xKoe`cN&8;5CCt( z>XR9nG`%;!l(hPnmI6VRGvi~Td{$-(2Q&U4D=DLtwUT*kNzG$4?SWFNWs+eWF~Sh( z+-}@|Zqup4jYGn>;4dsfkfzYdv%9l9mb-hjdVOpy`ods!+=RJ^;gid;vDI^^?!BLI zm4D%?-f>m0cMGmY(bdS4^UESHOxuFCM0qt|-bzm;>My#)nvt!W+jBzAlvpz*xNeB9 z8$3DXB{Il68+dzzhQkqdi>u}iu9`tU?+%<>74!-ru9_LLYG%l)nUPja{a&jkrLC)0 z4h|q;AlG2b{w#mrwQ~#C4*Z#P*3Y?V$Z5sAVp*|9%^#eKD03SogFR}IR)tkw9V!`E zS&dP1)T&+w?}2;_+EzA=#-bbF^z?ib(&*@9%8ZwEj)2r6n@)=+RV}*k?Y2nOex~^UO6)9c{J~!F`ss-W(3S!I=59Lo6_zyBF~TW)9tU{bIMhU<nH$Xm&G%6B5a^yYsoJo%EY@Rt z7NPFz8;*(YxtBP1dVjuX* zQ<2CW=?qmDAXy`hg4f~ZFBnOTug~Txcw&q)bfK#!B5Oz);?nQImCyjrM~0~R-~==V zmy)(%DEMB03;9gM29Y#|Levg{;+)s}mTjcvUxHjOKhNLPWo)I$7})Iw26#i=UDj~m4xB}SEmmloz_ z6aLJ-cV!zxvY5W0Qda6YwQ$s9CPY46@kI^$x-pH4C(=*{ZibCJX&4*hnvd}lR>P)zf z{GvvzKCwBqbxEkcCRSe)T-R3f{|M37kMPcR-rg=rfU-M*)Tz9Zw;xt2WpmtxN@4iz zRBE@XR;&VgwlySFT@|aYu7VB7E0MJ;Z^DgGJ0n8qn&DkutSVpC!8<#7d#6;_t{q1g z@90W&9^WkZ+_!mS>&$O&@g3*XZUISId|{L+N}{%DqvMnD7bbY{4@hS~`73FQl4fRR&Bf9>QC&-ipHDkeh3BMJ<)e>w`~v_Sv3TWtQvwwRt>Eldajgz zQ*gD2t`^<}t|PhpA;Hxzy83x?KF=#$?RYxAy297@zc3jGa$@EeRs%SIa`$wHH14GW zP;H2YDkT7gJfZ|#0Wti~^7d5%9!es!o)W-Pk@?4Y;0QN=Fs%}h>`(F};a^e)RDzPC z0zAnB=YdKUUa`V6ONs|T-q}D2=BP!TR#$yclz=D*hdS|1PXk%h2dz;3*L$cBKT-9? zkM`*c;FIzJby5jp3VfqIYK!H8cxe34t`dMP2>eMGfTI=`02t{{)UDKtmQKZYI>?5EaD|NYaG@kx6i^`%E_ZOje)h(r_nyK`j1!Ij}zt)+;{nI0R zk3zPb4mwk{z4Y`32+(OWH);oE$Psm9C_{>JA}Km9O*$~lq~^blvZtsSQu=l5Irz&_ z%@f*tKT`ExbG9~T_FgpS!2R6y&)d)0YNnZss#OK*&7W#|*&fXS^(Hr(n=w9!Kp=Ey-YaC1gI#5awJGm>7wu1{e`G>cA=*x{TIkJJOTkqRR+d4g~li) z{7>%fg6%UKCGmoINBrvFb;UiO9ocNys`_n{;2TMgNbiX}{D*&nL+iJ5WtED#b5J-p ziNSRYsxd&NlnS|e(k~Hl52Zw0?gmCriM7Q0Mr7NY_~JYUD9&=XF+eev_9(74MJ|OK zNi=PJwO-{|$mX~37ybdT-@S#?){c1Z#=;AOod~BG3VBUvpIp166;9J^k?GRQ;d1eC zKMX;yaQHRx@N274ZdSsElVrD8v<8a>s_z zR^4z}V~|YiS@A^4{1hA*eQ_`I6~JB88;)?ZXhe_?B&$Sh{wah%Go+&*wU|e>!6T|c zS%NnzE#D}hVAVns2wO}9OOuZ8DX}GH)S>b~m8E-_B8p%E-lmk;YfzW4Vu+;qh@b{W z^?Sk&(`%r$3m>!wif|dttN}WVq~icJP}=p1eV_EU*cyj2}02!`y==DJa4Q|rG0v_8X5qk$_ z7yRMyz}@$ysL~b!gx}t6&B;Oje}=ms9w2x4OUk)19C&*<5S$HoLvvnYUkm#N2y!=7 ztamB2@a}!sBY}lVHE303M0Pz8V3D^`AwnSzsSxD0SKZRGq<{i{*c%8gFM30qQUX>N za+(j`_d;do0bC3%)~f(i?;8}4J*pHg6{xC1dg0^+9kNuP4lARh9yg@}rIEP#AP|&0 z5?cjU;Fei5I7%b##r+^*Z{yv&a%Z*@xHP%~?%sv2@oL{t`SelqJw>!4hJ1Y;s@#E(#SoPbaUsXZ51pu2J&%rANG z1tRYRpu-4?&3iAj9Ay36JoFFv=E=(NBOKiOAhe+Avtcb4nZy z>iG_=L@(!`4+o$bckiYU-*@Hp)!OQXwTaLeKMO4%81QzqcDAQHxmA^7!JHX4h)*+7ZFrD4H92bK`Rx z0m3)$*qV7;^KR~85XT)Sc0HvC&FqYi37$dGGZ-7&b+&BG#TNwUu;?7-?ZXL2$+P2P zdE1Vojd!$3=}t=Ny5n<#XGru6VY;@sbu&+Jj*8Av-aaa&lO$Ow-3TKk9N2^chegjY zChUpNZ9;(;MCS$GenCpux8vyJ9eq;5F*)IhO(=0x^o(M{zD?^Elz2&WUgGVSq=b?P zDJ6VOPI!8&Uhs^Io^eb#2*AUOg7d2Ayvp0JN(qN{97DWgNJ@B7PIz_;s(L~6T)>1w zn{!)G)k)Dg$=fH1iFat@O}=ypP9guKm=8wolSD^OTF8#KmnCTF#jSJFw4RiprO7;H z%N%ZKLy3=WWJ|?W*?w`Q0H zjv9D`)*9TSsk<%Mq$*3Xack>zpHaojT6a^!;!-h_34btI47545U2Eo@`N)Hrpg%~-x`SK7oHz`K z)ruIWh({KsVhSNAW~w*fryhj7Vy`~pegLWZu~Q}?NOP7p?${c6TO)eW@+4D1>yD$9 zceEx*r)||i4+*8`#nST#Cikqq&pYdRd%eb2=yaoZwIR_r2&6f(Imh>m5_Gobu;{5@ zUlu$qqNfGuA#N6G-B=cid&J@%*erzT?VkAk&4+?}OmvUMM(I`|z-seF^=h29Y~sM8 zOkgET^bY|wcW+twzH^yn@$S~&6p0<<+jT<66|v(A-+q-Zx~9&tbH~xiJ3685nBzdA zcOZTvKCa}|7PknVUeVLbyZa8fX{kI5?Z)|{BF;!I2ywo65aMhHV|JQ(IDO571*{IoVlSbUq>!Bvn*$G`bHcgub$geS)xj$GT-4g5BtG1?Zp|%RSSNDoe zZS|OimP9wJb5Y2(Iara6T<_JdK;vMM>BS-o1|jkvA=Ago)6k6cNH{f$FB0!Z%WTSagUqp_o5}1aBY_8q+00 z&zkgcOOvdSLFivXYsM++hzUKY9K4ko^s@`v%{2lP`K*oqdYl$k`9+ z(44scbGzW_7d`#Fdw?%GA?2|rI)LmgLB=J?j4IxfL40ts6XMeiVRp$-1t(WX%$)I| zf%^=75_8+{XGF>X*`E(OzI!HdE_~GQu`|8D)zCcziDx;>>r*4$C zS5|>1Tk$)CkyKfxQ4@I4!3&q}fm6$ek~e!Ep#F+X1-+&m+K&-{$MFXm2@<9_JtPuF z$Q)||kgYL8f`(5eM6Ei$U#0d+9+{t;(3(ptBp`1ZXf~rfo0>rBf{Yb&s#JEEcil5*0^q@CG~idV zr%8v%TGNQE%KeKZ5p1yE$|UFcL1po=HG?blrjG4)+sC`W|-V|A0W!7M|I~!@gf17n@J>C1-dWo)leK z>0Pf|djlQVog{d2389r~zH6qSB^_9~TVDBB1M7ibKm41JP~Iz+_r~8A%llXDyWkdn z^wH4AL+c$oMYViUZNgpsi+i6u*mxL!w8d;0w~U`hh58Y(enfDOtWK;>Ja<=r;r8vg zeH-oN6sm8A-LDV8=UmzjF6YvA@Hm&Y#{mE5S@nNxUu)r=jl8{4%2DR` zunQ??SMDX7V}igvCm5xl&}Ursg{x}ERkdC#xEe%P15Zu~tElch4OUS}ibzy6Q=Jp4 zFN)O{1=l6fb%`e@#EGr&_KH1a2(mRVn+!qCkSY}hIRTL({zj& z%8`l5%DVk9OAc9Nor7&ZOp_LLB@smm+Cvi2N-HzaAGUq_!}g8)BTEjd{!pYOkOVZg zzzj*?D#$}92_RfZI_MTk9ZA6a-B`-FJ^26NzBHV!Ry_&e?|`0je+rGFEDoi5%IEU4 z^Etw}2pEefj$@eS90m;-5Z?9#?})l+Pw_AA$M`g5!Xjp^^Z4v31UjGZX*giRxQ`(H z-y(b3Jpg-x?VqD--+y5+J1zs^#ZcM)DI@Kv@4bWi9e{ zR8pURp6#fVFEy)-b}2Pi;dCliCHI(>uqq6d9@~#qX*SGCTcj!3QP4c@(-2IweYinZpGZLk|PwsfM8vUYhO` zO7T);qxi*C{E&jQdygAkBimEKXR^G*KDcOWAp=kysKGB zz2`?CD%RdoeP2oDuqCBXWwMz~?k$_66*v2}?pfi?&1|rr?aPB!SWcbVibi&$Rje)Y z&SSj&m_|EA>-t`bVKN`B4=K>v%Y0N4iHCF#czW;)pg%w2(E<1KtA+i7+fOYpN z3gzSg>~5OJM-MRx!i6G$fH0ycITAxVD0Wvd_3G5%Uy!qgh)*67edKJUIrV-I-0C@4 z64XCKaD*w`D&PVTu<9jNJ{jr=Aie!jtMW>eQFUt6D$P$Hvb;F} zS%|323RRUO-TfAzs;LSfR8`LT)rtxM3D&6}4@4sUEQU*c70>brGP_Pt% zy(dDH*yf8ll;AluJEd7KkRTF-DE9#Fl111?4U~?cVTdn0S)%h=@l{I*(X=QT{Y^~e z5<)avJlgNXYC+5;$?|M5q34MZMr|o3YD@V!HVA=1YN#iE{h2^L7jTHUe+?1-FUoFr zA$V-~$M(IDp3YUv>idGZUNqP9=6VU~*|cM8;%!Y5oUwn`efU|CSlS-16Wqr|_i^~P zqO*BpG=4&Go)(>_dHZPz2HC#jXy+a6Qo122U3WYnxKD`g6POO5H1Vk591)!(ynRGU zCkaVXy0eUwuz#~haGw#~XE0%Rd}JOz6nh{ExJ!*!mjw}CN%N9=seHc&+i4;^jYb4Lnn?8dKxKA zxd88Q|Azd&YoGUn`@A3C=lyH@yuXv}z4Y~MtScA5U`~li?$TSbgsr zFx){)$@|Cqy#JGZ-v4x;_kW)4y<~O7x^QH<{3|6Uxl7fwE}1hkGq()?Diz zyEJB&Bl8Os)Q)ruzLO$n*NR&h$bY?{aCf9==^5keF!eH`s0K|?k`f|E0q+A?@L3GT zF_^}H#Q;Izl;r&o?|y>8M;M^KM+gU1tB>H%3J6}>Pb`Mm<%PgW?o;>)1jP{k-w=Y| zi(wLmYF>RlH`Mcb=W|0LFQ3m1UA*3zFjVsDGhrCu_0EK$pVvDRhIU@>d~R}qGnZ*d z5E=($PB~v#tC*n|26b?rsl$ir;0lw=;0G)-!iqu$H@{|tP5qdOI(WpKX7Fi7IA-i) xPQ5Uwg9vjJBddcErUDBPdb1jMxQ{{S9*Z=nDH diff --git a/.venv/Lib/site-packages/contourpy/__pycache__/dechunk.cpython-311.pyc b/.venv/Lib/site-packages/contourpy/__pycache__/dechunk.cpython-311.pyc deleted file mode 100644 index 5bb086d3274b9ed3a29bf73ba500a55adc98cee4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6352 zcmd^DT}&Iv9pCjQ1`Kv=6G(EfBs~(h7xR$|0TRAqAmNhZnnK#fvT8QoHTbZ1x!E;$ zR3^<;d9bRh#6zP-sv_OPsZDh{m4`g|(T{mtqpgHiLPDydDsMnZq+{rgX;`WA}%7jBq8n_i(`{{bq0rZ|eDGgOw2(KN2x zGPbNeX3sie4$`(~oLN`Qm37D5r0vMmWj!%Zwmw#$ZHP5w8)J=x?#y_zO|hnIbF7)P zT^V22AMu+cfXoy`N7eqBkd_x29)qXpST+$w01~N@p^2tINDrcRMZcxE6M3!K5f8Svipu zIbKSLC?SXfueBIdF_n^dd5<14=*wbSs35l=N=|&9mKPHOD}eGwR!XEme?rCv;8q4~ zAT8XRT;!8WWB|`;4SEX?kY+R&X5+axP08ie2zKEYyqrUV=CQ=RX~Jae50hsk8EGy= zh9r%NBh%-E(oRwI>yI3G5@niDNs*`j3axJ~${L-gM>(V z;%Z-W3O#bQrM6lzU30zN4CGxf3!owIJm6cvwDB!{3z~e#^3DC$zEwx!h&eNSbLSz! z%0D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 b!q`rZvf+wK_3|dOt(?j`g7rBHit_&kd4o?~ diff --git a/.venv/Lib/site-packages/contourpy/__pycache__/types.cpython-311.pyc b/.venv/Lib/site-packages/contourpy/__pycache__/types.cpython-311.pyc deleted file mode 100644 index 842501ac0bede9d7aee875a0d9df6b7f4ae8dabc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 527 zcmY*VK}+N?6i(Wi>a;T}yNKsuZywy8aTgI;L{>$GaVm_uyCqQSB$aBLlqOMoE1o?H z{sh^7<8jDI@E~&&ym>NV9bsP{FW>jQN8Zc3ZM9sWZSCDi z7^WbD0fYuysTJ77KB-O0gSuwUJDbvM`kghf9k{p_c(@)ku{8km&e$a9q4FY1nTSNf zDDRK;5MXRNkA0JFDK`vbDP%#yu&}kH>QrWVsVthSsW@ekSo*HKoF!C*Sd=+Yb*b^P za)%6)H_0*5w?)-tam>l2(Ao75H}`$z^mh8@ZmjqG!RDUd`|}q(>sH|9a(x9Ia8htY z3QV$gCV6y(`s6|kQzkLmV5c%8R1h=}5+^c48{0pBq5Z{9r-QoP_JGCWJSqt4blY18 zJ4l#Bcq|iiM(7#pB}a%Sf-L0G@H9Fm91R&2Ocr_h)qI72$;+4N9~r|kC9B1p9?9&7 zo7Fto5W*4oeD}ZKgHLx8e{#Ug$E%ad8?|Pxepl{Dv$ASx+4U-C)NplZeyAGe6tnux ESG!b~mH+?% diff --git a/.venv/Lib/site-packages/contourpy/_contourpy.cp311-win_amd64.lib b/.venv/Lib/site-packages/contourpy/_contourpy.cp311-win_amd64.lib deleted file mode 100644 index 53888a3de122adef6346b90443a56cde6f1068d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2068 zcmc&#y>HV%6#vBuEm#Oep=*(mih!Z{a6U=}LM{|3QPVVX-Ps8-&di4h@IRNmQlu0xYFmQXqA?%sR%?&JOZd(YSJ)jN&-`*KPdZ>yPc zU1(`8WbUY3s>uK@0Fn;Gj(~*(uz0|_X_mIDJGx-r#^}U%{2Mf;#S;dl)L+4$^|iA;8*1|OkCAlx7UYzm z2!?I2-to!xL z8b}zvw?BP$BVch%W}W3N`D1`}J}iuN?|ctWV5~bYHqFC_WqQ`sVjDVtvuZAYWE3CY z{QmiaZt&PK8Oa&>n-}1*{2vL0&l)t5zd5nQ{Jsk%;CCK~&x3ZF-V~}fi*h(;{q%{f cus<=Y0oLHd+ppg;E*7y#f1;`XV6TGz0eqjOod5s; diff --git a/.venv/Lib/site-packages/contourpy/_contourpy.cp311-win_amd64.pyd b/.venv/Lib/site-packages/contourpy/_contourpy.cp311-win_amd64.pyd deleted file mode 100644 index 84e8c9d24f1bd55aba3db4d0393555c8438f3c72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395776 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

    jllU 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 bool: ... - def __getstate__(self) -> int: ... - def __hash__(self) -> int: ... - def __index__(self) -> int: ... - def __init__(self, value: int) -> None: ... - def __int__(self) -> int: ... - def __ne__(self, other: object) -> bool: ... - def __setstate__(self, state: int) -> NoReturn: ... - @property - def name(self) -> str: ... - @property - def value(self) -> int: ... - -class LineType: - ChunkCombinedCode: ClassVar[cpy.LineType] - ChunkCombinedNan: ClassVar[cpy.LineType] - ChunkCombinedOffset: ClassVar[cpy.LineType] - Separate: ClassVar[cpy.LineType] - SeparateCode: ClassVar[cpy.LineType] - __members__: ClassVar[dict[str, cpy.LineType]] - def __eq__(self, other: object) -> bool: ... - def __getstate__(self) -> int: ... - def __hash__(self) -> int: ... - def __index__(self) -> int: ... - def __init__(self, value: int) -> None: ... - def __int__(self) -> int: ... - def __ne__(self, other: object) -> bool: ... - def __setstate__(self, state: int) -> NoReturn: ... - @property - def name(self) -> str: ... - @property - def value(self) -> int: ... - -class ZInterp: - Linear: ClassVar[cpy.ZInterp] - Log: ClassVar[cpy.ZInterp] - __members__: ClassVar[dict[str, cpy.ZInterp]] - def __eq__(self, other: object) -> bool: ... - def __getstate__(self) -> int: ... - def __hash__(self) -> int: ... - def __index__(self) -> int: ... - def __init__(self, value: int) -> None: ... - def __int__(self) -> int: ... - def __ne__(self, other: object) -> bool: ... - def __setstate__(self, state: int) -> NoReturn: ... - @property - def name(self) -> str: ... - @property - def value(self) -> int: ... - -def max_threads() -> int: ... - -class ContourGenerator: - def create_contour(self, level: float) -> LineReturn: ... - def create_filled_contour(self, lower_level: float, upper_level: float) -> FillReturn: ... - def filled(self, lower_level: float, upper_level: float) -> FillReturn: ... - def lines(self, level: float) -> LineReturn: ... - @staticmethod - def supports_corner_mask() -> bool: ... - @staticmethod - def supports_fill_type(fill_type: FillType) -> bool: ... - @staticmethod - def supports_line_type(line_type: LineType) -> bool: ... - @staticmethod - def supports_quad_as_tri() -> bool: ... - @staticmethod - def supports_threads() -> bool: ... - @staticmethod - def supports_z_interp() -> bool: ... - @property - def chunk_count(self) -> tuple[int, int]: ... - @property - def chunk_size(self) -> tuple[int, int]: ... - @property - def corner_mask(self) -> bool: ... - @property - def fill_type(self) -> FillType: ... - @property - def line_type(self) -> LineType: ... - @property - def quad_as_tri(self) -> bool: ... - @property - def thread_count(self) -> int: ... - @property - def z_interp(self) -> ZInterp: ... - default_fill_type: cpy.FillType - default_line_type: cpy.LineType - -class Mpl2005ContourGenerator(ContourGenerator): - def __init__( - self, - x: CoordinateArray, - y: CoordinateArray, - z: CoordinateArray, - mask: MaskArray, - *, - x_chunk_size: int = 0, - y_chunk_size: int = 0, - ) -> None: ... - -class Mpl2014ContourGenerator(ContourGenerator): - def __init__( - self, - x: CoordinateArray, - y: CoordinateArray, - z: CoordinateArray, - mask: MaskArray, - *, - corner_mask: bool, - x_chunk_size: int = 0, - y_chunk_size: int = 0, - ) -> None: ... - -class SerialContourGenerator(ContourGenerator): - def __init__( - self, - x: CoordinateArray, - y: CoordinateArray, - z: CoordinateArray, - mask: MaskArray, - *, - corner_mask: bool, - line_type: LineType, - fill_type: FillType, - quad_as_tri: bool, - z_interp: ZInterp, - x_chunk_size: int = 0, - y_chunk_size: int = 0, - ) -> None: ... - def _write_cache(self) -> NoReturn: ... - -class ThreadedContourGenerator(ContourGenerator): - def __init__( - self, - x: CoordinateArray, - y: CoordinateArray, - z: CoordinateArray, - mask: MaskArray, - *, - corner_mask: bool, - line_type: LineType, - fill_type: FillType, - quad_as_tri: bool, - z_interp: ZInterp, - x_chunk_size: int = 0, - y_chunk_size: int = 0, - thread_count: int = 0, - ) -> None: ... - def _write_cache(self) -> None: ... diff --git a/.venv/Lib/site-packages/contourpy/_version.py b/.venv/Lib/site-packages/contourpy/_version.py deleted file mode 100644 index a955fda..0000000 --- a/.venv/Lib/site-packages/contourpy/_version.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "1.2.1" diff --git a/.venv/Lib/site-packages/contourpy/array.py b/.venv/Lib/site-packages/contourpy/array.py deleted file mode 100644 index fbc53d6..0000000 --- a/.venv/Lib/site-packages/contourpy/array.py +++ /dev/null @@ -1,261 +0,0 @@ -from __future__ import annotations - -from itertools import chain -from typing import TYPE_CHECKING - -import numpy as np - -from contourpy.typecheck import check_code_array, check_offset_array, check_point_array -from contourpy.types import CLOSEPOLY, LINETO, MOVETO, code_dtype, offset_dtype, point_dtype - -if TYPE_CHECKING: - import contourpy._contourpy as cpy - - -def codes_from_offsets(offsets: cpy.OffsetArray) -> cpy.CodeArray: - """Determine codes from offsets, assuming they all correspond to closed polygons. - """ - check_offset_array(offsets) - - n = offsets[-1] - codes = np.full(n, LINETO, dtype=code_dtype) - codes[offsets[:-1]] = MOVETO - codes[offsets[1:] - 1] = CLOSEPOLY - return codes - - -def codes_from_offsets_and_points( - offsets: cpy.OffsetArray, - points: cpy.PointArray, -) -> cpy.CodeArray: - """Determine codes from offsets and points, using the equality of the start and end points of - each line to determine if lines are closed or not. - """ - check_offset_array(offsets) - check_point_array(points) - - codes = np.full(len(points), LINETO, dtype=code_dtype) - codes[offsets[:-1]] = MOVETO - - end_offsets = offsets[1:] - 1 - closed = np.all(points[offsets[:-1]] == points[end_offsets], axis=1) - codes[end_offsets[closed]] = CLOSEPOLY - - return codes - - -def codes_from_points(points: cpy.PointArray) -> cpy.CodeArray: - """Determine codes for a single line, using the equality of the start and end points to - determine if the line is closed or not. - """ - check_point_array(points) - - n = len(points) - codes = np.full(n, LINETO, dtype=code_dtype) - codes[0] = MOVETO - if np.all(points[0] == points[-1]): - codes[-1] = CLOSEPOLY - return codes - - -def concat_codes(list_of_codes: list[cpy.CodeArray]) -> cpy.CodeArray: - """Concatenate a list of codes arrays into a single code array. - """ - if not list_of_codes: - raise ValueError("Empty list passed to concat_codes") - - return np.concatenate(list_of_codes, dtype=code_dtype) - - -def concat_codes_or_none(list_of_codes_or_none: list[cpy.CodeArray | None]) -> cpy.CodeArray | None: - """Concatenate a list of codes arrays or None into a single code array or None. - """ - list_of_codes = [codes for codes in list_of_codes_or_none if codes is not None] - if list_of_codes: - return concat_codes(list_of_codes) - else: - return None - - -def concat_offsets(list_of_offsets: list[cpy.OffsetArray]) -> cpy.OffsetArray: - """Concatenate a list of offsets arrays into a single offset array. - """ - if not list_of_offsets: - raise ValueError("Empty list passed to concat_offsets") - - n = len(list_of_offsets) - cumulative = np.cumsum([offsets[-1] for offsets in list_of_offsets], dtype=offset_dtype) - ret: cpy.OffsetArray = np.concatenate( - (list_of_offsets[0], *(list_of_offsets[i+1][1:] + cumulative[i] for i in range(n-1))), - dtype=offset_dtype, - ) - return ret - - -def concat_offsets_or_none( - list_of_offsets_or_none: list[cpy.OffsetArray | None], -) -> cpy.OffsetArray | None: - """Concatenate a list of offsets arrays or None into a single offset array or None. - """ - list_of_offsets = [offsets for offsets in list_of_offsets_or_none if offsets is not None] - if list_of_offsets: - return concat_offsets(list_of_offsets) - else: - return None - - -def concat_points(list_of_points: list[cpy.PointArray]) -> cpy.PointArray: - """Concatenate a list of point arrays into a single point array. - """ - if not list_of_points: - raise ValueError("Empty list passed to concat_points") - - return np.concatenate(list_of_points, dtype=point_dtype) - - -def concat_points_or_none( - list_of_points_or_none: list[cpy.PointArray | None], -) -> cpy.PointArray | None: - """Concatenate a list of point arrays or None into a single point array or None. - """ - list_of_points = [points for points in list_of_points_or_none if points is not None] - if list_of_points: - return concat_points(list_of_points) - else: - return None - - -def concat_points_or_none_with_nan( - list_of_points_or_none: list[cpy.PointArray | None], -) -> cpy.PointArray | None: - """Concatenate a list of points or None into a single point array or None, with NaNs used to - separate each line. - """ - list_of_points = [points for points in list_of_points_or_none if points is not None] - if list_of_points: - return concat_points_with_nan(list_of_points) - else: - return None - - -def concat_points_with_nan(list_of_points: list[cpy.PointArray]) -> cpy.PointArray: - """Concatenate a list of points into a single point array with NaNs used to separate each line. - """ - if not list_of_points: - raise ValueError("Empty list passed to concat_points_with_nan") - - if len(list_of_points) == 1: - return list_of_points[0] - else: - nan_spacer = np.full((1, 2), np.nan, dtype=point_dtype) - list_of_points = [list_of_points[0], - *list(chain(*((nan_spacer, x) for x in list_of_points[1:])))] - return concat_points(list_of_points) - - -def insert_nan_at_offsets(points: cpy.PointArray, offsets: cpy.OffsetArray) -> cpy.PointArray: - """Insert NaNs into a point array at locations specified by an offset array. - """ - check_point_array(points) - check_offset_array(offsets) - - if len(offsets) <= 2: - return points - else: - nan_spacer = np.array([np.nan, np.nan], dtype=point_dtype) - # Convert offsets to int64 to avoid numpy error when mixing signed and unsigned ints. - return np.insert(points, offsets[1:-1].astype(np.int64), nan_spacer, axis=0) - - -def offsets_from_codes(codes: cpy.CodeArray) -> cpy.OffsetArray: - """Determine offsets from codes using locations of MOVETO codes. - """ - check_code_array(codes) - - return np.append(np.nonzero(codes == MOVETO)[0], len(codes)).astype(offset_dtype) - - -def offsets_from_lengths(list_of_points: list[cpy.PointArray]) -> cpy.OffsetArray: - """Determine offsets from lengths of point arrays. - """ - if not list_of_points: - raise ValueError("Empty list passed to offsets_from_lengths") - - return np.cumsum([0] + [len(line) for line in list_of_points], dtype=offset_dtype) - - -def outer_offsets_from_list_of_codes(list_of_codes: list[cpy.CodeArray]) -> cpy.OffsetArray: - """Determine outer offsets from codes using locations of MOVETO codes. - """ - if not list_of_codes: - raise ValueError("Empty list passed to outer_offsets_from_list_of_codes") - - return np.cumsum([0] + [np.count_nonzero(codes == MOVETO) for codes in list_of_codes], - dtype=offset_dtype) - - -def outer_offsets_from_list_of_offsets(list_of_offsets: list[cpy.OffsetArray]) -> cpy.OffsetArray: - """Determine outer offsets from a list of offsets. - """ - if not list_of_offsets: - raise ValueError("Empty list passed to outer_offsets_from_list_of_offsets") - - return np.cumsum([0] + [len(offsets)-1 for offsets in list_of_offsets], dtype=offset_dtype) - - -def remove_nan(points: cpy.PointArray) -> tuple[cpy.PointArray, cpy.OffsetArray]: - """Remove NaN from a points array, also return the offsets corresponding to the NaN removed. - """ - check_point_array(points) - - nan_offsets = np.nonzero(np.isnan(points[:, 0]))[0] - if len(nan_offsets) == 0: - return points, np.array([0, len(points)], dtype=offset_dtype) - else: - points = np.delete(points, nan_offsets, axis=0) - nan_offsets -= np.arange(len(nan_offsets)) - offsets: cpy.OffsetArray = np.empty(len(nan_offsets)+2, dtype=offset_dtype) - offsets[0] = 0 - offsets[1:-1] = nan_offsets - offsets[-1] = len(points) - return points, offsets - - -def split_codes_by_offsets(codes: cpy.CodeArray, offsets: cpy.OffsetArray) -> list[cpy.CodeArray]: - """Split a code array at locations specified by an offset array into a list of code arrays. - """ - check_code_array(codes) - check_offset_array(offsets) - - if len(offsets) > 2: - return np.split(codes, offsets[1:-1]) - else: - return [codes] - - -def split_points_by_offsets( - points: cpy.PointArray, - offsets: cpy.OffsetArray, -) -> list[cpy.PointArray]: - """Split a point array at locations specified by an offset array into a list of point arrays. - """ - check_point_array(points) - check_offset_array(offsets) - - if len(offsets) > 2: - return np.split(points, offsets[1:-1]) - else: - return [points] - - -def split_points_at_nan(points: cpy.PointArray) -> list[cpy.PointArray]: - """Split a points array at NaNs into a list of point arrays. - """ - check_point_array(points) - - nan_offsets = np.nonzero(np.isnan(points[:, 0]))[0] - if len(nan_offsets) == 0: - return [points] - else: - nan_offsets = np.concatenate(([-1], nan_offsets, [len(points)])) # type: ignore[arg-type] - return [points[s+1:e] for s, e in zip(nan_offsets[:-1], nan_offsets[1:])] diff --git a/.venv/Lib/site-packages/contourpy/chunk.py b/.venv/Lib/site-packages/contourpy/chunk.py deleted file mode 100644 index 94fded1..0000000 --- a/.venv/Lib/site-packages/contourpy/chunk.py +++ /dev/null @@ -1,95 +0,0 @@ -from __future__ import annotations - -import math - - -def calc_chunk_sizes( - chunk_size: int | tuple[int, int] | None, - chunk_count: int | tuple[int, int] | None, - total_chunk_count: int | None, - ny: int, - nx: int, -) -> tuple[int, int]: - """Calculate chunk sizes. - - Args: - chunk_size (int or tuple(int, int), optional): Chunk size in (y, x) directions, or the same - size in both directions if only one is specified. Cannot be negative. - chunk_count (int or tuple(int, int), optional): Chunk count in (y, x) directions, or the - same count in both directions if only one is specified. If less than 1, set to 1. - total_chunk_count (int, optional): Total number of chunks. If less than 1, set to 1. - ny (int): Number of grid points in y-direction. - nx (int): Number of grid points in x-direction. - - Return: - tuple(int, int): Chunk sizes (y_chunk_size, x_chunk_size). - - Note: - Zero or one of ``chunk_size``, ``chunk_count`` and ``total_chunk_count`` should be - specified. - """ - if sum([chunk_size is not None, chunk_count is not None, total_chunk_count is not None]) > 1: - raise ValueError("Only one of chunk_size, chunk_count and total_chunk_count should be set") - - if nx < 2 or ny < 2: - raise ValueError(f"(ny, nx) must be at least (2, 2), not ({ny}, {nx})") - - if total_chunk_count is not None: - max_chunk_count = (nx-1)*(ny-1) - total_chunk_count = min(max(total_chunk_count, 1), max_chunk_count) - if total_chunk_count == 1: - chunk_size = 0 - elif total_chunk_count == max_chunk_count: - chunk_size = (1, 1) - else: - factors = two_factors(total_chunk_count) - if ny > nx: - chunk_count = factors - else: - chunk_count = (factors[1], factors[0]) - - if chunk_count is not None: - if isinstance(chunk_count, tuple): - y_chunk_count, x_chunk_count = chunk_count - else: - y_chunk_count = x_chunk_count = chunk_count - x_chunk_count = min(max(x_chunk_count, 1), nx-1) - y_chunk_count = min(max(y_chunk_count, 1), ny-1) - chunk_size = (math.ceil((ny-1) / y_chunk_count), math.ceil((nx-1) / x_chunk_count)) - - if chunk_size is None: - y_chunk_size = x_chunk_size = 0 - elif isinstance(chunk_size, tuple): - y_chunk_size, x_chunk_size = chunk_size - else: - y_chunk_size = x_chunk_size = chunk_size - - if x_chunk_size < 0 or y_chunk_size < 0: - raise ValueError("chunk_size cannot be negative") - - return y_chunk_size, x_chunk_size - - -def two_factors(n: int) -> tuple[int, int]: - """Split an integer into two integer factors. - - The two factors will be as close as possible to the sqrt of n, and are returned in decreasing - order. Worst case returns (n, 1). - - Args: - n (int): The integer to factorize, must be positive. - - Return: - tuple(int, int): The two factors of n, in decreasing order. - """ - if n < 0: - raise ValueError(f"two_factors expects positive integer not {n}") - - i = math.ceil(math.sqrt(n)) - while n % i != 0: - i -= 1 - j = n // i - if i > j: - return i, j - else: - return j, i diff --git a/.venv/Lib/site-packages/contourpy/convert.py b/.venv/Lib/site-packages/contourpy/convert.py deleted file mode 100644 index 75a54b0..0000000 --- a/.venv/Lib/site-packages/contourpy/convert.py +++ /dev/null @@ -1,555 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, cast - -import numpy as np - -from contourpy._contourpy import FillType, LineType -import contourpy.array as arr -from contourpy.enum_util import as_fill_type, as_line_type -from contourpy.typecheck import check_filled, check_lines -from contourpy.types import MOVETO, offset_dtype - -if TYPE_CHECKING: - import contourpy._contourpy as cpy - - -def _convert_filled_from_OuterCode( - filled: cpy.FillReturn_OuterCode, - fill_type_to: FillType, -) -> cpy.FillReturn: - if fill_type_to == FillType.OuterCode: - return filled - elif fill_type_to == FillType.OuterOffset: - return (filled[0], [arr.offsets_from_codes(codes) for codes in filled[1]]) - - if len(filled[0]) > 0: - points = arr.concat_points(filled[0]) - codes = arr.concat_codes(filled[1]) - else: - points = None - codes = None - - if fill_type_to == FillType.ChunkCombinedCode: - return ([points], [codes]) - elif fill_type_to == FillType.ChunkCombinedOffset: - return ([points], [None if codes is None else arr.offsets_from_codes(codes)]) - elif fill_type_to == FillType.ChunkCombinedCodeOffset: - outer_offsets = None if points is None else arr.offsets_from_lengths(filled[0]) - ret1: cpy.FillReturn_ChunkCombinedCodeOffset = ([points], [codes], [outer_offsets]) - return ret1 - elif fill_type_to == FillType.ChunkCombinedOffsetOffset: - if codes is None: - ret2: cpy.FillReturn_ChunkCombinedOffsetOffset = ([None], [None], [None]) - else: - offsets = arr.offsets_from_codes(codes) - outer_offsets = arr.outer_offsets_from_list_of_codes(filled[1]) - ret2 = ([points], [offsets], [outer_offsets]) - return ret2 - else: - raise ValueError(f"Invalid FillType {fill_type_to}") - - -def _convert_filled_from_OuterOffset( - filled: cpy.FillReturn_OuterOffset, - fill_type_to: FillType, -) -> cpy.FillReturn: - if fill_type_to == FillType.OuterCode: - separate_codes = [arr.codes_from_offsets(offsets) for offsets in filled[1]] - return (filled[0], separate_codes) - elif fill_type_to == FillType.OuterOffset: - return filled - - if len(filled[0]) > 0: - points = arr.concat_points(filled[0]) - offsets = arr.concat_offsets(filled[1]) - else: - points = None - offsets = None - - if fill_type_to == FillType.ChunkCombinedCode: - return ([points], [None if offsets is None else arr.codes_from_offsets(offsets)]) - elif fill_type_to == FillType.ChunkCombinedOffset: - return ([points], [offsets]) - elif fill_type_to == FillType.ChunkCombinedCodeOffset: - if offsets is None: - ret1: cpy.FillReturn_ChunkCombinedCodeOffset = ([None], [None], [None]) - else: - codes = arr.codes_from_offsets(offsets) - outer_offsets = arr.offsets_from_lengths(filled[0]) - ret1 = ([points], [codes], [outer_offsets]) - return ret1 - elif fill_type_to == FillType.ChunkCombinedOffsetOffset: - if points is None: - ret2: cpy.FillReturn_ChunkCombinedOffsetOffset = ([None], [None], [None]) - else: - outer_offsets = arr.outer_offsets_from_list_of_offsets(filled[1]) - ret2 = ([points], [offsets], [outer_offsets]) - return ret2 - else: - raise ValueError(f"Invalid FillType {fill_type_to}") - - -def _convert_filled_from_ChunkCombinedCode( - filled: cpy.FillReturn_ChunkCombinedCode, - fill_type_to: FillType, -) -> cpy.FillReturn: - if fill_type_to == FillType.ChunkCombinedCode: - return filled - elif fill_type_to == FillType.ChunkCombinedOffset: - codes = [None if codes is None else arr.offsets_from_codes(codes) for codes in filled[1]] - return (filled[0], codes) - else: - raise ValueError( - f"Conversion from {FillType.ChunkCombinedCode} to {fill_type_to} not supported") - - -def _convert_filled_from_ChunkCombinedOffset( - filled: cpy.FillReturn_ChunkCombinedOffset, - fill_type_to: FillType, -) -> cpy.FillReturn: - if fill_type_to == FillType.ChunkCombinedCode: - chunk_codes: list[cpy.CodeArray | None] = [] - for points, offsets in zip(*filled): - if points is None: - chunk_codes.append(None) - else: - if TYPE_CHECKING: - assert offsets is not None - chunk_codes.append(arr.codes_from_offsets_and_points(offsets, points)) - return (filled[0], chunk_codes) - elif fill_type_to == FillType.ChunkCombinedOffset: - return filled - else: - raise ValueError( - f"Conversion from {FillType.ChunkCombinedOffset} to {fill_type_to} not supported") - - -def _convert_filled_from_ChunkCombinedCodeOffset( - filled: cpy.FillReturn_ChunkCombinedCodeOffset, - fill_type_to: FillType, -) -> cpy.FillReturn: - if fill_type_to == FillType.OuterCode: - separate_points = [] - separate_codes = [] - for points, codes, outer_offsets in zip(*filled): - if points is not None: - if TYPE_CHECKING: - assert codes is not None - assert outer_offsets is not None - separate_points += arr.split_points_by_offsets(points, outer_offsets) - separate_codes += arr.split_codes_by_offsets(codes, outer_offsets) - return (separate_points, separate_codes) - elif fill_type_to == FillType.OuterOffset: - separate_points = [] - separate_offsets = [] - for points, codes, outer_offsets in zip(*filled): - if points is not None: - if TYPE_CHECKING: - assert codes is not None - assert outer_offsets is not None - separate_points += arr.split_points_by_offsets(points, outer_offsets) - separate_codes = arr.split_codes_by_offsets(codes, outer_offsets) - separate_offsets += [arr.offsets_from_codes(codes) for codes in separate_codes] - return (separate_points, separate_offsets) - elif fill_type_to == FillType.ChunkCombinedCode: - ret1: cpy.FillReturn_ChunkCombinedCode = (filled[0], filled[1]) - return ret1 - elif fill_type_to == FillType.ChunkCombinedOffset: - all_offsets = [None if codes is None else arr.offsets_from_codes(codes) - for codes in filled[1]] - ret2: cpy.FillReturn_ChunkCombinedOffset = (filled[0], all_offsets) - return ret2 - elif fill_type_to == FillType.ChunkCombinedCodeOffset: - return filled - elif fill_type_to == FillType.ChunkCombinedOffsetOffset: - chunk_offsets: list[cpy.OffsetArray | None] = [] - chunk_outer_offsets: list[cpy.OffsetArray | None] = [] - for codes, outer_offsets in zip(*filled[1:]): - if codes is None: - chunk_offsets.append(None) - chunk_outer_offsets.append(None) - else: - if TYPE_CHECKING: - assert outer_offsets is not None - offsets = arr.offsets_from_codes(codes) - outer_offsets = np.array([np.nonzero(offsets == oo)[0][0] for oo in outer_offsets], - dtype=offset_dtype) - chunk_offsets.append(offsets) - chunk_outer_offsets.append(outer_offsets) - ret3: cpy.FillReturn_ChunkCombinedOffsetOffset = ( - filled[0], chunk_offsets, chunk_outer_offsets, - ) - return ret3 - else: - raise ValueError(f"Invalid FillType {fill_type_to}") - - -def _convert_filled_from_ChunkCombinedOffsetOffset( - filled: cpy.FillReturn_ChunkCombinedOffsetOffset, - fill_type_to: FillType, -) -> cpy.FillReturn: - if fill_type_to == FillType.OuterCode: - separate_points = [] - separate_codes = [] - for points, offsets, outer_offsets in zip(*filled): - if points is not None: - if TYPE_CHECKING: - assert offsets is not None - assert outer_offsets is not None - codes = arr.codes_from_offsets_and_points(offsets, points) - outer_offsets = offsets[outer_offsets] - separate_points += arr.split_points_by_offsets(points, outer_offsets) - separate_codes += arr.split_codes_by_offsets(codes, outer_offsets) - return (separate_points, separate_codes) - elif fill_type_to == FillType.OuterOffset: - separate_points = [] - separate_offsets = [] - for points, offsets, outer_offsets in zip(*filled): - if points is not None: - if TYPE_CHECKING: - assert offsets is not None - assert outer_offsets is not None - if len(outer_offsets) > 2: - separate_offsets += [offsets[s:e+1] - offsets[s] for s, e in - zip(outer_offsets[:-1], outer_offsets[1:])] - else: - separate_offsets.append(offsets) - separate_points += arr.split_points_by_offsets(points, offsets[outer_offsets]) - return (separate_points, separate_offsets) - elif fill_type_to == FillType.ChunkCombinedCode: - chunk_codes: list[cpy.CodeArray | None] = [] - for points, offsets, outer_offsets in zip(*filled): - if points is None: - chunk_codes.append(None) - else: - if TYPE_CHECKING: - assert offsets is not None - assert outer_offsets is not None - chunk_codes.append(arr.codes_from_offsets_and_points(offsets, points)) - ret1: cpy.FillReturn_ChunkCombinedCode = (filled[0], chunk_codes) - return ret1 - elif fill_type_to == FillType.ChunkCombinedOffset: - return (filled[0], filled[1]) - elif fill_type_to == FillType.ChunkCombinedCodeOffset: - chunk_codes = [] - chunk_outer_offsets: list[cpy.OffsetArray | None] = [] - for points, offsets, outer_offsets in zip(*filled): - if points is None: - chunk_codes.append(None) - chunk_outer_offsets.append(None) - else: - if TYPE_CHECKING: - assert offsets is not None - assert outer_offsets is not None - chunk_codes.append(arr.codes_from_offsets_and_points(offsets, points)) - chunk_outer_offsets.append(offsets[outer_offsets]) - ret2: cpy.FillReturn_ChunkCombinedCodeOffset = (filled[0], chunk_codes, chunk_outer_offsets) - return ret2 - elif fill_type_to == FillType.ChunkCombinedOffsetOffset: - return filled - else: - raise ValueError(f"Invalid FillType {fill_type_to}") - - -def convert_filled( - filled: cpy.FillReturn, - fill_type_from: FillType | str, - fill_type_to: FillType | str, -) -> cpy.FillReturn: - """Return the specified filled contours converted to a different :class:`~contourpy.FillType`. - - Args: - filled (sequence of arrays): Filled contour polygons to convert. - fill_type_from (FillType or str): :class:`~contourpy.FillType` to convert from as enum or - string equivalent. - fill_type_to (FillType or str): :class:`~contourpy.FillType` to convert to as enum or string - equivalent. - - Return: - Converted filled contour polygons. - - When converting non-chunked fill types (``FillType.OuterCode`` or ``FillType.OuterOffset``) to - chunked ones, all polygons are placed in the first chunk. When converting in the other - direction, all chunk information is discarded. Converting a fill type that is not aware of the - relationship between outer boundaries and contained holes (``FillType.ChunkCombinedCode`` or) - ``FillType.ChunkCombinedOffset``) to one that is will raise a ``ValueError``. - - .. versionadded:: 1.2.0 - """ - fill_type_from = as_fill_type(fill_type_from) - fill_type_to = as_fill_type(fill_type_to) - - check_filled(filled, fill_type_from) - - if fill_type_from == FillType.OuterCode: - if TYPE_CHECKING: - filled = cast(cpy.FillReturn_OuterCode, filled) - return _convert_filled_from_OuterCode(filled, fill_type_to) - elif fill_type_from == FillType.OuterOffset: - if TYPE_CHECKING: - filled = cast(cpy.FillReturn_OuterOffset, filled) - return _convert_filled_from_OuterOffset(filled, fill_type_to) - elif fill_type_from == FillType.ChunkCombinedCode: - if TYPE_CHECKING: - filled = cast(cpy.FillReturn_ChunkCombinedCode, filled) - return _convert_filled_from_ChunkCombinedCode(filled, fill_type_to) - elif fill_type_from == FillType.ChunkCombinedOffset: - if TYPE_CHECKING: - filled = cast(cpy.FillReturn_ChunkCombinedOffset, filled) - return _convert_filled_from_ChunkCombinedOffset(filled, fill_type_to) - elif fill_type_from == FillType.ChunkCombinedCodeOffset: - if TYPE_CHECKING: - filled = cast(cpy.FillReturn_ChunkCombinedCodeOffset, filled) - return _convert_filled_from_ChunkCombinedCodeOffset(filled, fill_type_to) - elif fill_type_from == FillType.ChunkCombinedOffsetOffset: - if TYPE_CHECKING: - filled = cast(cpy.FillReturn_ChunkCombinedOffsetOffset, filled) - return _convert_filled_from_ChunkCombinedOffsetOffset(filled, fill_type_to) - else: - raise ValueError(f"Invalid FillType {fill_type_from}") - - -def _convert_lines_from_Separate( - lines: cpy.LineReturn_Separate, - line_type_to: LineType, -) -> cpy.LineReturn: - if line_type_to == LineType.Separate: - return lines - elif line_type_to == LineType.SeparateCode: - separate_codes = [arr.codes_from_points(line) for line in lines] - return (lines, separate_codes) - elif line_type_to == LineType.ChunkCombinedCode: - if not lines: - ret1: cpy.LineReturn_ChunkCombinedCode = ([None], [None]) - else: - points = arr.concat_points(lines) - offsets = arr.offsets_from_lengths(lines) - codes = arr.codes_from_offsets_and_points(offsets, points) - ret1 = ([points], [codes]) - return ret1 - elif line_type_to == LineType.ChunkCombinedOffset: - if not lines: - ret2: cpy.LineReturn_ChunkCombinedOffset = ([None], [None]) - else: - ret2 = ([arr.concat_points(lines)], [arr.offsets_from_lengths(lines)]) - return ret2 - elif line_type_to == LineType.ChunkCombinedNan: - if not lines: - ret3: cpy.LineReturn_ChunkCombinedNan = ([None],) - else: - ret3 = ([arr.concat_points_with_nan(lines)],) - return ret3 - else: - raise ValueError(f"Invalid LineType {line_type_to}") - - -def _convert_lines_from_SeparateCode( - lines: cpy.LineReturn_SeparateCode, - line_type_to: LineType, -) -> cpy.LineReturn: - if line_type_to == LineType.Separate: - # Drop codes. - return lines[0] - elif line_type_to == LineType.SeparateCode: - return lines - elif line_type_to == LineType.ChunkCombinedCode: - if not lines[0]: - ret1: cpy.LineReturn_ChunkCombinedCode = ([None], [None]) - else: - ret1 = ([arr.concat_points(lines[0])], [arr.concat_codes(lines[1])]) - return ret1 - elif line_type_to == LineType.ChunkCombinedOffset: - if not lines[0]: - ret2: cpy.LineReturn_ChunkCombinedOffset = ([None], [None]) - else: - ret2 = ([arr.concat_points(lines[0])], [arr.offsets_from_lengths(lines[0])]) - return ret2 - elif line_type_to == LineType.ChunkCombinedNan: - if not lines[0]: - ret3: cpy.LineReturn_ChunkCombinedNan = ([None],) - else: - ret3 = ([arr.concat_points_with_nan(lines[0])],) - return ret3 - else: - raise ValueError(f"Invalid LineType {line_type_to}") - - -def _convert_lines_from_ChunkCombinedCode( - lines: cpy.LineReturn_ChunkCombinedCode, - line_type_to: LineType, -) -> cpy.LineReturn: - if line_type_to in (LineType.Separate, LineType.SeparateCode): - separate_lines = [] - for points, codes in zip(*lines): - if points is not None: - if TYPE_CHECKING: - assert codes is not None - split_at = np.nonzero(codes == MOVETO)[0] - if len(split_at) > 1: - separate_lines += np.split(points, split_at[1:]) - else: - separate_lines.append(points) - if line_type_to == LineType.Separate: - return separate_lines - else: - separate_codes = [arr.codes_from_points(line) for line in separate_lines] - return (separate_lines, separate_codes) - elif line_type_to == LineType.ChunkCombinedCode: - return lines - elif line_type_to == LineType.ChunkCombinedOffset: - chunk_offsets = [None if codes is None else arr.offsets_from_codes(codes) - for codes in lines[1]] - return (lines[0], chunk_offsets) - elif line_type_to == LineType.ChunkCombinedNan: - points_nan: list[cpy.PointArray | None] = [] - for points, codes in zip(*lines): - if points is None: - points_nan.append(None) - else: - if TYPE_CHECKING: - assert codes is not None - offsets = arr.offsets_from_codes(codes) - points_nan.append(arr.insert_nan_at_offsets(points, offsets)) - return (points_nan,) - else: - raise ValueError(f"Invalid LineType {line_type_to}") - - -def _convert_lines_from_ChunkCombinedOffset( - lines: cpy.LineReturn_ChunkCombinedOffset, - line_type_to: LineType, -) -> cpy.LineReturn: - if line_type_to in (LineType.Separate, LineType.SeparateCode): - separate_lines = [] - for points, offsets in zip(*lines): - if points is not None: - if TYPE_CHECKING: - assert offsets is not None - separate_lines += arr.split_points_by_offsets(points, offsets) - if line_type_to == LineType.Separate: - return separate_lines - else: - separate_codes = [arr.codes_from_points(line) for line in separate_lines] - return (separate_lines, separate_codes) - elif line_type_to == LineType.ChunkCombinedCode: - chunk_codes: list[cpy.CodeArray | None] = [] - for points, offsets in zip(*lines): - if points is None: - chunk_codes.append(None) - else: - if TYPE_CHECKING: - assert offsets is not None - chunk_codes.append(arr.codes_from_offsets_and_points(offsets, points)) - return (lines[0], chunk_codes) - elif line_type_to == LineType.ChunkCombinedOffset: - return lines - elif line_type_to == LineType.ChunkCombinedNan: - points_nan: list[cpy.PointArray | None] = [] - for points, offsets in zip(*lines): - if points is None: - points_nan.append(None) - else: - if TYPE_CHECKING: - assert offsets is not None - points_nan.append(arr.insert_nan_at_offsets(points, offsets)) - return (points_nan,) - else: - raise ValueError(f"Invalid LineType {line_type_to}") - - -def _convert_lines_from_ChunkCombinedNan( - lines: cpy.LineReturn_ChunkCombinedNan, - line_type_to: LineType, -) -> cpy.LineReturn: - if line_type_to in (LineType.Separate, LineType.SeparateCode): - separate_lines = [] - for points in lines[0]: - if points is not None: - separate_lines += arr.split_points_at_nan(points) - if line_type_to == LineType.Separate: - return separate_lines - else: - separate_codes = [arr.codes_from_points(points) for points in separate_lines] - return (separate_lines, separate_codes) - elif line_type_to == LineType.ChunkCombinedCode: - chunk_points: list[cpy.PointArray | None] = [] - chunk_codes: list[cpy.CodeArray | None] = [] - for points in lines[0]: - if points is None: - chunk_points.append(None) - chunk_codes.append(None) - else: - points, offsets = arr.remove_nan(points) - chunk_points.append(points) - chunk_codes.append(arr.codes_from_offsets_and_points(offsets, points)) - return (chunk_points, chunk_codes) - elif line_type_to == LineType.ChunkCombinedOffset: - chunk_points = [] - chunk_offsets: list[cpy.OffsetArray | None] = [] - for points in lines[0]: - if points is None: - chunk_points.append(None) - chunk_offsets.append(None) - else: - points, offsets = arr.remove_nan(points) - chunk_points.append(points) - chunk_offsets.append(offsets) - return (chunk_points, chunk_offsets) - elif line_type_to == LineType.ChunkCombinedNan: - return lines - else: - raise ValueError(f"Invalid LineType {line_type_to}") - - -def convert_lines( - lines: cpy.LineReturn, - line_type_from: LineType | str, - line_type_to: LineType | str, -) -> cpy.LineReturn: - """Return the specified contour lines converted to a different :class:`~contourpy.LineType`. - - Args: - lines (sequence of arrays): Contour lines to convert. - line_type_from (LineType or str): :class:`~contourpy.LineType` to convert from as enum or - string equivalent. - line_type_to (LineType or str): :class:`~contourpy.LineType` to convert to as enum or string - equivalent. - - Return: - Converted contour lines. - - When converting non-chunked line types (``LineType.Separate`` or ``LineType.SeparateCode``) to - chunked ones (``LineType.ChunkCombinedCode``, ``LineType.ChunkCombinedOffset`` or - ``LineType.ChunkCombinedNan``), all lines are placed in the first chunk. When converting in the - other direction, all chunk information is discarded. - - .. versionadded:: 1.2.0 - """ - line_type_from = as_line_type(line_type_from) - line_type_to = as_line_type(line_type_to) - - check_lines(lines, line_type_from) - - if line_type_from == LineType.Separate: - if TYPE_CHECKING: - lines = cast(cpy.LineReturn_Separate, lines) - return _convert_lines_from_Separate(lines, line_type_to) - elif line_type_from == LineType.SeparateCode: - if TYPE_CHECKING: - lines = cast(cpy.LineReturn_SeparateCode, lines) - return _convert_lines_from_SeparateCode(lines, line_type_to) - elif line_type_from == LineType.ChunkCombinedCode: - if TYPE_CHECKING: - lines = cast(cpy.LineReturn_ChunkCombinedCode, lines) - return _convert_lines_from_ChunkCombinedCode(lines, line_type_to) - elif line_type_from == LineType.ChunkCombinedOffset: - if TYPE_CHECKING: - lines = cast(cpy.LineReturn_ChunkCombinedOffset, lines) - return _convert_lines_from_ChunkCombinedOffset(lines, line_type_to) - elif line_type_from == LineType.ChunkCombinedNan: - if TYPE_CHECKING: - lines = cast(cpy.LineReturn_ChunkCombinedNan, lines) - return _convert_lines_from_ChunkCombinedNan(lines, line_type_to) - else: - raise ValueError(f"Invalid LineType {line_type_from}") diff --git a/.venv/Lib/site-packages/contourpy/dechunk.py b/.venv/Lib/site-packages/contourpy/dechunk.py deleted file mode 100644 index 622a1ce..0000000 --- a/.venv/Lib/site-packages/contourpy/dechunk.py +++ /dev/null @@ -1,144 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, cast - -from contourpy._contourpy import FillType, LineType -from contourpy.array import ( - concat_codes_or_none, - concat_offsets_or_none, - concat_points_or_none, - concat_points_or_none_with_nan, -) -from contourpy.enum_util import as_fill_type, as_line_type -from contourpy.typecheck import check_filled, check_lines - -if TYPE_CHECKING: - import contourpy._contourpy as cpy - - -def dechunk_filled(filled: cpy.FillReturn, fill_type: FillType | str) -> cpy.FillReturn: - """Return the specified filled contours with all chunked data moved into the first chunk. - - Filled contours that are not chunked (``FillType.OuterCode`` and ``FillType.OuterOffset``) and - those that are but only contain a single chunk are returned unmodified. Individual polygons are - unchanged, they are not geometrically combined. - - Args: - filled (sequence of arrays): Filled contour data as returned by - :func:`~contourpy.ContourGenerator.filled`. - fill_type (FillType or str): Type of ``filled`` as enum or string equivalent. - - Return: - Filled contours in a single chunk. - - .. versionadded:: 1.2.0 - """ - fill_type = as_fill_type(fill_type) - - if fill_type in (FillType.OuterCode, FillType.OuterOffset): - # No-op if fill_type is not chunked. - return filled - - check_filled(filled, fill_type) - if len(filled[0]) < 2: - # No-op if just one chunk. - return filled - - if TYPE_CHECKING: - filled = cast(cpy.FillReturn_Chunk, filled) - points = concat_points_or_none(filled[0]) - - if fill_type == FillType.ChunkCombinedCode: - if TYPE_CHECKING: - filled = cast(cpy.FillReturn_ChunkCombinedCode, filled) - if points is None: - ret1: cpy.FillReturn_ChunkCombinedCode = ([None], [None]) - else: - ret1 = ([points], [concat_codes_or_none(filled[1])]) - return ret1 - elif fill_type == FillType.ChunkCombinedOffset: - if TYPE_CHECKING: - filled = cast(cpy.FillReturn_ChunkCombinedOffset, filled) - if points is None: - ret2: cpy.FillReturn_ChunkCombinedOffset = ([None], [None]) - else: - ret2 = ([points], [concat_offsets_or_none(filled[1])]) - return ret2 - elif fill_type == FillType.ChunkCombinedCodeOffset: - if TYPE_CHECKING: - filled = cast(cpy.FillReturn_ChunkCombinedCodeOffset, filled) - if points is None: - ret3: cpy.FillReturn_ChunkCombinedCodeOffset = ([None], [None], [None]) - else: - outer_offsets = concat_offsets_or_none(filled[2]) - ret3 = ([points], [concat_codes_or_none(filled[1])], [outer_offsets]) - return ret3 - elif fill_type == FillType.ChunkCombinedOffsetOffset: - if TYPE_CHECKING: - filled = cast(cpy.FillReturn_ChunkCombinedOffsetOffset, filled) - if points is None: - ret4: cpy.FillReturn_ChunkCombinedOffsetOffset = ([None], [None], [None]) - else: - outer_offsets = concat_offsets_or_none(filled[2]) - ret4 = ([points], [concat_offsets_or_none(filled[1])], [outer_offsets]) - return ret4 - else: - raise ValueError(f"Invalid FillType {fill_type}") - - -def dechunk_lines(lines: cpy.LineReturn, line_type: LineType | str) -> cpy.LineReturn: - """Return the specified contour lines with all chunked data moved into the first chunk. - - Contour lines that are not chunked (``LineType.Separate`` and ``LineType.SeparateCode``) and - those that are but only contain a single chunk are returned unmodified. Individual lines are - unchanged, they are not geometrically combined. - - Args: - lines (sequence of arrays): Contour line data as returned by - :func:`~contourpy.ContourGenerator.lines`. - line_type (LineType or str): Type of ``lines`` as enum or string equivalent. - - Return: - Contour lines in a single chunk. - - .. versionadded:: 1.2.0 - """ - line_type = as_line_type(line_type) - if line_type in (LineType.Separate, LineType.SeparateCode): - # No-op if line_type is not chunked. - return lines - - check_lines(lines, line_type) - if len(lines[0]) < 2: - # No-op if just one chunk. - return lines - - if TYPE_CHECKING: - lines = cast(cpy.LineReturn_Chunk, lines) - - if line_type == LineType.ChunkCombinedCode: - if TYPE_CHECKING: - lines = cast(cpy.LineReturn_ChunkCombinedCode, lines) - points = concat_points_or_none(lines[0]) - if points is None: - ret1: cpy.LineReturn_ChunkCombinedCode = ([None], [None]) - else: - ret1 = ([points], [concat_codes_or_none(lines[1])]) - return ret1 - elif line_type == LineType.ChunkCombinedOffset: - if TYPE_CHECKING: - lines = cast(cpy.LineReturn_ChunkCombinedOffset, lines) - points = concat_points_or_none(lines[0]) - if points is None: - ret2: cpy.LineReturn_ChunkCombinedOffset = ([None], [None]) - else: - ret2 = ([points], [concat_offsets_or_none(lines[1])]) - return ret2 - elif line_type == LineType.ChunkCombinedNan: - if TYPE_CHECKING: - lines = cast(cpy.LineReturn_ChunkCombinedNan, lines) - points = concat_points_or_none_with_nan(lines[0]) - ret3: cpy.LineReturn_ChunkCombinedNan = ([points],) - return ret3 - else: - raise ValueError(f"Invalid LineType {line_type}") diff --git a/.venv/Lib/site-packages/contourpy/enum_util.py b/.venv/Lib/site-packages/contourpy/enum_util.py deleted file mode 100644 index 14229ab..0000000 --- a/.venv/Lib/site-packages/contourpy/enum_util.py +++ /dev/null @@ -1,57 +0,0 @@ -from __future__ import annotations - -from contourpy._contourpy import FillType, LineType, ZInterp - - -def as_fill_type(fill_type: FillType | str) -> FillType: - """Coerce a FillType or string value to a FillType. - - Args: - fill_type (FillType or str): Value to convert. - - Return: - FillType: Converted value. - """ - if isinstance(fill_type, str): - try: - return FillType.__members__[fill_type] - except KeyError as e: - raise ValueError(f"'{fill_type}' is not a valid FillType") from e - else: - return fill_type - - -def as_line_type(line_type: LineType | str) -> LineType: - """Coerce a LineType or string value to a LineType. - - Args: - line_type (LineType or str): Value to convert. - - Return: - LineType: Converted value. - """ - if isinstance(line_type, str): - try: - return LineType.__members__[line_type] - except KeyError as e: - raise ValueError(f"'{line_type}' is not a valid LineType") from e - else: - return line_type - - -def as_z_interp(z_interp: ZInterp | str) -> ZInterp: - """Coerce a ZInterp or string value to a ZInterp. - - Args: - z_interp (ZInterp or str): Value to convert. - - Return: - ZInterp: Converted value. - """ - if isinstance(z_interp, str): - try: - return ZInterp.__members__[z_interp] - except KeyError as e: - raise ValueError(f"'{z_interp}' is not a valid ZInterp") from e - else: - return z_interp diff --git a/.venv/Lib/site-packages/contourpy/py.typed b/.venv/Lib/site-packages/contourpy/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/Lib/site-packages/contourpy/typecheck.py b/.venv/Lib/site-packages/contourpy/typecheck.py deleted file mode 100644 index 23fbd54..0000000 --- a/.venv/Lib/site-packages/contourpy/typecheck.py +++ /dev/null @@ -1,203 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, cast - -import numpy as np - -from contourpy import FillType, LineType -from contourpy.enum_util import as_fill_type, as_line_type -from contourpy.types import MOVETO, code_dtype, offset_dtype, point_dtype - -if TYPE_CHECKING: - import contourpy._contourpy as cpy - - -# Minimalist array-checking functions that check dtype, ndims and shape only. -# They do not walk the arrays to check the contents for performance reasons. -def check_code_array(codes: Any) -> None: - if not isinstance(codes, np.ndarray): - raise TypeError(f"Expected numpy array not {type(codes)}") - if codes.dtype != code_dtype: - raise ValueError(f"Expected numpy array of dtype {code_dtype} not {codes.dtype}") - if not (codes.ndim == 1 and len(codes) > 1): - raise ValueError(f"Expected numpy array of shape (?,) not {codes.shape}") - if codes[0] != MOVETO: - raise ValueError(f"First element of code array must be {MOVETO}, not {codes[0]}") - - -def check_offset_array(offsets: Any) -> None: - if not isinstance(offsets, np.ndarray): - raise TypeError(f"Expected numpy array not {type(offsets)}") - if offsets.dtype != offset_dtype: - raise ValueError(f"Expected numpy array of dtype {offset_dtype} not {offsets.dtype}") - if not (offsets.ndim == 1 and len(offsets) > 1): - raise ValueError(f"Expected numpy array of shape (?,) not {offsets.shape}") - if offsets[0] != 0: - raise ValueError(f"First element of offset array must be 0, not {offsets[0]}") - - -def check_point_array(points: Any) -> None: - if not isinstance(points, np.ndarray): - raise TypeError(f"Expected numpy array not {type(points)}") - if points.dtype != point_dtype: - raise ValueError(f"Expected numpy array of dtype {point_dtype} not {points.dtype}") - if not (points.ndim == 2 and points.shape[1] ==2 and points.shape[0] > 1): - raise ValueError(f"Expected numpy array of shape (?, 2) not {points.shape}") - - -def _check_tuple_of_lists_with_same_length( - maybe_tuple: Any, - tuple_length: int, - allow_empty_lists: bool = True, -) -> None: - if not isinstance(maybe_tuple, tuple): - raise TypeError(f"Expected tuple not {type(maybe_tuple)}") - if len(maybe_tuple) != tuple_length: - raise ValueError(f"Expected tuple of length {tuple_length} not {len(maybe_tuple)}") - for maybe_list in maybe_tuple: - if not isinstance(maybe_list, list): - msg = f"Expected tuple to contain {tuple_length} lists but found a {type(maybe_list)}" - raise TypeError(msg) - lengths = [len(item) for item in maybe_tuple] - if len(set(lengths)) != 1: - msg = f"Expected {tuple_length} lists with same length but lengths are {lengths}" - raise ValueError(msg) - if not allow_empty_lists and lengths[0] == 0: - raise ValueError(f"Expected {tuple_length} non-empty lists") - - -def check_filled(filled: cpy.FillReturn, fill_type: FillType | str) -> None: - fill_type = as_fill_type(fill_type) - - if fill_type == FillType.OuterCode: - if TYPE_CHECKING: - filled = cast(cpy.FillReturn_OuterCode, filled) - _check_tuple_of_lists_with_same_length(filled, 2) - for i, (points, codes) in enumerate(zip(*filled)): - check_point_array(points) - check_code_array(codes) - if len(points) != len(codes): - raise ValueError(f"Points and codes have different lengths in polygon {i}") - elif fill_type == FillType.OuterOffset: - if TYPE_CHECKING: - filled = cast(cpy.FillReturn_OuterOffset, filled) - _check_tuple_of_lists_with_same_length(filled, 2) - for i, (points, offsets) in enumerate(zip(*filled)): - check_point_array(points) - check_offset_array(offsets) - if offsets[-1] != len(points): - raise ValueError(f"Inconsistent points and offsets in polygon {i}") - elif fill_type == FillType.ChunkCombinedCode: - if TYPE_CHECKING: - filled = cast(cpy.FillReturn_ChunkCombinedCode, filled) - _check_tuple_of_lists_with_same_length(filled, 2, allow_empty_lists=False) - for chunk, (points_or_none, codes_or_none) in enumerate(zip(*filled)): - if points_or_none is not None and codes_or_none is not None: - check_point_array(points_or_none) - check_code_array(codes_or_none) - if len(points_or_none) != len(codes_or_none): - raise ValueError(f"Points and codes have different lengths in chunk {chunk}") - elif not (points_or_none is None and codes_or_none is None): - raise ValueError(f"Inconsistent Nones in chunk {chunk}") - elif fill_type == FillType.ChunkCombinedOffset: - if TYPE_CHECKING: - filled = cast(cpy.FillReturn_ChunkCombinedOffset, filled) - _check_tuple_of_lists_with_same_length(filled, 2, allow_empty_lists=False) - for chunk, (points_or_none, offsets_or_none) in enumerate(zip(*filled)): - if points_or_none is not None and offsets_or_none is not None: - check_point_array(points_or_none) - check_offset_array(offsets_or_none) - if offsets_or_none[-1] != len(points_or_none): - raise ValueError(f"Inconsistent points and offsets in chunk {chunk}") - elif not (points_or_none is None and offsets_or_none is None): - raise ValueError(f"Inconsistent Nones in chunk {chunk}") - elif fill_type == FillType.ChunkCombinedCodeOffset: - if TYPE_CHECKING: - filled = cast(cpy.FillReturn_ChunkCombinedCodeOffset, filled) - _check_tuple_of_lists_with_same_length(filled, 3, allow_empty_lists=False) - for i, (points_or_none, codes_or_none, outer_offsets_or_none) in enumerate(zip(*filled)): - if (points_or_none is not None and codes_or_none is not None and - outer_offsets_or_none is not None): - check_point_array(points_or_none) - check_code_array(codes_or_none) - check_offset_array(outer_offsets_or_none) - if len(codes_or_none) != len(points_or_none): - raise ValueError(f"Points and codes have different lengths in chunk {i}") - if outer_offsets_or_none[-1] != len(codes_or_none): - raise ValueError(f"Inconsistent codes and outer_offsets in chunk {i}") - elif not (points_or_none is None and codes_or_none is None and - outer_offsets_or_none is None): - raise ValueError(f"Inconsistent Nones in chunk {i}") - elif fill_type == FillType.ChunkCombinedOffsetOffset: - if TYPE_CHECKING: - filled = cast(cpy.FillReturn_ChunkCombinedOffsetOffset, filled) - _check_tuple_of_lists_with_same_length(filled, 3, allow_empty_lists=False) - for i, (points_or_none, offsets_or_none, outer_offsets_or_none) in enumerate(zip(*filled)): - if (points_or_none is not None and offsets_or_none is not None and - outer_offsets_or_none is not None): - check_point_array(points_or_none) - check_offset_array(offsets_or_none) - check_offset_array(outer_offsets_or_none) - if offsets_or_none[-1] != len(points_or_none): - raise ValueError(f"Inconsistent points and offsets in chunk {i}") - if outer_offsets_or_none[-1] != len(offsets_or_none) - 1: - raise ValueError(f"Inconsistent offsets and outer_offsets in chunk {i}") - elif not (points_or_none is None and offsets_or_none is None and - outer_offsets_or_none is None): - raise ValueError(f"Inconsistent Nones in chunk {i}") - else: - raise ValueError(f"Invalid FillType {fill_type}") - - -def check_lines(lines: cpy.LineReturn, line_type: LineType | str) -> None: - line_type = as_line_type(line_type) - - if line_type == LineType.Separate: - if TYPE_CHECKING: - lines = cast(cpy.LineReturn_Separate, lines) - if not isinstance(lines, list): - raise TypeError(f"Expected list not {type(lines)}") - for points in lines: - check_point_array(points) - elif line_type == LineType.SeparateCode: - if TYPE_CHECKING: - lines = cast(cpy.LineReturn_SeparateCode, lines) - _check_tuple_of_lists_with_same_length(lines, 2) - for i, (points, codes) in enumerate(zip(*lines)): - check_point_array(points) - check_code_array(codes) - if len(points) != len(codes): - raise ValueError(f"Points and codes have different lengths in line {i}") - elif line_type == LineType.ChunkCombinedCode: - if TYPE_CHECKING: - lines = cast(cpy.LineReturn_ChunkCombinedCode, lines) - _check_tuple_of_lists_with_same_length(lines, 2, allow_empty_lists=False) - for chunk, (points_or_none, codes_or_none) in enumerate(zip(*lines)): - if points_or_none is not None and codes_or_none is not None: - check_point_array(points_or_none) - check_code_array(codes_or_none) - if len(points_or_none) != len(codes_or_none): - raise ValueError(f"Points and codes have different lengths in chunk {chunk}") - elif not (points_or_none is None and codes_or_none is None): - raise ValueError(f"Inconsistent Nones in chunk {chunk}") - elif line_type == LineType.ChunkCombinedOffset: - if TYPE_CHECKING: - lines = cast(cpy.LineReturn_ChunkCombinedOffset, lines) - _check_tuple_of_lists_with_same_length(lines, 2, allow_empty_lists=False) - for chunk, (points_or_none, offsets_or_none) in enumerate(zip(*lines)): - if points_or_none is not None and offsets_or_none is not None: - check_point_array(points_or_none) - check_offset_array(offsets_or_none) - if offsets_or_none[-1] != len(points_or_none): - raise ValueError(f"Inconsistent points and offsets in chunk {chunk}") - elif not (points_or_none is None and offsets_or_none is None): - raise ValueError(f"Inconsistent Nones in chunk {chunk}") - elif line_type == LineType.ChunkCombinedNan: - if TYPE_CHECKING: - lines = cast(cpy.LineReturn_ChunkCombinedNan, lines) - _check_tuple_of_lists_with_same_length(lines, 1, allow_empty_lists=False) - for _chunk, points_or_none in enumerate(lines[0]): - if points_or_none is not None: - check_point_array(points_or_none) - else: - raise ValueError(f"Invalid LineType {line_type}") diff --git a/.venv/Lib/site-packages/contourpy/types.py b/.venv/Lib/site-packages/contourpy/types.py deleted file mode 100644 index e704b98..0000000 --- a/.venv/Lib/site-packages/contourpy/types.py +++ /dev/null @@ -1,13 +0,0 @@ -from __future__ import annotations - -import numpy as np - -# dtypes of arrays returned by ContourPy. -point_dtype = np.float64 -code_dtype = np.uint8 -offset_dtype = np.uint32 - -# Kind codes used in Matplotlib Paths. -MOVETO = 1 -LINETO = 2 -CLOSEPOLY = 79 diff --git a/.venv/Lib/site-packages/contourpy/util/__init__.py b/.venv/Lib/site-packages/contourpy/util/__init__.py deleted file mode 100644 index fe33fce..0000000 --- a/.venv/Lib/site-packages/contourpy/util/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import annotations - -from contourpy.util._build_config import build_config - -__all__ = ["build_config"] diff --git a/.venv/Lib/site-packages/contourpy/util/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/contourpy/util/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index e14c18b6bbf4627b8fd6c134538b9302741cd246..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 414 zcmZWj!Ab)$5KX!*)z*H1;-QF_9&EQlFCrqfpn~*Li%SrYxS4D?TI% zH|$^%jK)F467pxUky&g2@R%Eb`ee4+IF^c9!A^A9S;OumE!Vz0jPV=Vo3GabwdU)! QC~wb8I}gPy^`=vP1Hg)VO#lD@ diff --git a/.venv/Lib/site-packages/contourpy/util/__pycache__/_build_config.cpython-311.pyc b/.venv/Lib/site-packages/contourpy/util/__pycache__/_build_config.cpython-311.pyc deleted file mode 100644 index 796e4129cdb64cd70a9dce9b0a5e168bec9e4db1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2269 zcmb7GOK;mo5MJ7P_!+@;nvf~L7Eg)v{?l8U8M z4?X163TS~C=np80{(}CA!sk5|=%MIsfuNV1I=hl>1!xW>gpc2RyByBU&Mx(He}4~x z>*ilSmVe74^rtXRu8t;A-b?{`jWEKBi#+9-q9B~Xsc%!yI&gXiEoT1~6BiZMYx#Z< zTd@=Plw~3kCz1d59CqyZD;h`3D!|uv(`gekaO*@!d2*n|04MPj;542AoR#_n#c;Jh52-`i`w zMg*&AYL!G(go!c1#iD9xhL)F4vvXlBejfN{Yeqe_su>0wZmEt>W6O0->_qi3yQn{K z_I2vSBo|utfmIFOYe2{9}o80Q9!9F17T^otgOEoRuIblSpO-v zErqxilFf*?#G*t6&Ga$ZPb!;EIoGaMsU5|e9)>AZ3Z>uNjS`|Rrv1}^}mbJssq%p3i?WHASgQaDhtWPB5Id!>Fn6k>!GCr0P z0kW=>eCj=C39;j(EzfalZ2~lqWBDxO zI&tihwgFnBG4WXTCG=qMlAg4ea68ysQlKaP+LV^VHl^w57jZPF#Mu+A!1?+{oUw1e zzg;ZJy;mX;CZ6gg)Y>mSB8Rc<1_>^02M38q{Fsz>;siU1SK7XJ>uG6sC7;ii3`5-s z%JEA$cS?Cfz5C>TDHa1}C2>ksXqFOe{n9&Izw~aW>&;e$>WNcN3u~;em6{Zyb%;@X z9O$p`N%#i+GmQEMIm-2A&ft&n*+!M8g_c1xh2!Z}o)tzH8Y9Z_DCXV5I)|p`j~4iV z;DcyCPH0oJ9XN&cm@P%fQ`3b1I87CWL8+@mzWVkhe{&2j?&1&C=z@U=&Bb!9Kg v>CqZ!Z@X@I0Zv@x)MeZ^ diff --git a/.venv/Lib/site-packages/contourpy/util/__pycache__/bokeh_renderer.cpython-311.pyc b/.venv/Lib/site-packages/contourpy/util/__pycache__/bokeh_renderer.cpython-311.pyc deleted file mode 100644 index 6e628b1f9e476e12c8e774825d05374ec52d2380..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19600 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 F{{eJyQ|15w diff --git a/.venv/Lib/site-packages/contourpy/util/__pycache__/bokeh_util.cpython-311.pyc b/.venv/Lib/site-packages/contourpy/util/__pycache__/bokeh_util.cpython-311.pyc deleted file mode 100644 index 14cc7bdb854fee2fe4ca899b1f2e9d51ab1638f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4226 zcmd59TWlN0agT3OJdu(}S+A(HV<%#wr&C4pBaUQRlAT(zWyx_upFq&MqfCo;r|umU z+c+9R&;Uvxw5;L4GGYV#h#eJ<0p+8Be+u+d{yP>|fH**afTAe;Q_ye&6#i*vj}obq zUunOxcO1^n%+Bu2?Cs2cN7EhzZQvg_5=W{K`WxwNHA@Mho_-FL9i=J6S+N)NI8)WU zFY4p{Q9oZ3t>J5BQvk>f*=U!52m(QVUlNd~fOIGIXKUYX-`*U6;75e&xGiiw28$xd$a;8VkCIOt6VJSMXSb zsECOC1z@vdaY1(^U=YV*FBqb`Nhc=5y0C-v9oW$J>_a&{m*UQ+l9F5kJEoqRY7f1F zIW@f*IN~kjf}a&3>S@271aSssEby}`lx(m|;1adfF;UBUOjOWTY9^{}i<+>_BmB=D z`d>H3GLJGg88+ZnQ_yeGF*LQtz#204j6<<6P)jbwhJ7-ra)GYbtu=x(dE?c9yydACq|=uz|}s6}#e4oQ>t7qzBT_uh71*RPc;T zv9R0vFJ7tQg3kwiVPUO_ZL;S1iJkw0ChAq1mJ&;kvXqeC5nJN`A*Px3LphcSh;5d_ zBhN=SOHCbOU}r#l-5HM&Vb4o_?J?W+Vqb$sf2QhX>zg(9Gv2Sb6^~L?@iytbG8$gf zp7WYlV%9}snsEp%KV^>6oTj+{Johhc>|c7D#~cd%N{{_a_ivV3s)gSNLY-VO2C+7U z`UbJ~J63aKKc^In0^b&-9>>^Ya>zXX4>U}+(bZiMBV$OAgF<2=w3TZ@S6f1|7& zau-8MDFk^cl;q(!=Q%;<*f3o>>Z?wrWe%S*QjuO~N)wwzw;>UM{G`{I_y);(H93dL z(XKnUJC#W;orN;skxya|1S&HkueE;wH;`CN0QGo*Tkg#Nle}1LfFHX0TkA zbjuY<_gsw6bES-_JLbfsAWOPaEM-%jO6u0jAmlePYD~njEe$(R0k? z{_gH>rl%(~AtvO{;+SK)dqN{;PcSlJ#Aeb-W}Xw~nUl#2jFgnQj=A{sYr(ZXA80G$4> zKhc8W2mRW+BkRF8wBXwh8nkevXr+QfR1s0GEw~YEz1y$7+55-KTHm<3=ZqRWv*`Kz zFZSeymz5&&xWfkc^3>vRcBJ47E?z768w$QgP(i=H-qgNwF5lFvHT7nl1#k85PJDGD zd*RE`rP0OF9o_X{)1CL0Kf87K_Td%k){%Vh9WD4y5m{-_4RXo2<;HJESDdTV z>h2$`-+R?JeyP>>W~~K(ZFc_+$4&Y=y*!=UZ9L<-y|eF+wY%d90eSCxi^FPQZ;szGy<|rw z-`t@!cdW$o&0YCmw-)R!qAD83002|!TJE~E(7<2n2GqKNLQDI~)WaUFt_Ip)F9AYNoG{yy8gNR{3EuoMgnZ3vGqd_BfYO_eV zHy}5WTrS$6j6;yJjpPh0XqU?PJtz?lD8Fi3VO*H7=6F20mhJXaQ{}rVcx? z8~!k{OZS_OXSgq5Qd?nCT4UlqOwP-&6?YT7hk(5RB;p@9L~#fF>(xdSD+g9D5RVWk z1;7IO(S_)y<$bxv2gkMcp}cok^A0Zzt$Q1n_uXyKb|1`p4{6>*Kye1(xUnBt_XqwO z>|WiM_xEf5{zZF%uFdu=eUgnYonII(IO&CJa4;=i-S7poaq=wJWZ5NU`QzN6@%%b> z>^7tN!m2BbyI=uhVMi&m5YHRw#mI-4RM@x{0Pqd#$Sy3INIX;G?kha=C54%apLBQmP%o)Byz46yJLBXASIVC?6)Irl4rl~K-$viO3L3%C0~LA5 zg`24ZlWNzv)ES?T5ho*6VB-EiAj5VeKF?f-d67-0xFeWEg?t3kzW_jzpr``cqnh6h z^p^UfcLTMlFM128Q#HQ@^sZ`tpQmhC{YB)U97T)W?kJ-F5BS@t+9EQ8k0~z&8RsRy H@XCJy^akd= diff --git a/.venv/Lib/site-packages/contourpy/util/__pycache__/data.cpython-311.pyc b/.venv/Lib/site-packages/contourpy/util/__pycache__/data.cpython-311.pyc deleted file mode 100644 index b43513bcefe058a910e931629f4b1feed90b54c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4374 zcmcgvU2NOd6(&VdqA1CVW4m?p(=Z*JScd1=v74k`R?UA()3m{2JMQWzlW3EY8B3&c zNj0%U0WL5MN@gG$;G*uZ4aOci84Zd&?7@9%9`@i38z6cD<`E0vVd$~|8|ESFOP+Qv z^=CRsmxp2()Zw}Jo^$TG=klKK=$C#!OF;Y1gQfU5aDT;}YNN^w`DhfF4+((~$Rv>> zCrJ|Xj-(?+O;Rc6q|@qCNqW*HQpg2!&ZIlVOfn?lA%te3MezNAp7a3!g7Biy1UxHH zV??m^AzmOznqFR(6^+*;Cauo!Y4LGD%cPUyB}vvgIUtu!&oy4wqA6aTHJww6k~CdN)G|nZJW-b1WvG+; zUjv-Z$?2{X-}N@w6a{PfOW;-~2jueQX-7Fy7RB*|$dQj^pdS)C5rNsPBTH#yUFu4W z*D0+&OkAm1xF}JPY?q23-V*w(J`|8BSG)7;(59iSkd>y zimXkRu6n0CciHr6{^}e-Xn{JfGj>UPZ&GSy*-s%zd0(e>y) z!5??j<#9xXhIx?GY296u2|Qh99t?U3o!z-&SsQEG{hNm!&%@5L-o=YLi8PyMp5306 zPqb`Hpe;Wt{s?>OJ_?O^274hmW-SxdoqF9{dZb+S@7a7Sog+pMtOmk-~$}BE<2}6DM$;PCaM}I@EXreLwb=^O_CFw66drT zkyA4%i@m0B2|lB$5-+P=EXzR~KnbLLm$KyPy_JhjxSgaFXbLH23ELL9;kK=)BQZl(?St(xI zKrB|SrN@Gv`B#;G9(P z5ae5+m$=dV>6yRGFIC<8bEq=%s}StTi31<>nGQK^x_HFP3DI=NlM1h$=rfs=sLmvi zB$#eqwc=~C^CD8zXi}OLO}Z>jB}Lh!#OrC3O)3d#nomX*WI9s3Nn1L>2IR(m<7)}) z%)#%vNy0N{x~{7rE}E{n@|)sQX_HF9g7h^>&}K|>-XtZo4>Z*VAow8a?ePzX`Xd)r z5vdUo31W&%WmJADa$dZyO(&I%5E)ixGbvHl#K@SI5u{8iGW^EiJCX6@-QC@ho*r&Y ziEGz*Bu2V>xHA{eMl?JTO=P6Vd!qbaxX*5MSPjnf5I^=5Zn8RhNkz!3xheweTH51B<{!iBqJVf@ZZ#>>a=UN8=xSUbEH{;d7p*m~poza_nvKnrjOhYG%jX0 z8v=RP&6(w@9Yx_eTM&N zp{Fphdg`vQ8d|$xbi97A+2|NC{3Gj48@{*xO;dZ={}4cO&Mz6lA6Oi@eeTw|Wpc%t zJ7@UXO1?Jm$?MDU`NrJIh4YW#)QN{b0;EH&z?n`}6a|xl>}mS(4U5JRKaCTiNn4j| zx>l2bG_Eb6Pd?g!&!$#IQO~S`oHiV(RZUM+QT8ebX9lZ1cNONcp=!-zKp>YLm#iv^ z&bn-V)hecyT6I$O0KfI!HI!R-uef$fRC%4a_7Ql>js(J(ihNka zfnLQtKB*wHL)MD!NjznR_%+PcwY(-9jm9(Zw^)ou5l&>L3raaCjuFlw2q!3$h8vNd zv(DRWt^s{lw8kQwoh*#E&SI6YytWSKF>^Yl2$`h#ItqgjPPOXKfoxMGNp2Fa6z$Iz z(N=ugvqkJJR-Y{j0FNYJ-E{U9?awwt9P8Vr+Q_DD;wfa5B*Nrba+}(Z1-^<{{{I)K C*+riK diff --git a/.venv/Lib/site-packages/contourpy/util/__pycache__/mpl_renderer.cpython-311.pyc b/.venv/Lib/site-packages/contourpy/util/__pycache__/mpl_renderer.cpython-311.pyc deleted file mode 100644 index 603607c18d31acf34b58275f1bb7f9861d424e57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28491 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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 diff --git a/.venv/Lib/site-packages/contourpy/util/__pycache__/mpl_util.cpython-311.pyc b/.venv/Lib/site-packages/contourpy/util/__pycache__/mpl_util.cpython-311.pyc deleted file mode 100644 index 1e2333509ed9ab1043cd95d6540d5fbae7d3afe8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6064 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 diff --git a/.venv/Lib/site-packages/contourpy/util/__pycache__/renderer.cpython-311.pyc b/.venv/Lib/site-packages/contourpy/util/__pycache__/renderer.cpython-311.pyc deleted file mode 100644 index 4b7ae5ea545c73ed32a2a0ec544cdc81c3a18d5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4354 zcmbstO>Y!Ow!5ciJfHrC5aMhaFp$~6V6(gVGK(=bHcntdFj2I_klyxGjoop74Anh= zEhBN@;2;hhB4u|^Ik7^V_PGDTEA3%aQnZ#<3d(IF=j2n~tDfokurWxfX}@{z)vH(U zt6tampP5Wjf^p%+x8-LEN%}t$%@GX{dHWF{-$_IwvL)GaL6#9$EX9r#BDPvk1s$=X zcB~MydkQ^*R;_p;L1XL?$f{Pdkc983m9o=?w3v@s8N0X8YxfoU?EXT(Jy0012MdF; zq)2lT>3JxTIE_4wNYZoo3r1mxs0&gy@e`6+nWqfLaec!#UB}BRJTi50n)e!up3jVu zZ&QESCBV+y_{+6R`t;>X)1S`g=RnF?&BNlv6l2Ef6?27Vqr7k0br~@o!>5AHle4B} zU8jDPIXsT|jnxX}$t$Kqn_R?^TWVM*zSMw_w?}1+8I=k$kqQct3lZ`mcm>g-(S(E_ z@)7x%9DEpk3QL}cItsDoypWk7=g8Z;WO`aM?hIlfCG9!QW$a)G?NYc@fnWQtrQ zr+3XHVP=|~d8l?-l>+_@8QaBA1OF14C1-bO%Cy-yM=p~Oc1iS-HzAwzJbs-zgfhz3 z7N#1>(-sYnY9-6?Jgw|9jWr~^QyQUV(=nYT&0nUP>G+hDjS>aQ@R7Bu*;UWiOuJ%H zn>v1u%lB9u!pr4V9%CY-J16}rOyBHE`YEl8ajO)T9w@-n0xfTU56E|t4+(CLuS0xY zehT>WkiIX!L{90FQ`Y6Lm8L!-uLztS>R26Gvo5bIPeI~&xS|Nyefd6USy##mgjLD^ zghpglt~eFmV|WIZJ69cI+B|MkZ+VHCBpczXN3AmJ2U#`%z{5>6P1|`i{c-UNk20@F z8KE|Y)mSX%={>(>xm8k}aaXDsU|L-8tHi9@#hJ?&zbxK3J2o~}93R&f+_HbyV6-?k zuFZWhU-WT8U#gnLJJh*TykagEJ=3SBD@JL>SfXCB;~wilnP|ziT*f2Fj2c#D+2GN#>3-L&jjRw~(m;SnCU;6xfW+ZRqe2p!%Sc z$ZV+WZJ>B`(SiiL_{ZOI{ChIbQxz9Zl`ah5NrK_v6WYoLZdVPF1D~0?@TG+3syX&B zpZy*t*?R!8@xX_$%({GFXHaq+fQLGTGfjWEipgKggbpEzN}KK+Y`OCS*f8po>;Qc6 zs0BURV`;<_h&R&JY~77?iK)9L@s~@OwdUC0qn^N{_d%L{fS@xg>?7cLsIK8mkQ)?V z>kVBI_I-$wjnoXceBtui&dKm41*STcoNeT;8r}*ef`1cUWv4U%w_a69ZJB6PQ!5h_ zuzkz;?rP$y4I8#aAITY9atZ;~&@7KbjZw$2DNn(>*YPTF?j5M{Mc1`Ddg%TkjRYZ` zM8y{Xc#U2pLI;h?xI^0vLGm+@+QuM1khbFKMosS|O*eOO)u-P4XC>URIriQCnJjkq zP$)P^ycf67eOF(smdo&ZdLztR=fnamVIn3Nj@RFk&4GCPhN`#h-fedg$S*sT^Qdq7 z7A>j3ZH|52%Bn$7KLzQwEaQ4C%%Cc9vaKq`7B_K0=oF7GF-o1CNN&8$BW2s?skV0T zTN*)U`7z8Wy9Qv7Mi5`q?-*8uF73A`{~ zlth<4v4^NUfn7sIUDo#TxUOT1({-NIb=xIX3-PqB!$GhbGd;Ra+>)-d5mXUHpdt7J z0+FNhh)pB7jNlUl!q4l7y@vn`I5?Mmh#|mKc>jWf{viC+)LWbCt-6|u4%ekla9D~B z*OSuFaP7dGwKopeGx2DqE_HyPBOvqetGa^R;g3~zLe3#3!EE351v3M;0| z(}K=5#0e{H}`tBq`}SRvlZ#DOHtX7Yij1fJbt#+6PumSmipJt*L&(Q W_-6#v$KG(m`&rEV@{)OxnqL7TBeqlk diff --git a/.venv/Lib/site-packages/contourpy/util/_build_config.py b/.venv/Lib/site-packages/contourpy/util/_build_config.py deleted file mode 100644 index 0ba5283..0000000 --- a/.venv/Lib/site-packages/contourpy/util/_build_config.py +++ /dev/null @@ -1,60 +0,0 @@ -# _build_config.py.in is converted into _build_config.py during the meson build process. - -from __future__ import annotations - - -def build_config() -> dict[str, str]: - """ - Return a dictionary containing build configuration settings. - - All dictionary keys and values are strings, for example ``False`` is - returned as ``"False"``. - - .. versionadded:: 1.1.0 - """ - return dict( - # Python settings - python_version="3.11", - python_install_dir=r"c:/Lib/site-packages/", - python_path=r"C:/Users/runneradmin/AppData/Local/Temp/build-env-3x7n_gxa/Scripts/python.exe", - - # Package versions - contourpy_version="1.2.1", - meson_version="1.4.0", - mesonpy_version="0.15.0", - pybind11_version="2.12.0", - - # Misc meson settings - meson_backend="ninja", - build_dir=r"D:/a/contourpy/contourpy/.mesonpy-45if4ju_/lib/contourpy/util", - source_dir=r"D:/a/contourpy/contourpy/lib/contourpy/util", - cross_build="False", - - # Build options - build_options=r"-Dbuildtype=release -Db_ndebug=if-release -Db_vscrt=md -Dvsenv=True '--native-file=D:/a/contourpy/contourpy/.mesonpy-45if4ju_/meson-python-native-file.ini'", - buildtype="release", - cpp_std="c++17", - debug="False", - optimization="3", - vsenv="True", - b_ndebug="if-release", - b_vscrt="md", - - # C++ compiler - compiler_name="msvc", - compiler_version="19.29.30154", - linker_id="link", - compile_command="cl", - - # Host machine - host_cpu="x86_64", - host_cpu_family="x86_64", - host_cpu_endian="little", - host_cpu_system="windows", - - # Build machine, same as host machine if not a cross_build - build_cpu="x86_64", - build_cpu_family="x86_64", - build_cpu_endian="little", - build_cpu_system="windows", - ) diff --git a/.venv/Lib/site-packages/contourpy/util/bokeh_renderer.py b/.venv/Lib/site-packages/contourpy/util/bokeh_renderer.py deleted file mode 100644 index 85b0f8c..0000000 --- a/.venv/Lib/site-packages/contourpy/util/bokeh_renderer.py +++ /dev/null @@ -1,336 +0,0 @@ -from __future__ import annotations - -import io -from typing import TYPE_CHECKING, Any - -from bokeh.io import export_png, export_svg, show -from bokeh.io.export import get_screenshot_as_png -from bokeh.layouts import gridplot -from bokeh.models.annotations.labels import Label -from bokeh.palettes import Category10 -from bokeh.plotting import figure -import numpy as np - -from contourpy.enum_util import as_fill_type, as_line_type -from contourpy.util.bokeh_util import filled_to_bokeh, lines_to_bokeh -from contourpy.util.renderer import Renderer - -if TYPE_CHECKING: - from bokeh.models import GridPlot - from bokeh.palettes import Palette - from numpy.typing import ArrayLike - from selenium.webdriver.remote.webdriver import WebDriver - - from contourpy import FillType, LineType - from contourpy._contourpy import FillReturn, LineReturn - - -class BokehRenderer(Renderer): - """Utility renderer using Bokeh to render a grid of plots over the same (x, y) range. - - Args: - nrows (int, optional): Number of rows of plots, default ``1``. - ncols (int, optional): Number of columns of plots, default ``1``. - figsize (tuple(float, float), optional): Figure size in inches (assuming 100 dpi), default - ``(9, 9)``. - show_frame (bool, optional): Whether to show frame and axes ticks, default ``True``. - want_svg (bool, optional): Whether output is required in SVG format or not, default - ``False``. - - Warning: - :class:`~contourpy.util.bokeh_renderer.BokehRenderer`, unlike - :class:`~contourpy.util.mpl_renderer.MplRenderer`, needs to be told in advance if output to - SVG format will be required later, otherwise it will assume PNG output. - """ - _figures: list[figure] - _layout: GridPlot - _palette: Palette - _want_svg: bool - - def __init__( - self, - nrows: int = 1, - ncols: int = 1, - figsize: tuple[float, float] = (9, 9), - show_frame: bool = True, - want_svg: bool = False, - ) -> None: - self._want_svg = want_svg - self._palette = Category10[10] - - total_size = 100*np.asarray(figsize, dtype=int) # Assuming 100 dpi. - - nfigures = nrows*ncols - self._figures = [] - backend = "svg" if self._want_svg else "canvas" - for _ in range(nfigures): - fig = figure(output_backend=backend) - fig.xgrid.visible = False - fig.ygrid.visible = False - self._figures.append(fig) - if not show_frame: - fig.outline_line_color = None # type: ignore[assignment] - fig.axis.visible = False - - self._layout = gridplot( - self._figures, ncols=ncols, toolbar_location=None, # type: ignore[arg-type] - width=total_size[0] // ncols, height=total_size[1] // nrows) - - def _convert_color(self, color: str) -> str: - if isinstance(color, str) and color[0] == "C": - index = int(color[1:]) - color = self._palette[index] - return color - - def _get_figure(self, ax: figure | int) -> figure: - if isinstance(ax, int): - ax = self._figures[ax] - return ax - - def filled( - self, - filled: FillReturn, - fill_type: FillType | str, - ax: figure | int = 0, - color: str = "C0", - alpha: float = 0.7, - ) -> None: - """Plot filled contours on a single plot. - - Args: - filled (sequence of arrays): Filled contour data as returned by - :func:`~contourpy.ContourGenerator.filled`. - fill_type (FillType or str): Type of ``filled`` data as returned by - :attr:`~contourpy.ContourGenerator.fill_type`, or a string equivalent. - ax (int or Bokeh Figure, optional): Which plot to use, default ``0``. - color (str, optional): Color to plot with. May be a string color or the letter ``"C"`` - followed by an integer in the range ``"C0"`` to ``"C9"`` to use a color from the - ``Category10`` palette. Default ``"C0"``. - alpha (float, optional): Opacity to plot with, default ``0.7``. - """ - fill_type = as_fill_type(fill_type) - fig = self._get_figure(ax) - color = self._convert_color(color) - xs, ys = filled_to_bokeh(filled, fill_type) - if len(xs) > 0: - fig.multi_polygons(xs=[xs], ys=[ys], color=color, fill_alpha=alpha, line_width=0) - - def grid( - self, - x: ArrayLike, - y: ArrayLike, - ax: figure | int = 0, - color: str = "black", - alpha: float = 0.1, - point_color: str | None = None, - quad_as_tri_alpha: float = 0, - ) -> None: - """Plot quad grid lines on a single plot. - - Args: - x (array-like of shape (ny, nx) or (nx,)): The x-coordinates of the grid points. - y (array-like of shape (ny, nx) or (ny,)): The y-coordinates of the grid points. - ax (int or Bokeh Figure, optional): Which plot to use, default ``0``. - color (str, optional): Color to plot grid lines, default ``"black"``. - alpha (float, optional): Opacity to plot lines with, default ``0.1``. - point_color (str, optional): Color to plot grid points or ``None`` if grid points - should not be plotted, default ``None``. - quad_as_tri_alpha (float, optional): Opacity to plot ``quad_as_tri`` grid, default - ``0``. - - Colors may be a string color or the letter ``"C"`` followed by an integer in the range - ``"C0"`` to ``"C9"`` to use a color from the ``Category10`` palette. - - Warning: - ``quad_as_tri_alpha > 0`` plots all quads as though they are unmasked. - """ - fig = self._get_figure(ax) - x, y = self._grid_as_2d(x, y) - xs = list(x) + list(x.T) - ys = list(y) + list(y.T) - kwargs = {"line_color": color, "alpha": alpha} - fig.multi_line(xs, ys, **kwargs) - if quad_as_tri_alpha > 0: - # Assumes no quad mask. - xmid = (0.25*(x[:-1, :-1] + x[1:, :-1] + x[:-1, 1:] + x[1:, 1:])).ravel() - ymid = (0.25*(y[:-1, :-1] + y[1:, :-1] + y[:-1, 1:] + y[1:, 1:])).ravel() - fig.multi_line( - list(np.stack((x[:-1, :-1].ravel(), xmid, x[1:, 1:].ravel()), axis=1)), - list(np.stack((y[:-1, :-1].ravel(), ymid, y[1:, 1:].ravel()), axis=1)), - **kwargs) - fig.multi_line( - list(np.stack((x[:-1, 1:].ravel(), xmid, x[1:, :-1].ravel()), axis=1)), - list(np.stack((y[:-1, 1:].ravel(), ymid, y[1:, :-1].ravel()), axis=1)), - **kwargs) - if point_color is not None: - fig.circle( - x=x.ravel(), y=y.ravel(), fill_color=color, line_color=None, alpha=alpha, size=8) - - def lines( - self, - lines: LineReturn, - line_type: LineType | str, - ax: figure | int = 0, - color: str = "C0", - alpha: float = 1.0, - linewidth: float = 1, - ) -> None: - """Plot contour lines on a single plot. - - Args: - lines (sequence of arrays): Contour line data as returned by - :func:`~contourpy.ContourGenerator.lines`. - line_type (LineType or str): Type of ``lines`` data as returned by - :attr:`~contourpy.ContourGenerator.line_type`, or a string equivalent. - ax (int or Bokeh Figure, optional): Which plot to use, default ``0``. - color (str, optional): Color to plot lines. May be a string color or the letter ``"C"`` - followed by an integer in the range ``"C0"`` to ``"C9"`` to use a color from the - ``Category10`` palette. Default ``"C0"``. - alpha (float, optional): Opacity to plot lines with, default ``1.0``. - linewidth (float, optional): Width of lines, default ``1``. - - Note: - Assumes all lines are open line strips not closed line loops. - """ - line_type = as_line_type(line_type) - fig = self._get_figure(ax) - color = self._convert_color(color) - xs, ys = lines_to_bokeh(lines, line_type) - if xs is not None: - fig.line(xs, ys, line_color=color, line_alpha=alpha, line_width=linewidth) - - def mask( - self, - x: ArrayLike, - y: ArrayLike, - z: ArrayLike | np.ma.MaskedArray[Any, Any], - ax: figure | int = 0, - color: str = "black", - ) -> None: - """Plot masked out grid points as circles on a single plot. - - Args: - x (array-like of shape (ny, nx) or (nx,)): The x-coordinates of the grid points. - y (array-like of shape (ny, nx) or (ny,)): The y-coordinates of the grid points. - z (masked array of shape (ny, nx): z-values. - ax (int or Bokeh Figure, optional): Which plot to use, default ``0``. - color (str, optional): Circle color, default ``"black"``. - """ - mask = np.ma.getmask(z) # type: ignore[no-untyped-call] - if mask is np.ma.nomask: - return - fig = self._get_figure(ax) - color = self._convert_color(color) - x, y = self._grid_as_2d(x, y) - fig.circle(x[mask], y[mask], fill_color=color, size=10) - - def save( - self, - filename: str, - transparent: bool = False, - *, - webdriver: WebDriver | None = None, - ) -> None: - """Save plots to SVG or PNG file. - - Args: - filename (str): Filename to save to. - transparent (bool, optional): Whether background should be transparent, default - ``False``. - webdriver (WebDriver, optional): Selenium WebDriver instance to use to create the image. - - .. versionadded:: 1.1.1 - - Warning: - To output to SVG file, ``want_svg=True`` must have been passed to the constructor. - """ - if transparent: - for fig in self._figures: - fig.background_fill_color = None # type: ignore[assignment] - fig.border_fill_color = None # type: ignore[assignment] - - if self._want_svg: - export_svg(self._layout, filename=filename, webdriver=webdriver) - else: - export_png(self._layout, filename=filename, webdriver=webdriver) - - def save_to_buffer(self, *, webdriver: WebDriver | None = None) -> io.BytesIO: - """Save plots to an ``io.BytesIO`` buffer. - - Args: - webdriver (WebDriver, optional): Selenium WebDriver instance to use to create the image. - - .. versionadded:: 1.1.1 - - Return: - BytesIO: PNG image buffer. - """ - image = get_screenshot_as_png(self._layout, driver=webdriver) - buffer = io.BytesIO() - image.save(buffer, "png") - return buffer - - def show(self) -> None: - """Show plots in web browser, in usual Bokeh manner. - """ - show(self._layout) - - def title(self, title: str, ax: figure | int = 0, color: str | None = None) -> None: - """Set the title of a single plot. - - Args: - title (str): Title text. - ax (int or Bokeh Figure, optional): Which plot to set the title of, default ``0``. - color (str, optional): Color to set title. May be a string color or the letter ``"C"`` - followed by an integer in the range ``"C0"`` to ``"C9"`` to use a color from the - ``Category10`` palette. Default ``None`` which is ``black``. - """ - fig = self._get_figure(ax) - fig.title = title # type: ignore[assignment] - fig.title.align = "center" # type: ignore[attr-defined] - if color is not None: - fig.title.text_color = self._convert_color(color) # type: ignore[attr-defined] - - def z_values( - self, - x: ArrayLike, - y: ArrayLike, - z: ArrayLike, - ax: figure | int = 0, - color: str = "green", - fmt: str = ".1f", - quad_as_tri: bool = False, - ) -> None: - """Show ``z`` values on a single plot. - - Args: - x (array-like of shape (ny, nx) or (nx,)): The x-coordinates of the grid points. - y (array-like of shape (ny, nx) or (ny,)): The y-coordinates of the grid points. - z (array-like of shape (ny, nx): z-values. - ax (int or Bokeh Figure, optional): Which plot to use, default ``0``. - color (str, optional): Color of added text. May be a string color or the letter ``"C"`` - followed by an integer in the range ``"C0"`` to ``"C9"`` to use a color from the - ``Category10`` palette. Default ``"green"``. - fmt (str, optional): Format to display z-values, default ``".1f"``. - quad_as_tri (bool, optional): Whether to show z-values at the ``quad_as_tri`` centres - of quads. - - Warning: - ``quad_as_tri=True`` shows z-values for all quads, even if masked. - """ - fig = self._get_figure(ax) - color = self._convert_color(color) - x, y = self._grid_as_2d(x, y) - z = np.asarray(z) - ny, nx = z.shape - kwargs = {"text_color": color, "text_align": "center", "text_baseline": "middle"} - for j in range(ny): - for i in range(nx): - fig.add_layout(Label(x=x[j, i], y=y[j, i], text=f"{z[j, i]:{fmt}}", **kwargs)) - if quad_as_tri: - for j in range(ny-1): - for i in range(nx-1): - xx = np.mean(x[j:j+2, i:i+2]) - yy = np.mean(y[j:j+2, i:i+2]) - zz = np.mean(z[j:j+2, i:i+2]) - fig.add_layout(Label(x=xx, y=yy, text=f"{zz:{fmt}}", **kwargs)) diff --git a/.venv/Lib/site-packages/contourpy/util/bokeh_util.py b/.venv/Lib/site-packages/contourpy/util/bokeh_util.py deleted file mode 100644 index e75eb84..0000000 --- a/.venv/Lib/site-packages/contourpy/util/bokeh_util.py +++ /dev/null @@ -1,74 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, cast - -from contourpy import FillType, LineType -from contourpy.array import offsets_from_codes -from contourpy.convert import convert_lines -from contourpy.dechunk import dechunk_lines - -if TYPE_CHECKING: - from contourpy._contourpy import ( - CoordinateArray, - FillReturn, - LineReturn, - LineReturn_ChunkCombinedNan, - ) - - -def filled_to_bokeh( - filled: FillReturn, - fill_type: FillType, -) -> tuple[list[list[CoordinateArray]], list[list[CoordinateArray]]]: - xs: list[list[CoordinateArray]] = [] - ys: list[list[CoordinateArray]] = [] - if fill_type in (FillType.OuterOffset, FillType.ChunkCombinedOffset, - FillType.OuterCode, FillType.ChunkCombinedCode): - have_codes = fill_type in (FillType.OuterCode, FillType.ChunkCombinedCode) - - for points, offsets in zip(*filled): - if points is None: - continue - if have_codes: - offsets = offsets_from_codes(offsets) - xs.append([]) # New outer with zero or more holes. - ys.append([]) - for i in range(len(offsets)-1): - xys = points[offsets[i]:offsets[i+1]] - xs[-1].append(xys[:, 0]) - ys[-1].append(xys[:, 1]) - elif fill_type in (FillType.ChunkCombinedCodeOffset, FillType.ChunkCombinedOffsetOffset): - for points, codes_or_offsets, outer_offsets in zip(*filled): - if points is None: - continue - for j in range(len(outer_offsets)-1): - if fill_type == FillType.ChunkCombinedCodeOffset: - codes = codes_or_offsets[outer_offsets[j]:outer_offsets[j+1]] - offsets = offsets_from_codes(codes) + outer_offsets[j] - else: - offsets = codes_or_offsets[outer_offsets[j]:outer_offsets[j+1]+1] - xs.append([]) # New outer with zero or more holes. - ys.append([]) - for k in range(len(offsets)-1): - xys = points[offsets[k]:offsets[k+1]] - xs[-1].append(xys[:, 0]) - ys[-1].append(xys[:, 1]) - else: - raise RuntimeError(f"Conversion of FillType {fill_type} to Bokeh is not implemented") - - return xs, ys - - -def lines_to_bokeh( - lines: LineReturn, - line_type: LineType, -) -> tuple[CoordinateArray | None, CoordinateArray | None]: - lines = convert_lines(lines, line_type, LineType.ChunkCombinedNan) - lines = dechunk_lines(lines, LineType.ChunkCombinedNan) - if TYPE_CHECKING: - lines = cast(LineReturn_ChunkCombinedNan, lines) - points = lines[0][0] - if points is None: - return None, None - else: - return points[:, 0], points[:, 1] diff --git a/.venv/Lib/site-packages/contourpy/util/data.py b/.venv/Lib/site-packages/contourpy/util/data.py deleted file mode 100644 index 5ab2617..0000000 --- a/.venv/Lib/site-packages/contourpy/util/data.py +++ /dev/null @@ -1,78 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, Any - -import numpy as np - -if TYPE_CHECKING: - from contourpy._contourpy import CoordinateArray - - -def simple( - shape: tuple[int, int], want_mask: bool = False, -) -> tuple[CoordinateArray, CoordinateArray, CoordinateArray | np.ma.MaskedArray[Any, Any]]: - """Return simple test data consisting of the sum of two gaussians. - - Args: - shape (tuple(int, int)): 2D shape of data to return. - want_mask (bool, optional): Whether test data should be masked or not, default ``False``. - - Return: - Tuple of 3 arrays: ``x``, ``y``, ``z`` test data, ``z`` will be masked if - ``want_mask=True``. - """ - ny, nx = shape - x = np.arange(nx, dtype=np.float64) - y = np.arange(ny, dtype=np.float64) - x, y = np.meshgrid(x, y) - - xscale = nx - 1.0 - yscale = ny - 1.0 - - # z is sum of 2D gaussians. - amp = np.asarray([1.0, -1.0, 0.8, -0.9, 0.7]) - mid = np.asarray([[0.4, 0.2], [0.3, 0.8], [0.9, 0.75], [0.7, 0.3], [0.05, 0.7]]) - width = np.asarray([0.4, 0.2, 0.2, 0.2, 0.1]) - - z = np.zeros_like(x) - for i in range(len(amp)): - z += amp[i]*np.exp(-((x/xscale - mid[i, 0])**2 + (y/yscale - mid[i, 1])**2) / width[i]**2) - - if want_mask: - mask = np.logical_or( - ((x/xscale - 1.0)**2 / 0.2 + (y/yscale - 0.0)**2 / 0.1) < 1.0, - ((x/xscale - 0.2)**2 / 0.02 + (y/yscale - 0.45)**2 / 0.08) < 1.0, - ) - z = np.ma.array(z, mask=mask) # type: ignore[no-untyped-call] - - return x, y, z - - -def random( - shape: tuple[int, int], seed: int = 2187, mask_fraction: float = 0.0, -) -> tuple[CoordinateArray, CoordinateArray, CoordinateArray | np.ma.MaskedArray[Any, Any]]: - """Return random test data. - - Args: - shape (tuple(int, int)): 2D shape of data to return. - seed (int, optional): Seed for random number generator, default 2187. - mask_fraction (float, optional): Fraction of elements to mask, default 0. - - Return: - Tuple of 3 arrays: ``x``, ``y``, ``z`` test data, ``z`` will be masked if - ``mask_fraction`` is greater than zero. - """ - ny, nx = shape - x = np.arange(nx, dtype=np.float64) - y = np.arange(ny, dtype=np.float64) - x, y = np.meshgrid(x, y) - - rng = np.random.default_rng(seed) - z = rng.uniform(size=shape) - - if mask_fraction > 0.0: - mask_fraction = min(mask_fraction, 0.99) - mask = rng.uniform(size=shape) < mask_fraction - z = np.ma.array(z, mask=mask) # type: ignore[no-untyped-call] - - return x, y, z diff --git a/.venv/Lib/site-packages/contourpy/util/mpl_renderer.py b/.venv/Lib/site-packages/contourpy/util/mpl_renderer.py deleted file mode 100644 index c459e02..0000000 --- a/.venv/Lib/site-packages/contourpy/util/mpl_renderer.py +++ /dev/null @@ -1,534 +0,0 @@ -from __future__ import annotations - -import io -from typing import TYPE_CHECKING, Any, cast - -import matplotlib.collections as mcollections -import matplotlib.pyplot as plt -import numpy as np - -from contourpy import FillType, LineType -from contourpy.convert import convert_filled, convert_lines -from contourpy.enum_util import as_fill_type, as_line_type -from contourpy.util.mpl_util import filled_to_mpl_paths, lines_to_mpl_paths -from contourpy.util.renderer import Renderer - -if TYPE_CHECKING: - from collections.abc import Sequence - - from matplotlib.axes import Axes - from matplotlib.figure import Figure - from numpy.typing import ArrayLike - - import contourpy._contourpy as cpy - - -class MplRenderer(Renderer): - """Utility renderer using Matplotlib to render a grid of plots over the same (x, y) range. - - Args: - nrows (int, optional): Number of rows of plots, default ``1``. - ncols (int, optional): Number of columns of plots, default ``1``. - figsize (tuple(float, float), optional): Figure size in inches, default ``(9, 9)``. - show_frame (bool, optional): Whether to show frame and axes ticks, default ``True``. - backend (str, optional): Matplotlib backend to use or ``None`` for default backend. - Default ``None``. - gridspec_kw (dict, optional): Gridspec keyword arguments to pass to ``plt.subplots``, - default None. - """ - _axes: Sequence[Axes] - _fig: Figure - _want_tight: bool - - def __init__( - self, - nrows: int = 1, - ncols: int = 1, - figsize: tuple[float, float] = (9, 9), - show_frame: bool = True, - backend: str | None = None, - gridspec_kw: dict[str, Any] | None = None, - ) -> None: - if backend is not None: - import matplotlib as mpl - mpl.use(backend) - - kwargs: dict[str, Any] = {"figsize": figsize, "squeeze": False, - "sharex": True, "sharey": True} - if gridspec_kw is not None: - kwargs["gridspec_kw"] = gridspec_kw - else: - kwargs["subplot_kw"] = {"aspect": "equal"} - - self._fig, axes = plt.subplots(nrows, ncols, **kwargs) - self._axes = axes.flatten() - if not show_frame: - for ax in self._axes: - ax.axis("off") - - self._want_tight = True - - def __del__(self) -> None: - if hasattr(self, "_fig"): - plt.close(self._fig) - - def _autoscale(self) -> None: - # Using axes._need_autoscale attribute if need to autoscale before rendering after adding - # lines/filled. Only want to autoscale once per axes regardless of how many lines/filled - # added. - for ax in self._axes: - if getattr(ax, "_need_autoscale", False): - ax.autoscale_view(tight=True) - ax._need_autoscale = False # type: ignore[attr-defined] - if self._want_tight and len(self._axes) > 1: - self._fig.tight_layout() - - def _get_ax(self, ax: Axes | int) -> Axes: - if isinstance(ax, int): - ax = self._axes[ax] - return ax - - def filled( - self, - filled: cpy.FillReturn, - fill_type: FillType | str, - ax: Axes | int = 0, - color: str = "C0", - alpha: float = 0.7, - ) -> None: - """Plot filled contours on a single Axes. - - Args: - filled (sequence of arrays): Filled contour data as returned by - :func:`~contourpy.ContourGenerator.filled`. - fill_type (FillType or str): Type of ``filled`` data as returned by - :attr:`~contourpy.ContourGenerator.fill_type`, or string equivalent - ax (int or Maplotlib Axes, optional): Which axes to plot on, default ``0``. - color (str, optional): Color to plot with. May be a string color or the letter ``"C"`` - followed by an integer in the range ``"C0"`` to ``"C9"`` to use a color from the - ``tab10`` colormap. Default ``"C0"``. - alpha (float, optional): Opacity to plot with, default ``0.7``. - """ - fill_type = as_fill_type(fill_type) - ax = self._get_ax(ax) - paths = filled_to_mpl_paths(filled, fill_type) - collection = mcollections.PathCollection( - paths, facecolors=color, edgecolors="none", lw=0, alpha=alpha) - ax.add_collection(collection) - ax._need_autoscale = True # type: ignore[attr-defined] - - def grid( - self, - x: ArrayLike, - y: ArrayLike, - ax: Axes | int = 0, - color: str = "black", - alpha: float = 0.1, - point_color: str | None = None, - quad_as_tri_alpha: float = 0, - ) -> None: - """Plot quad grid lines on a single Axes. - - Args: - x (array-like of shape (ny, nx) or (nx,)): The x-coordinates of the grid points. - y (array-like of shape (ny, nx) or (ny,)): The y-coordinates of the grid points. - ax (int or Matplotlib Axes, optional): Which Axes to plot on, default ``0``. - color (str, optional): Color to plot grid lines, default ``"black"``. - alpha (float, optional): Opacity to plot lines with, default ``0.1``. - point_color (str, optional): Color to plot grid points or ``None`` if grid points - should not be plotted, default ``None``. - quad_as_tri_alpha (float, optional): Opacity to plot ``quad_as_tri`` grid, default 0. - - Colors may be a string color or the letter ``"C"`` followed by an integer in the range - ``"C0"`` to ``"C9"`` to use a color from the ``tab10`` colormap. - - Warning: - ``quad_as_tri_alpha > 0`` plots all quads as though they are unmasked. - """ - ax = self._get_ax(ax) - x, y = self._grid_as_2d(x, y) - kwargs: dict[str, Any] = {"color": color, "alpha": alpha} - ax.plot(x, y, x.T, y.T, **kwargs) - if quad_as_tri_alpha > 0: - # Assumes no quad mask. - xmid = 0.25*(x[:-1, :-1] + x[1:, :-1] + x[:-1, 1:] + x[1:, 1:]) - ymid = 0.25*(y[:-1, :-1] + y[1:, :-1] + y[:-1, 1:] + y[1:, 1:]) - kwargs["alpha"] = quad_as_tri_alpha - ax.plot( - np.stack((x[:-1, :-1], xmid, x[1:, 1:])).reshape((3, -1)), - np.stack((y[:-1, :-1], ymid, y[1:, 1:])).reshape((3, -1)), - np.stack((x[1:, :-1], xmid, x[:-1, 1:])).reshape((3, -1)), - np.stack((y[1:, :-1], ymid, y[:-1, 1:])).reshape((3, -1)), - **kwargs) - if point_color is not None: - ax.plot(x, y, color=point_color, alpha=alpha, marker="o", lw=0) - ax._need_autoscale = True # type: ignore[attr-defined] - - def lines( - self, - lines: cpy.LineReturn, - line_type: LineType | str, - ax: Axes | int = 0, - color: str = "C0", - alpha: float = 1.0, - linewidth: float = 1, - ) -> None: - """Plot contour lines on a single Axes. - - Args: - lines (sequence of arrays): Contour line data as returned by - :func:`~contourpy.ContourGenerator.lines`. - line_type (LineType or str): Type of ``lines`` data as returned by - :attr:`~contourpy.ContourGenerator.line_type`, or string equivalent. - ax (int or Matplotlib Axes, optional): Which Axes to plot on, default ``0``. - color (str, optional): Color to plot lines. May be a string color or the letter ``"C"`` - followed by an integer in the range ``"C0"`` to ``"C9"`` to use a color from the - ``tab10`` colormap. Default ``"C0"``. - alpha (float, optional): Opacity to plot lines with, default ``1.0``. - linewidth (float, optional): Width of lines, default ``1``. - """ - line_type = as_line_type(line_type) - ax = self._get_ax(ax) - paths = lines_to_mpl_paths(lines, line_type) - collection = mcollections.PathCollection( - paths, facecolors="none", edgecolors=color, lw=linewidth, alpha=alpha) - ax.add_collection(collection) - ax._need_autoscale = True # type: ignore[attr-defined] - - def mask( - self, - x: ArrayLike, - y: ArrayLike, - z: ArrayLike | np.ma.MaskedArray[Any, Any], - ax: Axes | int = 0, - color: str = "black", - ) -> None: - """Plot masked out grid points as circles on a single Axes. - - Args: - x (array-like of shape (ny, nx) or (nx,)): The x-coordinates of the grid points. - y (array-like of shape (ny, nx) or (ny,)): The y-coordinates of the grid points. - z (masked array of shape (ny, nx): z-values. - ax (int or Matplotlib Axes, optional): Which Axes to plot on, default ``0``. - color (str, optional): Circle color, default ``"black"``. - """ - mask = np.ma.getmask(z) # type: ignore[no-untyped-call] - if mask is np.ma.nomask: - return - ax = self._get_ax(ax) - x, y = self._grid_as_2d(x, y) - ax.plot(x[mask], y[mask], "o", c=color) - - def save(self, filename: str, transparent: bool = False) -> None: - """Save plots to SVG or PNG file. - - Args: - filename (str): Filename to save to. - transparent (bool, optional): Whether background should be transparent, default - ``False``. - """ - self._autoscale() - self._fig.savefig(filename, transparent=transparent) - - def save_to_buffer(self) -> io.BytesIO: - """Save plots to an ``io.BytesIO`` buffer. - - Return: - BytesIO: PNG image buffer. - """ - self._autoscale() - buf = io.BytesIO() - self._fig.savefig(buf, format="png") - buf.seek(0) - return buf - - def show(self) -> None: - """Show plots in an interactive window, in the usual Matplotlib manner. - """ - self._autoscale() - plt.show() - - def title(self, title: str, ax: Axes | int = 0, color: str | None = None) -> None: - """Set the title of a single Axes. - - Args: - title (str): Title text. - ax (int or Matplotlib Axes, optional): Which Axes to set the title of, default ``0``. - color (str, optional): Color to set title. May be a string color or the letter ``"C"`` - followed by an integer in the range ``"C0"`` to ``"C9"`` to use a color from the - ``tab10`` colormap. Default is ``None`` which uses Matplotlib's default title color - that depends on the stylesheet in use. - """ - if color: - self._get_ax(ax).set_title(title, color=color) - else: - self._get_ax(ax).set_title(title) - - def z_values( - self, - x: ArrayLike, - y: ArrayLike, - z: ArrayLike, - ax: Axes | int = 0, - color: str = "green", - fmt: str = ".1f", - quad_as_tri: bool = False, - ) -> None: - """Show ``z`` values on a single Axes. - - Args: - x (array-like of shape (ny, nx) or (nx,)): The x-coordinates of the grid points. - y (array-like of shape (ny, nx) or (ny,)): The y-coordinates of the grid points. - z (array-like of shape (ny, nx): z-values. - ax (int or Matplotlib Axes, optional): Which Axes to plot on, default ``0``. - color (str, optional): Color of added text. May be a string color or the letter ``"C"`` - followed by an integer in the range ``"C0"`` to ``"C9"`` to use a color from the - ``tab10`` colormap. Default ``"green"``. - fmt (str, optional): Format to display z-values, default ``".1f"``. - quad_as_tri (bool, optional): Whether to show z-values at the ``quad_as_tri`` centers - of quads. - - Warning: - ``quad_as_tri=True`` shows z-values for all quads, even if masked. - """ - ax = self._get_ax(ax) - x, y = self._grid_as_2d(x, y) - z = np.asarray(z) - ny, nx = z.shape - for j in range(ny): - for i in range(nx): - ax.text(x[j, i], y[j, i], f"{z[j, i]:{fmt}}", ha="center", va="center", - color=color, clip_on=True) - if quad_as_tri: - for j in range(ny-1): - for i in range(nx-1): - xx = np.mean(x[j:j+2, i:i+2]) - yy = np.mean(y[j:j+2, i:i+2]) - zz = np.mean(z[j:j+2, i:i+2]) - ax.text(xx, yy, f"{zz:{fmt}}", ha="center", va="center", color=color, - clip_on=True) - - -class MplTestRenderer(MplRenderer): - """Test renderer implemented using Matplotlib. - - No whitespace around plots and no spines/ticks displayed. - Uses Agg backend, so can only save to file/buffer, cannot call ``show()``. - """ - def __init__( - self, - nrows: int = 1, - ncols: int = 1, - figsize: tuple[float, float] = (9, 9), - ) -> None: - gridspec = { - "left": 0.01, - "right": 0.99, - "top": 0.99, - "bottom": 0.01, - "wspace": 0.01, - "hspace": 0.01, - } - super().__init__( - nrows, ncols, figsize, show_frame=True, backend="Agg", gridspec_kw=gridspec, - ) - - for ax in self._axes: - ax.set_xmargin(0.0) - ax.set_ymargin(0.0) - ax.set_xticks([]) - ax.set_yticks([]) - - self._want_tight = False - - -class MplDebugRenderer(MplRenderer): - """Debug renderer implemented using Matplotlib. - - Extends ``MplRenderer`` to add extra information to help in debugging such as markers, arrows, - text, etc. - """ - def __init__( - self, - nrows: int = 1, - ncols: int = 1, - figsize: tuple[float, float] = (9, 9), - show_frame: bool = True, - ) -> None: - super().__init__(nrows, ncols, figsize, show_frame) - - def _arrow( - self, - ax: Axes, - line_start: cpy.CoordinateArray, - line_end: cpy.CoordinateArray, - color: str, - alpha: float, - arrow_size: float, - ) -> None: - mid = 0.5*(line_start + line_end) - along = line_end - line_start - along /= np.sqrt(np.dot(along, along)) # Unit vector. - right = np.asarray((along[1], -along[0])) - arrow = np.stack(( - mid - (along*0.5 - right)*arrow_size, - mid + along*0.5*arrow_size, - mid - (along*0.5 + right)*arrow_size, - )) - ax.plot(arrow[:, 0], arrow[:, 1], "-", c=color, alpha=alpha) - - def filled( - self, - filled: cpy.FillReturn, - fill_type: FillType | str, - ax: Axes | int = 0, - color: str = "C1", - alpha: float = 0.7, - line_color: str = "C0", - line_alpha: float = 0.7, - point_color: str = "C0", - start_point_color: str = "red", - arrow_size: float = 0.1, - ) -> None: - fill_type = as_fill_type(fill_type) - super().filled(filled, fill_type, ax, color, alpha) - - if line_color is None and point_color is None: - return - - ax = self._get_ax(ax) - filled = convert_filled(filled, fill_type, FillType.ChunkCombinedOffset) - - # Lines. - if line_color is not None: - for points, offsets in zip(*filled): - if points is None: - continue - for start, end in zip(offsets[:-1], offsets[1:]): - xys = points[start:end] - ax.plot(xys[:, 0], xys[:, 1], c=line_color, alpha=line_alpha) - - if arrow_size > 0.0: - n = len(xys) - for i in range(n-1): - self._arrow(ax, xys[i], xys[i+1], line_color, line_alpha, arrow_size) - - # Points. - if point_color is not None: - for points, offsets in zip(*filled): - if points is None: - continue - mask = np.ones(offsets[-1], dtype=bool) - mask[offsets[1:]-1] = False # Exclude end points. - if start_point_color is not None: - start_indices = offsets[:-1] - mask[start_indices] = False # Exclude start points. - ax.plot( - points[:, 0][mask], points[:, 1][mask], "o", c=point_color, alpha=line_alpha) - - if start_point_color is not None: - ax.plot(points[:, 0][start_indices], points[:, 1][start_indices], "o", - c=start_point_color, alpha=line_alpha) - - def lines( - self, - lines: cpy.LineReturn, - line_type: LineType | str, - ax: Axes | int = 0, - color: str = "C0", - alpha: float = 1.0, - linewidth: float = 1, - point_color: str = "C0", - start_point_color: str = "red", - arrow_size: float = 0.1, - ) -> None: - line_type = as_line_type(line_type) - super().lines(lines, line_type, ax, color, alpha, linewidth) - - if arrow_size == 0.0 and point_color is None: - return - - ax = self._get_ax(ax) - separate_lines = convert_lines(lines, line_type, LineType.Separate) - if TYPE_CHECKING: - separate_lines = cast(cpy.LineReturn_Separate, separate_lines) - - if arrow_size > 0.0: - for line in separate_lines: - for i in range(len(line)-1): - self._arrow(ax, line[i], line[i+1], color, alpha, arrow_size) - - if point_color is not None: - for line in separate_lines: - start_index = 0 - end_index = len(line) - if start_point_color is not None: - ax.plot(line[0, 0], line[0, 1], "o", c=start_point_color, alpha=alpha) - start_index = 1 - if line[0][0] == line[-1][0] and line[0][1] == line[-1][1]: - end_index -= 1 - ax.plot(line[start_index:end_index, 0], line[start_index:end_index, 1], "o", - c=color, alpha=alpha) - - def point_numbers( - self, - x: ArrayLike, - y: ArrayLike, - z: ArrayLike, - ax: Axes | int = 0, - color: str = "red", - ) -> None: - ax = self._get_ax(ax) - x, y = self._grid_as_2d(x, y) - z = np.asarray(z) - ny, nx = z.shape - for j in range(ny): - for i in range(nx): - quad = i + j*nx - ax.text(x[j, i], y[j, i], str(quad), ha="right", va="top", color=color, - clip_on=True) - - def quad_numbers( - self, - x: ArrayLike, - y: ArrayLike, - z: ArrayLike, - ax: Axes | int = 0, - color: str = "blue", - ) -> None: - ax = self._get_ax(ax) - x, y = self._grid_as_2d(x, y) - z = np.asarray(z) - ny, nx = z.shape - for j in range(1, ny): - for i in range(1, nx): - quad = i + j*nx - xmid = x[j-1:j+1, i-1:i+1].mean() - ymid = y[j-1:j+1, i-1:i+1].mean() - ax.text(xmid, ymid, str(quad), ha="center", va="center", color=color, clip_on=True) - - def z_levels( - self, - x: ArrayLike, - y: ArrayLike, - z: ArrayLike, - lower_level: float, - upper_level: float | None = None, - ax: Axes | int = 0, - color: str = "green", - ) -> None: - ax = self._get_ax(ax) - x, y = self._grid_as_2d(x, y) - z = np.asarray(z) - ny, nx = z.shape - for j in range(ny): - for i in range(nx): - zz = z[j, i] - if upper_level is not None and zz > upper_level: - z_level = 2 - elif zz > lower_level: - z_level = 1 - else: - z_level = 0 - ax.text(x[j, i], y[j, i], str(z_level), ha="left", va="bottom", color=color, - clip_on=True) diff --git a/.venv/Lib/site-packages/contourpy/util/mpl_util.py b/.venv/Lib/site-packages/contourpy/util/mpl_util.py deleted file mode 100644 index 10a2ccd..0000000 --- a/.venv/Lib/site-packages/contourpy/util/mpl_util.py +++ /dev/null @@ -1,76 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING, cast - -import matplotlib.path as mpath -import numpy as np - -from contourpy import FillType, LineType -from contourpy.array import codes_from_offsets - -if TYPE_CHECKING: - from contourpy._contourpy import FillReturn, LineReturn, LineReturn_Separate - - -def filled_to_mpl_paths(filled: FillReturn, fill_type: FillType) -> list[mpath.Path]: - if fill_type in (FillType.OuterCode, FillType.ChunkCombinedCode): - paths = [mpath.Path(points, codes) for points, codes in zip(*filled) if points is not None] - elif fill_type in (FillType.OuterOffset, FillType.ChunkCombinedOffset): - paths = [mpath.Path(points, codes_from_offsets(offsets)) - for points, offsets in zip(*filled) if points is not None] - elif fill_type == FillType.ChunkCombinedCodeOffset: - paths = [] - for points, codes, outer_offsets in zip(*filled): - if points is None: - continue - points = np.split(points, outer_offsets[1:-1]) - codes = np.split(codes, outer_offsets[1:-1]) - paths += [mpath.Path(p, c) for p, c in zip(points, codes)] - elif fill_type == FillType.ChunkCombinedOffsetOffset: - paths = [] - for points, offsets, outer_offsets in zip(*filled): - if points is None: - continue - for i in range(len(outer_offsets)-1): - offs = offsets[outer_offsets[i]:outer_offsets[i+1]+1] - pts = points[offs[0]:offs[-1]] - paths += [mpath.Path(pts, codes_from_offsets(offs - offs[0]))] - else: - raise RuntimeError(f"Conversion of FillType {fill_type} to MPL Paths is not implemented") - return paths - - -def lines_to_mpl_paths(lines: LineReturn, line_type: LineType) -> list[mpath.Path]: - if line_type == LineType.Separate: - if TYPE_CHECKING: - lines = cast(LineReturn_Separate, lines) - paths = [] - for line in lines: - # Drawing as Paths so that they can be closed correctly. - closed = line[0, 0] == line[-1, 0] and line[0, 1] == line[-1, 1] - paths.append(mpath.Path(line, closed=closed)) - elif line_type in (LineType.SeparateCode, LineType.ChunkCombinedCode): - paths = [mpath.Path(points, codes) for points, codes in zip(*lines) if points is not None] - elif line_type == LineType.ChunkCombinedOffset: - paths = [] - for points, offsets in zip(*lines): - if points is None: - continue - for i in range(len(offsets)-1): - line = points[offsets[i]:offsets[i+1]] - closed = line[0, 0] == line[-1, 0] and line[0, 1] == line[-1, 1] - paths.append(mpath.Path(line, closed=closed)) - elif line_type == LineType.ChunkCombinedNan: - paths = [] - for points in lines[0]: - if points is None: - continue - nan_offsets = np.nonzero(np.isnan(points[:, 0]))[0] - nan_offsets = np.concatenate([[-1], nan_offsets, [len(points)]]) - for s, e in zip(nan_offsets[:-1], nan_offsets[1:]): - line = points[s+1:e] - closed = line[0, 0] == line[-1, 0] and line[0, 1] == line[-1, 1] - paths.append(mpath.Path(line, closed=closed)) - else: - raise RuntimeError(f"Conversion of LineType {line_type} to MPL Paths is not implemented") - return paths diff --git a/.venv/Lib/site-packages/contourpy/util/renderer.py b/.venv/Lib/site-packages/contourpy/util/renderer.py deleted file mode 100644 index f4bdfdf..0000000 --- a/.venv/Lib/site-packages/contourpy/util/renderer.py +++ /dev/null @@ -1,106 +0,0 @@ -from __future__ import annotations - -from abc import ABC, abstractmethod -from typing import TYPE_CHECKING, Any - -import numpy as np - -if TYPE_CHECKING: - import io - - from numpy.typing import ArrayLike - - from contourpy._contourpy import CoordinateArray, FillReturn, FillType, LineReturn, LineType - - -class Renderer(ABC): - """Abstract base class for renderers, defining the interface that they must implement.""" - - def _grid_as_2d(self, x: ArrayLike, y: ArrayLike) -> tuple[CoordinateArray, CoordinateArray]: - x = np.asarray(x) - y = np.asarray(y) - if x.ndim == 1: - x, y = np.meshgrid(x, y) - return x, y - - x = np.asarray(x) - y = np.asarray(y) - if x.ndim == 1: - x, y = np.meshgrid(x, y) - return x, y - - @abstractmethod - def filled( - self, - filled: FillReturn, - fill_type: FillType | str, - ax: Any = 0, - color: str = "C0", - alpha: float = 0.7, - ) -> None: - pass - - @abstractmethod - def grid( - self, - x: ArrayLike, - y: ArrayLike, - ax: Any = 0, - color: str = "black", - alpha: float = 0.1, - point_color: str | None = None, - quad_as_tri_alpha: float = 0, - ) -> None: - pass - - @abstractmethod - def lines( - self, - lines: LineReturn, - line_type: LineType | str, - ax: Any = 0, - color: str = "C0", - alpha: float = 1.0, - linewidth: float = 1, - ) -> None: - pass - - @abstractmethod - def mask( - self, - x: ArrayLike, - y: ArrayLike, - z: ArrayLike | np.ma.MaskedArray[Any, Any], - ax: Any = 0, - color: str = "black", - ) -> None: - pass - - @abstractmethod - def save(self, filename: str, transparent: bool = False) -> None: - pass - - @abstractmethod - def save_to_buffer(self) -> io.BytesIO: - pass - - @abstractmethod - def show(self) -> None: - pass - - @abstractmethod - def title(self, title: str, ax: Any = 0, color: str | None = None) -> None: - pass - - @abstractmethod - def z_values( - self, - x: ArrayLike, - y: ArrayLike, - z: ArrayLike, - ax: Any = 0, - color: str = "green", - fmt: str = ".1f", - quad_as_tri: bool = False, - ) -> None: - pass diff --git a/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/INSTALLER b/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/LICENSE b/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/LICENSE deleted file mode 100644 index 2c9bc28..0000000 --- a/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 Tom Schimansky - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/METADATA b/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/METADATA deleted file mode 100644 index d7fc60b..0000000 --- a/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/METADATA +++ /dev/null @@ -1,18 +0,0 @@ -Metadata-Version: 2.1 -Name: customtkinter -Version: 5.2.2 -Summary: Create modern looking GUIs with Python -Home-page: https://customtkinter.tomschimansky.com -Author: Tom Schimansky -License: Creative Commons Zero v1.0 Universal -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 3 :: Only -Requires-Python: >=3.7 -Description-Content-Type: text/markdown -License-File: LICENSE -Requires-Dist: darkdetect -Requires-Dist: packaging -Requires-Dist: typing-extensions ; python_version <= "3.7" - -A modern and customizable python UI-library based on Tkinter: https://customtkinter.tomschimansky.com diff --git a/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/RECORD b/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/RECORD deleted file mode 100644 index 5f00a54..0000000 --- a/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/RECORD +++ /dev/null @@ -1,102 +0,0 @@ -customtkinter-5.2.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -customtkinter-5.2.2.dist-info/LICENSE,sha256=yXO4YA5iAVnLBHPrmwh4MUPg2e1TM_NQ_JMzaNlNng0,1071 -customtkinter-5.2.2.dist-info/METADATA,sha256=Ju0LVS8oBVdkzfvV7D4lrmRd_LASEAF5p8PeVYw6DsM,677 -customtkinter-5.2.2.dist-info/RECORD,, -customtkinter-5.2.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -customtkinter-5.2.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92 -customtkinter-5.2.2.dist-info/top_level.txt,sha256=wLXrY2KS8Vj2MnAIH53xH5gHMNCLCKQEmn2QjU9nDH0,14 -customtkinter/__init__.py,sha256=_eLjpybhQB49OORUMIU-op8w0_W4Gxus5AQi3yzQcjg,2861 -customtkinter/__pycache__/__init__.cpython-311.pyc,, -customtkinter/assets/.DS_Store,sha256=V62jh68Vv_RIJCoF5ONdK3V3mLCALLiUyBtNxORzAC8,6148 -customtkinter/assets/fonts/CustomTkinter_shapes_font.otf,sha256=-tZ-KwYMMYtshkbQh_vTrdk4tmdiQ_FLDFJiMXlkEnQ,3528 -customtkinter/assets/fonts/Roboto/Roboto-Medium.ttf,sha256=SsjgNgb_pMN_YaZRCiCA8fN6cFT0cmwhSIfTsj9y42k,168644 -customtkinter/assets/fonts/Roboto/Roboto-Regular.ttf,sha256=MZz_bnox8PKkHEddykKJCqXRn-FgF-IpD4wdThT3ZIE,168260 -customtkinter/assets/icons/.DS_Store,sha256=5T77LKT94iGaPcXe1CLsRu7MegVHtmY7msnhYZasbSU,6148 -customtkinter/assets/icons/CustomTkinter_icon_Windows.ico,sha256=EjTAF8hx6y4g029mj5PgZs3Lk9tGTVzvnXpb-DUG0ow,13238 -customtkinter/assets/themes/blue.json,sha256=yUF0cMFs7XpD1sSo4Cevpu3GLCTVrufEwtzRE4WWTTs,4520 -customtkinter/assets/themes/dark-blue.json,sha256=alf6b4-4lhowzmQpUisYDXbjr5uODarCWQWYQThqa9M,4514 -customtkinter/assets/themes/green.json,sha256=ea2Gv-p_BVesHiCAKJKrtEqWevFbkxWwA5zXXItyp3Y,4515 -customtkinter/windows/__init__.py,sha256=eSoo0x_4XkSok_BaQbtM-AtwMRu1za6MPhd6YfWz6sI,107 -customtkinter/windows/__pycache__/__init__.cpython-311.pyc,, -customtkinter/windows/__pycache__/ctk_input_dialog.cpython-311.pyc,, -customtkinter/windows/__pycache__/ctk_tk.cpython-311.pyc,, -customtkinter/windows/__pycache__/ctk_toplevel.cpython-311.pyc,, -customtkinter/windows/ctk_input_dialog.py,sha256=_mAWVEBSPiuBgISbXaWE8LG5Fs7hp0KOM-BmVfBwnp0,5897 -customtkinter/windows/ctk_tk.py,sha256=pvYD7mP9SXdVKIomRbNKt0Zu2pFsIOf3246DqPFz1Pg,15646 -customtkinter/windows/ctk_toplevel.py,sha256=jEaJpXnAXW6wsdeh3Tr9oABk39GSuk0Z_7OgG8F9Nf8,14750 -customtkinter/windows/widgets/__init__.py,sha256=DNohOpF5R2Ae1iP4wNpsDYkOnMRiVrcNdwCPWIxNWGI,622 -customtkinter/windows/widgets/__pycache__/__init__.cpython-311.pyc,, -customtkinter/windows/widgets/__pycache__/ctk_button.cpython-311.pyc,, -customtkinter/windows/widgets/__pycache__/ctk_checkbox.cpython-311.pyc,, -customtkinter/windows/widgets/__pycache__/ctk_combobox.cpython-311.pyc,, -customtkinter/windows/widgets/__pycache__/ctk_entry.cpython-311.pyc,, -customtkinter/windows/widgets/__pycache__/ctk_frame.cpython-311.pyc,, -customtkinter/windows/widgets/__pycache__/ctk_label.cpython-311.pyc,, -customtkinter/windows/widgets/__pycache__/ctk_optionmenu.cpython-311.pyc,, -customtkinter/windows/widgets/__pycache__/ctk_progressbar.cpython-311.pyc,, -customtkinter/windows/widgets/__pycache__/ctk_radiobutton.cpython-311.pyc,, -customtkinter/windows/widgets/__pycache__/ctk_scrollable_frame.cpython-311.pyc,, -customtkinter/windows/widgets/__pycache__/ctk_scrollbar.cpython-311.pyc,, -customtkinter/windows/widgets/__pycache__/ctk_segmented_button.cpython-311.pyc,, -customtkinter/windows/widgets/__pycache__/ctk_slider.cpython-311.pyc,, -customtkinter/windows/widgets/__pycache__/ctk_switch.cpython-311.pyc,, -customtkinter/windows/widgets/__pycache__/ctk_tabview.cpython-311.pyc,, -customtkinter/windows/widgets/__pycache__/ctk_textbox.cpython-311.pyc,, -customtkinter/windows/widgets/appearance_mode/__init__.py,sha256=fKKK0fVUHFiqmSZw0GZFY0GKgJGDs8A5OXvSBEC3qSg,172 -customtkinter/windows/widgets/appearance_mode/__pycache__/__init__.cpython-311.pyc,, -customtkinter/windows/widgets/appearance_mode/__pycache__/appearance_mode_base_class.cpython-311.pyc,, -customtkinter/windows/widgets/appearance_mode/__pycache__/appearance_mode_tracker.cpython-311.pyc,, -customtkinter/windows/widgets/appearance_mode/appearance_mode_base_class.py,sha256=nTXJC4vpwjrgCiaOv3V20xVvtkxKR9pVJykIkhWKFz8,2602 -customtkinter/windows/widgets/appearance_mode/appearance_mode_tracker.py,sha256=L-X-eLxWFhenWtHr7Z_Mp5msaBTMEIxc-hhKrIVn7bc,3630 -customtkinter/windows/widgets/core_rendering/__init__.py,sha256=212WNYQ90_4YY_QB6x0E-xCqqmUXsWegNPQ4VeXSKO0,324 -customtkinter/windows/widgets/core_rendering/__pycache__/__init__.cpython-311.pyc,, -customtkinter/windows/widgets/core_rendering/__pycache__/ctk_canvas.cpython-311.pyc,, -customtkinter/windows/widgets/core_rendering/__pycache__/draw_engine.cpython-311.pyc,, -customtkinter/windows/widgets/core_rendering/ctk_canvas.py,sha256=uXHYqdTns1LAp2GYadyBDcKt5PpNUHka_7l4aV1jqqg,5894 -customtkinter/windows/widgets/core_rendering/draw_engine.py,sha256=eeXpsYiCDOqUQo5Pz5nBHDQqg99drt4QDjODmrdee8w,91030 -customtkinter/windows/widgets/core_widget_classes/__init__.py,sha256=DsG3zo4hzAUmdFbt3aXgen0Vs0Y9-ppycKTIfrHTYMA,81 -customtkinter/windows/widgets/core_widget_classes/__pycache__/__init__.cpython-311.pyc,, -customtkinter/windows/widgets/core_widget_classes/__pycache__/ctk_base_class.cpython-311.pyc,, -customtkinter/windows/widgets/core_widget_classes/__pycache__/dropdown_menu.cpython-311.pyc,, -customtkinter/windows/widgets/core_widget_classes/ctk_base_class.py,sha256=PTxPeqvfnct-wuXBqodbGDxpfXJ67Cal201qJxCt3EE,15793 -customtkinter/windows/widgets/core_widget_classes/dropdown_menu.py,sha256=dC_SEWk_XQbX47NjLDyhsKh8YKNyPFndoIIxqAnOGRE,8516 -customtkinter/windows/widgets/ctk_button.py,sha256=TE_6T88cL8ae1p8ZOy_WE4inpxjP0iaXej0qmjcjbCU,27699 -customtkinter/windows/widgets/ctk_checkbox.py,sha256=h8w7SG_9oWE4x4_iBQ-qXvxTq1J_o0Dj4C6JZAqXANU,22420 -customtkinter/windows/widgets/ctk_combobox.py,sha256=p1dYS2r9nq7BFfidIbt9JCaZRB8XtjV4XHUV8nGpdGo,20602 -customtkinter/windows/widgets/ctk_entry.py,sha256=bxhcZAQt81S59UA5v9fJtsXLLHf9NuUy4qDh4K2m-Ec,17898 -customtkinter/windows/widgets/ctk_frame.py,sha256=hcyGh8OzB2CzwCb9c4DMC29QqJS9awzNzEZZmzv5Usc,9515 -customtkinter/windows/widgets/ctk_label.py,sha256=4WDRL_gbctV9t-SIKp1oowbvXB-x3CN5o5yajrOogxE,13106 -customtkinter/windows/widgets/ctk_optionmenu.py,sha256=5g2OzI6mexzGZxmrUStsyuG-MiihAr-UhyzVS5y5vko,19637 -customtkinter/windows/widgets/ctk_progressbar.py,sha256=k8aa_RUIVb-gNUsOUxIHAzBkw8yDgZuU0ar5JeRp4EA,14120 -customtkinter/windows/widgets/ctk_radiobutton.py,sha256=hEY0uDuStmkizlpkP8QsfLXRgRNexaj_JPM8_2Iyf3Q,20215 -customtkinter/windows/widgets/ctk_scrollable_frame.py,sha256=wKJI1U36m5FhDjIcuDoYPWbTQbLDtusBXu3c1UYQOzk,15121 -customtkinter/windows/widgets/ctk_scrollbar.py,sha256=cO6NwExutdSXUBSRdbVve9b0dvV9djUs9Pxetqfxfn8,13860 -customtkinter/windows/widgets/ctk_segmented_button.py,sha256=zKPj1J_ZbEXbt5en7vHdZhooqNIrDkr3DKo-QEQ3rvc,20878 -customtkinter/windows/widgets/ctk_slider.py,sha256=1xY9vnha-djmym0iLpBkVK30aCDw92lqTMOgZiJ4Hhk,18867 -customtkinter/windows/widgets/ctk_switch.py,sha256=aOscR68hoHVkmugnWMqTlsKlLZgGCiO1rfXkDOQSC0Y,23420 -customtkinter/windows/widgets/ctk_tabview.py,sha256=ieGuEQqUH7miPQWIkSyon7KVWdbqFFKW5k7oBv53jRg,21472 -customtkinter/windows/widgets/ctk_textbox.py,sha256=l-XEQQYVKMB7cTEk4h150b2s-o2HpRh7zHROVc9H3bA,24571 -customtkinter/windows/widgets/font/__init__.py,sha256=zYlSsJH-8rL77t7dkz0vXOofHh8NdiIuMQK4V8mfINM,1302 -customtkinter/windows/widgets/font/__pycache__/__init__.cpython-311.pyc,, -customtkinter/windows/widgets/font/__pycache__/ctk_font.cpython-311.pyc,, -customtkinter/windows/widgets/font/__pycache__/font_manager.cpython-311.pyc,, -customtkinter/windows/widgets/font/ctk_font.py,sha256=5cdHvujB_tfDlsw9ZRMiGBASvmRSg_WIbSF99x_21vA,3825 -customtkinter/windows/widgets/font/font_manager.py,sha256=jwpu61Z00noq0UWcFaHftAMRvXgmKQHEmQiDq-CrqNw,2268 -customtkinter/windows/widgets/image/__init__.py,sha256=pzbwlIAV4OE-CkdxJIrl1ELcRg7vbQKkC6HaHLGDNI8,32 -customtkinter/windows/widgets/image/__pycache__/__init__.cpython-311.pyc,, -customtkinter/windows/widgets/image/__pycache__/ctk_image.cpython-311.pyc,, -customtkinter/windows/widgets/image/ctk_image.py,sha256=uL_oJrlq8Z134qjiii44Lg03utETSf7rBJ6kgPHeYzk,5306 -customtkinter/windows/widgets/scaling/__init__.py,sha256=2GjeG2_A4gq8g7pROKPw6QR2mIH7b6iRDQvT26qz8R4,287 -customtkinter/windows/widgets/scaling/__pycache__/__init__.cpython-311.pyc,, -customtkinter/windows/widgets/scaling/__pycache__/scaling_base_class.cpython-311.pyc,, -customtkinter/windows/widgets/scaling/__pycache__/scaling_tracker.cpython-311.pyc,, -customtkinter/windows/widgets/scaling/scaling_base_class.py,sha256=VbzzA9GPujOYbEJjDsQRnvoY6v7RSitZwr37lZAkk_8,7060 -customtkinter/windows/widgets/scaling/scaling_tracker.py,sha256=cuilXEeSTOylgDRNf2kh-eDQShup-i2Nc7oOcLo3Vtw,8745 -customtkinter/windows/widgets/theme/__init__.py,sha256=iZ6T6O-v39hOLfTLuNbTLt0XA_raCYtxwGnmqNB2Lmk,471 -customtkinter/windows/widgets/theme/__pycache__/__init__.cpython-311.pyc,, -customtkinter/windows/widgets/theme/__pycache__/theme_manager.cpython-311.pyc,, -customtkinter/windows/widgets/theme/theme_manager.py,sha256=E-VtzWKZ2IXrc_hvfGUdj50GNr8eII7S_fWBk58xix0,2179 -customtkinter/windows/widgets/utility/__init__.py,sha256=STsgOQvThAoUarV9ovM6M40araQUDNU_QmmHbyMaRx0,72 -customtkinter/windows/widgets/utility/__pycache__/__init__.cpython-311.pyc,, -customtkinter/windows/widgets/utility/__pycache__/utility_functions.cpython-311.pyc,, -customtkinter/windows/widgets/utility/utility_functions.py,sha256=d0Wj5Aioxhb3qtC0ITuNZHjwfFHegUfK-bfkDXrrufk,766 diff --git a/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/REQUESTED b/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/WHEEL b/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/WHEEL deleted file mode 100644 index 98c0d20..0000000 --- a/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/top_level.txt b/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/top_level.txt deleted file mode 100644 index 3477701..0000000 --- a/.venv/Lib/site-packages/customtkinter-5.2.2.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -customtkinter diff --git a/.venv/Lib/site-packages/customtkinter/__init__.py b/.venv/Lib/site-packages/customtkinter/__init__.py deleted file mode 100644 index d9144ce..0000000 --- a/.venv/Lib/site-packages/customtkinter/__init__.py +++ /dev/null @@ -1,88 +0,0 @@ -__version__ = "5.2.2" - -import os -import sys -from tkinter import Variable, StringVar, IntVar, DoubleVar, BooleanVar -from tkinter.constants import * -import tkinter.filedialog as filedialog - -# import manager classes -from .windows.widgets.appearance_mode import AppearanceModeTracker -from .windows.widgets.font import FontManager -from .windows.widgets.scaling import ScalingTracker -from .windows.widgets.theme import ThemeManager -from .windows.widgets.core_rendering import DrawEngine - -# import base widgets -from .windows.widgets.core_rendering import CTkCanvas -from .windows.widgets.core_widget_classes import CTkBaseClass - -# import widgets -from .windows.widgets import CTkButton -from .windows.widgets import CTkCheckBox -from .windows.widgets import CTkComboBox -from .windows.widgets import CTkEntry -from .windows.widgets import CTkFrame -from .windows.widgets import CTkLabel -from .windows.widgets import CTkOptionMenu -from .windows.widgets import CTkProgressBar -from .windows.widgets import CTkRadioButton -from .windows.widgets import CTkScrollbar -from .windows.widgets import CTkSegmentedButton -from .windows.widgets import CTkSlider -from .windows.widgets import CTkSwitch -from .windows.widgets import CTkTabview -from .windows.widgets import CTkTextbox -from .windows.widgets import CTkScrollableFrame - -# import windows -from .windows import CTk -from .windows import CTkToplevel -from .windows import CTkInputDialog - -# import font classes -from .windows.widgets.font import CTkFont - -# import image classes -from .windows.widgets.image import CTkImage - -from .windows import ctk_tk - -_ = Variable, StringVar, IntVar, DoubleVar, BooleanVar, CENTER, filedialog # prevent IDE from removing unused imports - - -def set_appearance_mode(mode_string: str): - """ possible values: light, dark, system """ - AppearanceModeTracker.set_appearance_mode(mode_string) - - -def get_appearance_mode() -> str: - """ get current state of the appearance mode (light or dark) """ - if AppearanceModeTracker.appearance_mode == 0: - return "Light" - elif AppearanceModeTracker.appearance_mode == 1: - return "Dark" - - -def set_default_color_theme(color_string: str): - """ set color theme or load custom theme file by passing the path """ - ThemeManager.load_theme(color_string) - - -def set_widget_scaling(scaling_value: float): - """ set scaling for the widget dimensions """ - ScalingTracker.set_widget_scaling(scaling_value) - - -def set_window_scaling(scaling_value: float): - """ set scaling for window dimensions """ - ScalingTracker.set_window_scaling(scaling_value) - - -def deactivate_automatic_dpi_awareness(): - """ deactivate DPI awareness of current process (windll.shcore.SetProcessDpiAwareness(0)) """ - ScalingTracker.deactivate_automatic_dpi_awareness = True - - -def set_ctk_parent_class(ctk_parent_class): - ctk_tk.CTK_PARENT_CLASS = ctk_parent_class diff --git a/.venv/Lib/site-packages/customtkinter/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index ca64e16d32d4c57e377bd77ce6be7c42cd282871..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4239 zcmb_e%WvC88XwA(WXbQh9Va$z#}E0T_z|bAleCEKq;=Qv29dg13G7qgc4oSBc?KtWZVZe!vrSLf`?wlXOzxLBLaVO5h>DH|b4*hXGI1X@N%o&(IlxuK}K= zvjUF-o}+UDUk99`DS>a8^VR}g5O@smB3%@C9Pkod5?BFWrDn`_4p?E}MR@OWY?Tinv@Bh7_DI}A28mu;Dvi(?dSmOan0@kOY4 z$nwQa=j-~=vG$$nuoa{aZI3?(5#mQ&vv7UHyV^c80e1lYW63id`!Tc2FwqGUPq=fy znd@!}gK_4mrW;PRWDsCqNbL%{nEM9f{53&UWll+1oZW(>VZzILx5)0iu;V z7K8wBEbkRnuNbsh5GU0Y!Omk8>sJc^{J&2F`<{3gWPfSkZ^+*P|JWEq_DYafkry*c z$#Go+_NyFeW|_GgifJ4idW(v#@#3Q5K6gE4DSN31$7U7uxy)0wM)Ih*tCYlNLFVG> z%5Q(oZ{)sm8FzDx>+q;mcD4Q79(XBlI%Pe#?G($x-MNfc){U~2+x}wnSuVS}yu6%S zSy3`h!8_JC%Pp@cpMSNJ^H883l#N{ah}lQEU1LAz8Xj9JLC%7Y++4owdXD844TvGX zrK*N)c&eH%J?AOdkzjXle2_*ULHl{fr4y$2x)Vw`zpZs&1Ozn}qE z9lQqs99*A=`?-U4sfc=nN3dZ3hfYgFN6tVyh5*D~Y$ylJQ}SibAq5rJ(>$g)1;smL z%DI~rbh9!iBBMB5#3rS1d}9#Z#dz@qVtE^a)`(Tt`2r$NKM=lvTbxJLK6q_&Ao(gt z?!w<)1_rK*Uq6j6{v`bzU-9EBm9D{;$Nx@@ohH&hP5hi#^Al^8u7Q_FXDuXo8wO(W zpgr%H4*&3p`k4Zmr-;STITm<{E2g9A;5!U|ZL(lMChtF2O3-qkZwWt^H1AMka0eQm z#D`R|1SIYnS}PK_>XsqQZ=DsivgxT+Q-mtV4BA5FdKPt`%A>D#-^!^|Ipx=>>Vpoq z+BH>CQXjBdXN41Lt1AWY0OrZDp<@o|29%Wx?a&p*wxhAVXiinG)*kyo;va>L=AXb= zurC0-uN&BVDo?+*-paR6<=cLpgn=K>qNz(39UHdp9RHp*D6d3t5MNoFa;l1(#3jJ8% z;r>lC?H=YG&e9p?!I6ZL?UM1J{@~nlDy3wxP(_p`&tITwWk_btGxDllGStSa_zG-Q zSR(S2e}+S3PvP%&13Mw_KEC(e-l@Fq3%VSsCbPc@wW$kc6KG5lZf*va4Z63oe^8%1 zc=~WJt8VQ+$YkJ9>c&H3H4*nH7jteooDBJt&F9=dju8a3le)x-4EJS z^$1Q5$YE6tB90rh!1)uzYptE*F~?_@Ny1)HKq0$bL_=JvZpBPhm&U#UUFc zFW~WNp1J92b-3xKW?4P%`kS>1a6)tVSSP_yv#3^I)sPM}ORHT(bfB?j8D@$K&V=s` z=vllI?drmJOkJs2t7qYO=5h>v(AA{LdvK9nWPQl`kqsalL^gzM7#UVOzlLlS*>z+$ zkYR1`abyaxAYOX`pTMa}WK+m)qVSTn27bNpX;ctN6x)LIdH6JtR0yfZs|PclHlnWv z(E>DOuiA%10gLp;lxfQQ-&*g%QCK$Fr~J<##Zq-Yg|s+pktC_oIdIbUjwDXRuR@Y1 z;#VP${Qr+CWZbV)h0OY4I*So$OY+I)MXHb`KTH*}=7*_5Zuw!VkUM^uaB-Mhzep8w z-wzXN!M0{DQiaU^VXBZRKTP->m>SwQ&Mh|C`;LtIVR|RGzcgMAz8-n=CgBHewRIU{guX33~D_zFaDYi8XMY5vU=J}}?Rk`ZbBHN)BUX7>A{`>0-H ONlChOMlLhae*X)eesMqm diff --git a/.venv/Lib/site-packages/customtkinter/assets/.DS_Store b/.venv/Lib/site-packages/customtkinter/assets/.DS_Store deleted file mode 100644 index 2bf4a8e1d80bf4cf6e8d49a5371e207f1c622d49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5T32AO({YT3cUymUW-Nqv3QBK9=saSgGz1Ms==6*CbfrB$XOr8t54$V z=*;da{n4w6%)sooJ3Eu?epz-h03aHJ?j}G5031}pTnU>mgyu=-BxfxJM4_LN97d`W zL@Jo`Wy9ZOfWBP;u0TNyDNKGpIud)R>u*~0@(U0`NBhotK7a2S43m3%CSHR3C`?k< zeHFQdd||QZ6rHkj;oqpCpSIIM(rEY3XmqSp6nymC!AaN~wkpf}Do)#B-0SOru-ikI z^V2Zys$oM7;%=g2eKX;doKmY&9gVhj+?uR!k85(Y>DKEtx#POyamiU(+t@v7-9~q@ zdeplEfu~r@lEn{r!p_9rAN+nCsrVYL6tRfR-9QiSP-l1%t2jT&AP!lW0cL<1_;m*C zZReDKeI>jAW`G&^YYfo+AW;cDi6REINGK4^DJftO*jZ!dxy@0om8h4fB;=PF{0za4PQ~a;skn-&1?`eLh@QpFAX-rP OM?llS4Kwhg47>wAbZ*c9 diff --git a/.venv/Lib/site-packages/customtkinter/assets/fonts/CustomTkinter_shapes_font.otf b/.venv/Lib/site-packages/customtkinter/assets/fonts/CustomTkinter_shapes_font.otf deleted file mode 100644 index a8910531177d4d44e633433d6861d2316a62c0b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3528 zcmbW4e^6A{702)0U2s(-n#r~mO-f8BHLZh?Y0U)b)I5wsphKZl~pZVo12^d{og+NWu=l{Q)I|yq!t;^rmf|&WcUj21OV6~z2j^@!dW(>C?6^2BtKTA&|^>11SnJ*MZNjpwu{=(!1cUV@&Vpi>g` zf&`tKpcf|8xhPVnRcYH?JefsJV9iaf)#HeYYKux$TVvX)a&;i4ZR%;&8PiEBO=re* zGS=|Dn4Xi6)1IK`Cg^zydVYdVNze-tbZUZLm{8{;v(B~c!BBIcxS_r&`GV%4DPRTFxC)ut-puTx&tf?g248pL31tG~9r(c6Y+_p4gK zjR)Em+^&l%AQ9nVF?ZB1;g&a+nXDt};~yEK_Br zXaE0aO;_3XzOMiKypbb?9f#cpnWAj!U9{gqm`yzZm9Cz`PFt(isr4#X<*9tNL2bn8 zDpZ@)X63}O-+~3)hL`G6ZdE=r1Lg}+Gq+}b^|}8|&P+z?jZAh=x5)3|-3hI1T4}8x zzU%VG_W^>I8%vb2)M7knH6F5&ycRB+x{~xDlHa-ycYXgNLNn*w{c5S!sVnoH#jcXl zGI#m*9Xl&3J>Du`wZEpeu6|d;XZFNhCywv&y9UH63$}QD{->T^yKa4MUjBxS1%;b7 zJBzk#-B#>!m!mdKx<~iwgSt;2(uZ}wKBAB60ewsl>LGnx59<^9q&}rj>k&Pw&*(9= z*n*`l#H-$?Zm2tYm2TIU^xrLyS?Vm~mJh7Ut*zF}){kr}ZOyhH**;9lNNP%cAbE$e zZ6v(hK}7#vPGl!Cz6p(%!qNV8qOYB+b%7G6v=>w@5ROfjLXu%uU4Sz?_Az z8F63+`1kyNd`hn74;?Z}5|Ad65%8njBmo`)KS~_nM&dKzN2QSia>nEj86IP4oc|49 zb;v1_25BTY3H%f{N&}w+eu}t(cM+ckeoA(6gPb;TLdj1!WSFF0>Pd#d4D&9j=i^|8 ziR-zJ_ym|?spEP%VKP^yPV*1qQ%)Z-!_(9@Yt|1-*KLlTm z44HftEq;=t;0M?*)qE8E0AWFV#K*u7z*mhp@Eu0Lu*Ugo{Bwu& zlT?Y1p=>y-#Uh(ij z@O{J{t|UGLzE3LIBZo|WBj@v2oadXyLWlH_R7eF$5BOfLke%EEzK6JicM|u4?}cxt z^qTy7{w`mc<^Rm$kZzLgvV-I$@ZG#aw)0EiyNS1RIWZ0acf+?Gap2d4+xczqa=Rva z25$cZt#tAq9kQRqE#)LHBGG;>7dO9%MEi-|Tt<8ViS|nwyXAnHXf>Dd_-rA+HVf$@ zDV0)^F7RDkCZ)U&d>3&kmk_@IzDr8DR9-OoRfo7gjvM=o6o+(@xWq-$34AZRq?kK_ zcM`j}n0PPnz3>&wUK3woy!qevP=Gfo9VA7vh2&Y_9lS+~_*vi`#6|2RehzqtIJrok zGx24-ltZ)AE8|NJ*-cU?g(SPd@8Loz;N9SN6Blv;@gDGd;46?lCjXW9`46-B3Vzuk ztt5GpPtpRsmGdQ!TY%%3=W#9$Jn&Zd@(^cF4bQMM;Vr(!KXsTJFh_DoeBgcj9m(M; z@YugOyc#@o~rIo6A?G1w67Agl}40NV;nhaso+W2OEBQL`yA diff --git a/.venv/Lib/site-packages/customtkinter/assets/fonts/Roboto/Roboto-Medium.ttf b/.venv/Lib/site-packages/customtkinter/assets/fonts/Roboto/Roboto-Medium.ttf deleted file mode 100644 index e89b0b79a2910f0ac309a1845a9f733bcb568792..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168644 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 yL< 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 z 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 diff --git a/.venv/Lib/site-packages/customtkinter/assets/icons/.DS_Store b/.venv/Lib/site-packages/customtkinter/assets/icons/.DS_Store deleted file mode 100644 index 57d1d87c3c5b8abbd72880477bb6a11158b4f4ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKyG{c^44j1&k!VsMh?A&x92k9w9Dr>aZ;2Mv3z;+P*v%_*vaE?8mvFqjU zaE~Y4veuIREmt>Qcg5Wcqo;9lxo($>b-Q34d&C)a`sTuwL=1=lF(3xSfEf7Bfc0L= z_$W|T42S_S@X3IEA1c+bN$djs(?R1S0C7aO3)enN5UV+eO=1^F52ZvZF;Yv87$wr_ zuNl`Qc7c(O;y1HS-du7*DSkWs)x%MmKv^*$2Ko#f#&%-;|AP9<{NGQ~P7H{Ff5ku< z&9CM&J}G62MIr|N Gf`ND9zatd@ diff --git a/.venv/Lib/site-packages/customtkinter/assets/icons/CustomTkinter_icon_Windows.ico b/.venv/Lib/site-packages/customtkinter/assets/icons/CustomTkinter_icon_Windows.ico deleted file mode 100644 index fe8eeaffdc87cfe713a22cf4c5958934bf928f1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13238 zcmdU0i9b~D_kZr4#n{IZq8Matu`fktWX+N#TT!ND2}Q~hF?VPc*|Mb=SyC#bMGFRn zvX?|ELQ2TUHq4m$O`q>y@w+qgnmhMC_nhZ>Kj)n1Jm;JN0OGy=9S|S@njQdByz?v0 z`)q^-WCeJq!h3BkUH{$v_rYO#Up^5P0snr5MeK8fdTvMG06_2HUQ2Vgn9sAf`19O8 z=C6#zRYLxSeN9>kS^1|@T4l1X=y& zjvu_&DL=UlKfj!Yu%C@re9iwB!c&DmNe3Ggij1gk--Q3_3D~C98+mo_UXFZDo4OR? z(h<`i`uu*&*4(FI*&Q#xS=J$V<5p^fmFLwvy1i5LTOn74dyh;;HRf%SGWIw6fL_FPdM!5Z|nNWM$s}1RMl%0gHH7bOz3Sm<0UeJ0LrLAcK8V_H2*Zi{* z)|MTSzg41P1pLnYIF;JQCL|VHcTKpUoTB0lLYU1KXj8kB(F-mJ95v?<$c~g;iF+J zl-)tAJDDD_*7K73>V@~$li5sGGJCX05}l;vSmi-JnvrfePX?R3JGoHmvWdaZ5!Mf82J{u(=4=bKT|BHy`& zF}n6SGjYeF3xpWC4|I*YU&t{@rrD*OhmYTFfgyv-{71AaJmR*6xxe=~VwbmmPsxAm z>hVpo6bCbkeiu8cRZFTM!Sw(-+vxkaNWVly$o%OZYKkVZ7$HJk6hK@KOoR<*9KigQ z3tCoDs1#E;>HRY!;u^*2@2#`AkpxGh`rvca)!o+a2Mgug&3{KHqm$pYJIlD0L3A7} zj7{2zw{y}cY#Z5M>RmME;_C?I3~Jq6noaSQcYX0t;Oe^q7p;;%EtKeus`vvKuvJ(_ zvURn6u1RO8viooK;{J5a{(Nqz#@s~s%~|{Krz2^to}1)~CIm>AY1-{@Qj@_ZkmMP1 zFUTA}^V+idq8dT~DYcDn*h=G<@^9UBrH!_&+SXL$F-akUvmzPYBzul>s${I` zJ$T>OKfbNDv6sgoM71dNx-VhYk3C{U`^{LWO1k22!B~H_jZBis`l-91^-WltIu2HbP@Sx0Vd^~03 z!A2s1?UyyQw~t1?KrIxI!C^f^@Y)DD{QD`ZhSPFds1!%y_>4k8!qq9glzUR`j8l4e z*}kC&(*ALtsZC{`7$@zsQar7C1NrTp7TRe4IrS;yi<4^OS+NS} zC_MQG(&(5GSbq#cf|k>caSmP*Zz4HjY#1S(=7TpY_aL*1WXEP`i&uLey5`QRnVV7nknW$#1;b>Gb;!zSnbuWq!Ui*zS zIFYtu-si;MKJnv$_BND&9Z&|AlSSQ+_wjTpihy%MHMUhzYF-?v@FkHC-tA+LP@DCt z!WW`5c@#w8*3C)3pP)EVRt?h!ECjS++AaZbW})h|x*#s}1L>o}d|ch*IYn(9xzV1W zgr`N6RmgDR^g`}G_NR-G8U>mK;l%3Cpk0kQ@HQ530A3OzNOeA?K6Qpfc0{S-7+ca^ zKJww2KU#o+fbSna14`4>?2*Yk7Zr{pxv(Z$^WcW5Yj@5HR4+rfRY2uxpv=6_2u&yjP@1;eU!jmJpvJb`^ z|8{IGuJ(`i`sy^PRyI0G*Z>QGA>Z3W_hwmOK$W%~+`l*ylp%)JF(*qWIE~EZOI9zQ zj=Ice(ikQqsUJ2TN#XmrUV8l`wtV9|MuDIS2J)fNcD5AW zI1v#*cIb09*=n7iFel4dbH}1QR?_IdD4l~#cU}}-{|#_olL$2174F_%T#62agPg1A zUD%pu%6sUaW%RRQn_lLpigi$azP0%fTfItcxq69{+kBgtUv&LlC6usm>+;0eFq1*N zBp*2WP`U#Ri=jj9snU!%xg0Nny0s{T z*pVW~K($^YKU$1HnBjAaE|Eu4KBMiRFg;oBmf`so6yw%V*v)l~wJaZZEYkpNTeGc} z^pZeVVFHOQ)Rn0<8+9U*#T%H zFMJOFy)qh#9D~VOqznQ%R6xL_k7KlZ2l{QSRy1Z!568b{Z!v=C06O0Ea3Tj7wZUL3T4)`q zcBNm3e=}H{#x}uPHA9W4K(61X@tF~aTH@O!Kzb_#(m1=DHR-<(1G;L*Z_;CTXah)P z#vg9W#gss!(v2;jxhUlM@0muO`^&u5S8s`So- zq7z0rB$usSoGmbtVDo#-5OdP+4%+6W6yg0F(mqhVGjUT6JSI7MA;oS;9;8vw>8FLr zKbq#KbBhV`+~dn?&*i|q)dTFF6Qt7{MKD*UB1VG>kee{cS>zWtR|A8KgW~4n8af+< z@;tEB8|;x+5~4@gp0q(3E)TL5h-3(p=kI(L`(6`@k~)NwJi;GdjskfE@^*|;8HoHe z7C)vtYLm69<7-d!i)O@cm*Lu*{9`K)toJg_Vn$PqAEGV;Bqo4jf;(RZI+962(W4#A z_#%lyIN9Xvf)?wSE#uZst1hBAL^zgkMP7Hp?oz!F~_f)(&Y6`C&;y@Apr^ER_0Hx6+5Dmc8Jpn?|)923L2 zA>F~;yE^h{+35A66kS4{#xHRZByoQz->A%e?(j~q>sPy0=F6_MM1NMV_LIaR;y?k_ zxDM71Snwv`7lKKVayPixgrHwo4{nhU?m{4s`1AKXhw5u^o38;SAq##MX5hmdpSVUJ z@TM*uW2ZS|e^o-wj^^cNbW;)Jd6)<`Y=8YhuC&X#Q$+si(t)B|XHt*;^rfS!uFhdY zy;(LU=rev}^V}Tc{Ybn5dG|5qhe3IyD(Ttkpqm(C`1<75^b4qpmNE5L2rC~T3(8B(fYuN3Kpi1m?K9G zP*voND5X~mU4AYWgQq;*3L?_d_(rC3dIi73m{nN0>qv z#|0X#7Hju}BL<~L@9=}t>$>%Q%rdEQ>5$14!>x>75q*nn@?@IF%GJ)154Btm$9b51 zD@bKjBTBH^h^Ntehf$;@3NdCr^Js2B%!kmbkIdh%TXR;`xl3oS^yx3X8VF1dN_biB`>Kza@tG(ELa%KAzS=OY(p7$~`wD7}L+ ze@}bB-9dNVETu75scY2g0rvRZ!YvQN^j5R+kw+N?2}gMpGjdqs6)e5!EFYF20e@VD zP$wBwuS!QF$}`&OQg&eXtBGS*%I>9Tec4kkb+xk3J*DgM9laRH#H7hWot&ivdLLC8E+P6a>7*-GZvjuD!V&-(8R?qpZH9&i7 zLXR%r7+C2yY7%K%uaGpiXy%T&^F=vq0n(pSyx%8B{+JOJIeGZ(<*U1Uc7^tOewlFk z^RpmY>Ku*U5~dm6b2UidTvH&eMon_7c0)SxUTwokPQ*gj?h~KZtR}0jwy<{_uxvum z)}Mur?b=+CbVy_q0W98}PZE1lT_(JQ;XEv|_z>4OQS0nCzd|vXF!bTy+18M%T8HZj zFRr{!`MbyK6yvBDv&mnZm0CI4eZr`@D>Az2@$YTz>LVgkWh|G?>iS{%ssX`@2g09jR0qZjcp!d%zQr*Ads zr6{f#({GDH4XYzS?;UcH%$|`aEug+UhIcpDWi{ZJ+EoV4!vf!}*egvZuI-undxPDTf%L?M0t*~#3J2+Nuv)aoXVLC;P zV05GIkH7Z?>`76eJPDNpQZ4EW<28|9F;jqt3&h~<-}&kM;P%ZKlkJBW)MVGQ(8%Rs zDnHn(OVR!_XRb5ui?-T)@RbeEP&wUNI=&@Ps0dTdP$%!DC6U#0P#g2$Z<9-nJ-zI! z0JN#GmOU4)dcb2Zzd2zL#HplTD%T1gpZsK164>hW2h^?aJS^{^ z*(R>Yg3r_K(4^Cr;B};5T8s%tXVcP#+|_YFe_WkK#etgq#*QFPkF#FiqQ&$1;XQ!X zXW};jBNUb*SpzUCRgPf zGKXEb7skr920EQeR@#gx-5peyN@nVg)(vbN#IR<{gU!JGO3}=)R;Lp`Z6%m9x|U!g zEg5~ic)s!B4PWW}#yP&Ndfox0tN#Cr55D%>Yd5|D`}$$Sv+RH^&40HLgsS zpmu~JZAuI-`(zQj>LLNkdHxuO%;V70!zsHp+{ffLca7|wR0zkn`_%)a=W2KZ0b zMI0C$#9TIH6qC;kYp*G_M^yMx%33^5$g z(D%}Fc7(FIR4^DQibQ_rC-lk1s(xjnk%=CTDJQyQ{^#Cr01c6p4O*S%CNxHK7gW&Z zIcHVqk3@MSm0(&`rxW;fg~>Jht#n-g$Z8m>)=E0R$)t;ZlsNSO{NcZculRv>_|K$-oAcKJREV~yfFzKEVYHKh1qY%g)9sgDe(LQxK0oyNZMR0S^ zc-r-Mee7(3{4GD?pkM_u4kj0zH6lRt2OtI&DW4ob@dR|yARa{W!oC72DDa=ee3@K1 zk0Rf7YwA=WoUS`kot4zDOIyS0n|t$AYYVa+jYvWyIhcHX7t1$BCBH>@e9h{ha`hUq z7k#PAo_cWs9EIr~FrAcsM`?>N>`R`dToFKy?)u!ZTZ7~XxGAbk1dK`nH=YV@f=5FK zK}HCJCcRvNy;f%#);XDgll3U*%@|$bx{k zJcZd1_g3@J$w2e@>0SYo@4 zVIT|x2mvHs;^g18lNh?bASi!Wrb>X2iBLB!9PrdJs-e>s>q!R^nakq1W^7%G8sjF!JAlF zpvw<5Q2(0+g2S&2LJJOf>(GHQI)cyOgI}Q+G zx)TUj0p(TxpuG$|+N?^(19xiJsPe|fu|8#D19I_28^j|VkkOIHW3N2jx7^G zif)VDc;g9+16OH~AOiX~_G@9qz!zhdo}-2GnX5hUWenhHJxT*e!o*vWg` zN)XV$aTyq6=m9+Y6N+_(oJ)cgA^HhW5wMF-m=Vhqr~Pmp?Tm#nRK-u%6gcAfQE(WM?CkQBlXYYG~H0XM-0OBu7 zdi?>h1cQ5k%;i*)K1D*7%N6EnF-OL?eVY50Q;b7q#h`Qzn6Ap}O*RyC4wK5|899vK zBYAEmM^3?MPys8e4Az8TG;*G|RDzxoP6mV!(r=G@UKIn`pko6T+2Dm$@Ad?iCeW-a zoo7VAHq<`ad=-xm!?ub9D(1PmXu7-sM@|m80@IubBw!okU9E^Q-5HdsqyvNwIO1*Z z&QJfBUhC=t)%fv7aV#>m7yOGmg7oW>+I0spbhU~OH{dK_+cY%N^Au2|_tOK-L7pr! z4`@}2Jd(kB_*A08yR$G&GF{2f2cnniI)FDxc-RUDE}&>00L1h6#wt~d0TEYHl{t^_ zjAXT(BIB##b=cL<$B1uq;Kb({-%}_v!=vj}Ji4FuAfYi62GR?^7j+0i`meArU|{H4n5b9yYqCLEdgoreEW?l4031 zYQk})xhy;o;6rMlpf4!$2NWJ6<-uz(58Ki`BuD6DumF=65mTy{B;bVTFDS1>!^;C| zxtsIQ2g$l9QZ@h~%Gbew8R-$B_Y?4P1mVsCJa_4mtA;kc)k{mWsA|<|TRp!$Vu1rH zy5RB9NFE3X4Nr&HWO*zKpS$Jd!Vhp%z8WD09*u36NowUK5?^v8>@JRv|NI9MT?-(m zB+|>!)j7~p4Vo4Y)?a-I0H%o<=yloHC#{dLpM#Rq1`E<$bRhQ-)8{+ro#tv5$RkG- zkQ%X|0(eajeH2aChe@6GNjRjXVy`t0k6Y_A{^=Vt5eUfAYbjc?kc7RNHBi?CgELhq zk{j&x43=YoBlQRe3&EtcB@`N8r{X2z>{m@mDf-$Hcn*swaIF*P8|IB!a~42-9!0Pd zu$4l`3Ie?|;JzL}JfNEjit>r1lFt(4RP%#MGptiBx=2Xi!Zq%%nbYK(VLQ4xZDJsK zJJ7ui(N!^v-niEVJPV|w23h!3Z>zJkJx&u1Sbqum{sJW)^X){{6%!nFmyGWqzeKX6 z9(Z?41q@5#izR)KgfeD7wBag>?WU`|9 z%((bK3I?JXW03|4?QNJvee~@mlsdFX!37muc)U3YGxHg$82yQpu~ObU{^BfqzSaNL zKx0B5K83B^%kH6jh4I0p8a}WUTJ)!@`y&y}gF9 zT$rC9UONk;lhAy_Z&qyB^{MAld^>u+H5{2Dl4ly_t$#kWStzoUq0QIZxdDe{m^T>m zC(&O{c-wFV01?b^xc5jxAwBE!+dbThLY<1QVWcgx7mG*d#_!!_|E`zIiTF?}y!%u4 zGTpI5>w?RH=+XP!Z3C=3jP>MT4sXMF2WV$Qw+D2cha~Abl~D zgod{XKi0!4kk&)-#E35v`oxAm?^BvT-L}akCTpS$e~a90zPF?1-GkpLG?AKj_k*P? zA8(#`Z}>3NBfVaYbht*k^uk<{KFc8e4+T?-QP7sO4WGSvgtr^@zR>7p`>F5c z$)B3X>z%uaQ5o#lcSdsL<5>bz4bl%YPL3G6-*92cI4rS_L<|+AACBF$fmD1XzqdWB z@AbwX?2P&@Gefa1vu}6INhoTGB%U7*5l@|2tf=z zXX>{36-um8`pAqG@`V=`X&Vl)#J2gy+6`ZeP2N|O z6QBC^(MoCJTT+G~qlTvAAg`)GxxOGLxpSpLscOwNBRAo8dm86oLb25L*_dELauEul zBIfiPuu?Y6Z%!yoASr1O1i<2)6^0(mTc~A#^H(T+q#rip`TYnTjS`f6e{c1~y9ay5 zUpTqz*m2i&J_a4_=@`DQKd1AiHYitVq;|9K;uBL$UJhEgj8sJ;WVq6gqny#m8ZYV! z(euE)0z61fMI-Wn3b5wuVg^zOyBBg`!8-Rh?3Pn-p z&fr0W21N5DlaigX4GBvH=J?Rp1HlBZ7E-u?MAL}m@wFR_b*P3!k19$3;7Z8xZ}I}w z8XjQg7>LP&z#`iDvlaNIqW+6aAZ_6jIv%xE_lb`M9=7mOYG>JH%*7fm7t$Xa@7N?> zhU8xl{QUl1Wz=m9wo-nM-+y9xNC!F&3SCn*G(O)oB5U;wIV^qt2W zy*WpHST-SZ1N>1WTF_b(bJP*q7YBLY?&pdCdKHRH9N!Pls=aa!PX;8rt_>S0gBN_v zaYA=zJ>KUeRAi%F2>25v&S`hR)d1CVn*nPz0z69Vw&tZAyGTOdu{g=j5iheZUc?+( z!g~C1DeZg`fIBv5PEM`WL+cv7KJ_?87mUV8I7@RvSKx_Fn?*5Q#q~V@&^0-c9;=wk z42QFmKW3D`3H1b~&woy*k1!ve(n$A!Z6EF$eUpxUFEu++ z?vyql8Xl49EDp5wGFK%ILNWh^eTgwCq{Zn8-wiJOyc9dpOd{xT>iC!d$Z&%1rc zy+rv9$(!mO2K`q&z<|X?3LYeEib&I%*b4RIwme@hOfObxezZS%v0%F_nk}|ZJbB#h zd(3{)mW4})P~_v_qA#{HA?NJx{N(fzboFnB48!o*eg$OWZybqN`=B18AY0x#Y1-tq zZ$s33AqPA#GO6Hp3DXVHpHnvhUfqCK!l-V0m?`dQ?#%q1pG60f30ySD=-h16Yxaqhj3cH+Bj2Hw6|2kUE4&zH?2 z`{|!?&t&Wk|846t2Dt8^(|x>A0Lk`+CJO0o7RvPDGs*8jrne%Qw|Z6L_|B#k=MM~) z0>cvPAZ+VnS$s=8X8amAczqz}}$Xrl0UUxTARxMBxc2$1V}xxp)n zn8E8%pCM*vL&oJ>t0ix^CnJI(N1`>er>)_=C6g8icMG4V`k( zldRQioN#GH#z$^En6&LDI`mrnvS=E&gHSR+PB1+80I4Nk~r zKvM0s_p~qz-sX?Y79z(0-P(F#_zy>-l^bF)@2lWhhT66&NuK|6Bt3d;iJ^-SND;nT zgqUuET>``4fzahMr!!>Mz*{sjHKs5A>(6fJ(P^W^J7{3(T+v5qrs%^S*qh~! z=3AnxaKCstYsj8xSfre%4mO1eUOTn?Y=qr%#+Nx$mDUyoAB)E@Ccbqjawniudg(l7 zo*QX*fD=bYzd!g=JWxxeuQ6Sbsi%IoheqDB^};yM9ZXr%FFw=Mo8u}?0faJ; z*|CDDSlOf=;$Avzcwq(FWB^M%H;t(s&Gaqkrc6xw@;0>ZmL~&I_M4t;tQ(_;^W^L8 zL;Q6w0rg@@QiK{EVU^_IXp{m;nE5Am6)k8lq@%x#jHvT znZx99ci6*$7Juebufw)zBz}!GCUHY8#b{?2LegceJ0rrWX z`~-pm>cN#*XiM(lEyo<7zshr#BX~(q7*C>mh}~|iTMm0YxA5XuZKGLvHe|XiPrupd zEI{ZhR+I&U>$o47IqzDse?7lz`hs zK-m5z`xx-*Kw@j=c|}21ln)OZcL%L?jO!8QJV!*rM+DhQ#WTvM>BExF`$0CmpQN z*Z^6reeK}?^KUZ&pse}XPOV>S3%@96M~blTa^=O>ZMO=bNnQ+C*CNsV(oa8)-V=v6 z5OC=}0C_Kh;jH9`gDq!B6%q%!!lc*T7ov+-f6^zEY`g!7FY%Zf7TPv=R(@jBu zog$k~6q$<6@KwA--_@|S+YDq>bawwe3IBv;AwnWzrFYbjILy#H_+V9y<+2+Bh5_pt zU+wXuo`U}EyYxl>%9-4EG{2idAlWH`(czg$;b=3pAg~KU4#QrqbfJtXqdaq+L;Vav zJ&MTCqL0%hqcwu*ecTa|h-bA6&=GCq} zcZR>}3|<*9F`xk9qD#A8Mt4@NpqOvXg|NO!H%pcRaE~R>wi=3iKPgjwPCl#TTG=Db z-WRLVx|koPmGXnIaxPW`WK}j0j)f3D;yjkKAboiqOHYZ_id;4xqa>XXvN9aAGPu%CD z$tz)a=NR_FzSX*k(Kam@G{DJxcT4N{LMO_#-DZ_%(#-ae7q7EU$d&^o=PlxA=(vYy6>hreYjKw^4m#1q|~oS zA`q5rF#Va?UxjQi^u)B78Kc8cP~0W*R*<4W>;AUrF@C9Q?MO{g4|{*`8g+F^rzF#Y zuwp#NpC_Bt+O?;D(-vX$Ldjpb4Rw)ON0y)Ub9u>hb3z{WcV}2ZN|@0!-^=ysk2fe0 zl>F5P$|bl_r-Od!4@9a}_QV$<4SvpHBCfK8CC`Q2sD(%_-(wUh^((~$IMl#&0qT>Z zEd>GRh7UAub}YK&%QF4Q4y|>HrRX)*=(KzA4T>uctIhIg>ZITcYkN02LlwJ`h~xt^7Bf! zW?&`1y`16YoyDf4Gw? zN;@!e(xFWOrWh`nQWf^)lHW9m{hmKMlVZMIxS}3<>SN2Bea3w)xxn~<1XZmDk-4*C zUA{*lqy}AG4qU{mlgv|7ry|E$FI}`~52>fV^=^n?Z}^s0w#92vjQ*wZucHNzR#dOL z$qBDH;p%L7Gg`$1@0^BQA500mw=@(YXz%oq{aj6wIjf+*;0^E^7_Tfu4146BR9=G} zm%B`pC((t*Yt6cuSz8qi+HQICc71G`%hRyYxA8>hITPBqbCv+MP)a|8ch)4R1hbC@ zB=oL>@ib`B~^yTXuSdMvgas~@ZQJK{XrDBfDLYfa2aj$=ZM zFlDLJ=bnnX&XHc9v?%{}HGPTC7}r?_jo2Qu!>G#O@jfS_u1-C0@r_>}owhX~4v(=0 z`2-w%Qzy0D$a{3|SpsT=9L|g9ieipD;=Fuk%_a^MUmX9$sAvr=kG?SfU}ZDeNa2W0 zTJ3OpO`O;xxy%T>j5zh1a<7MQ=n(=8n=AUKp4536xl`*{tl{{xOV=a4sBzrOt=3s- zev?}7fpcgP?0~OMB%zaNLr)&Oz9;J($y`+?A00|hpPxS!Dqk1v&}3$z9gDZb{FQ-yG)SInZo=>vic3c?Y{3iK+^zb3bYuHBrDpgYG3_37gAE z-f%Ht%=-T;E?=Gh61tsols}DC;+fItC!02l&O6w=LvQjf$z?@??dx?m2;EGE8p2E_ zj2`J0-)f-)G)mI#E;+~mwdVr*u9MrA^r`g+%c`QhR5ed%cb3y1)eCgS*-&3{Xa+02 zqa~;Nm}hawIT31&6!22SV-v-7aCM)ZBmh0+YhAINRUOI%t$zvm>=Wr&%V)cUDY z0ZrP1yZoMnNAv!3fJ;gWntbLm?UFV+Y&6DdyijyH=S4!#*lsQxKI}>BzEpEIsoz?@;JX^_dztK(o0)}5?HpIw1iDIB_FN+488ah#DCLc z>D7}rp|_r#lzJ#Q4D;Tb$qPgBQ7-Qx2zK&1%mBZ<_>01ZEKh;FBZ?>%Na8-mo)<(x z2K`{o15uP=KLlRvplbMy!BEAE;I5ki>;rVwSg;8bAP+#c^0Bi`o(MH+S9caWsm)@W z=>U9-(pqfJ>!NQR`WE+|n66Dag!U&|LPe{$^pf-p(}pljnXE`>k^yP6XPXM;C~2z9 zNtRniI@VF{Bxyd}K9TN46h)-bsC3lOP7}>Y)TrF|TEzN6JaU}WCM=(jM?N5iTXsH9 z(kvMfIIfLfR=ZbHQ7727F2RcaJBe>IpTk(mq5Tv;1NIk`$5@BS8$Z;3zzErB6vmLOFJR2;Lm&_6@qVsg#B-^8nzqGu~a;rGMuBC*@S4&+p`K(qlvd1c5?>3 zHac@FIw2;Ccwb7976A7^`_+u1q*GAwk4}q8aWI;SPKgrKeb70Y26=Og&kfc7bV`Yt z7MQT6Sb68L5%LF^4v|DSfkbQq7qNTDPCwzW;1C_6Q*?=L_;XF#YAuQ7_(rSX+$X(j zpY-m1($js?d-h51-6y?opY(pwB?K4`6+OGmc?GP@k*8#m6M|0y5wB4BghYJ85uxe{ z7x4=RpcW7g0;~`Y0SrDR54lJsxMa0a0gf_|n$0M^@n|AFwfNi{g2$|c=HtqANPMVB zQ9x5ddcHN36lED)t~Dg0S36cR)w8c&Eq zD4v>3OUWqudnh(7#%4n4j1p3&#gLGWWs)G1^_iSQ%;QZ{3_3Z*$I^+kWOx;@sE7wm zO}y24px7{-o)e`aQB|?6jIV-OU&dzEC(@E&u~nLFWn4}ruE2(MOv1)89M}=_Tf2b} z2jIBp-yMZh=a1aCM8OSRd|pENs#GD_vL36EEO9H`OXzuJ^>WbmxJE(A#pi)_st9FU zQLt}pz|^57k}cyXaT1WVS^5&;OXnk5vhAwJu_0SBo%t_^k2JJ?YuoywPoXtbHjE@bW-OtKfxNMX9#rfm+b2`Jh&5)sV8vs*&u0 z5?)>|kp~w4W*cDVlI+29+7iC`Bw%!hN`2*};1m2WAyB`9Kl5R)PkCu^G=+?0c1cFX*D9lMX(Gq%tiQ&GLaJnV* zc*9qAeoMI541f9A+`mZMl=N&eEi0o&<=sKPx9?WpXdi!fV5s-@-M8q>;X1=9XJ$po zpgbQ>#TA~Hu-$M%v`LCa70=?286tRPVOBIe8}Y!$mmT|+{MIOQu+&m!rg5OuSjHOU zw*;Dl#fI|HfGyiXjgQaB5Q*X#nPCJ{CY6e(rVJNvh9D=i&v5b>iX>b@!;y$jDuy?z zC{i5k6=j3YN@*nxLDTT@=@cJJq-B)hj7};rEkQmeiBU!5%@8gd9!Zqri_r;8NvEXf z1TTw9IAAzrF)?W_5?deK2NF8AgkCG5J4)zz61o^OMMAfc&>vt*L2Xo)d0xgnh^a;C zdHmNu$Igw9!6@Z%5yEaVl+4J{iSZ!}tBG_*81GHbu#`X?A5k(wJd+&ny>a#K_~_Y= zj*jup&d^ADQkjoR;&?}A==#{exPl%0R3<*&J}0K;#&5+Z#^tyow#`OkGmx{$KPIZ*rTg477sE>>^OjoM3&g!3T(D{RaEc})JRo_H#r zxnHdnaa^;+%ehL^+pofVUwD0gZvFn8 zI{)ZbLZaLi+k3Nk>UdG1e>SFm_Pg&dXmxGN545^Z@~v9kbrs&&)a%&7dTgOU$nUv9 z8*mET5OQMi)S=ND{q|St?a3egTIg)eWJ@sqiLd|C_*f&o$eBngxjHwT+;N zBsYp8us{*V^sy;*EdApJt*IwBqcvS!{ZwljR^iPofQUKn7K*?EL=4(^6fwu$M-f<{ zh>$)as3VCVTeT0mbN93luB-xfTZLDe0}(PefFiH}5jSo3P=w5lqX;ZeM1wwfPaTYX zzoa#E=1yr1pXMKE4Ff8?@#O3HqxJYBV7+3yjjRv2&yf`iWUVhBzyq!6%4+-m2QVB} zhvPriYmHsGn_AciwF8 z8VzeStkN*H1)c}gBQ47(v{UES=y{EvSLu0dM`35bQMBsQYqV9PttxHB=8ESP-(1wDqKId~7s03O_YNGI#H_3nDtI!pT=pw~_^J4eWT9#MBXELk#lAHj0Cl-E zi%oFsM6Fm^C;>f!6Mn8|WFylB+{$MGx2RX#FClKcvU0v>gtzicptJC-MPV5N2-xBf zsNjL0cg6P-s9#we98sz^Xu&2w$g^@Wz^!}CpgXIF>Wr}dF1bi1FIt)!KImF&S%s4k!B zt^6z>su>E~Buw%o^gjmRLdP{P#;2wg))8-o-DLRSJ3J-NLc~icVYlH*Mr91-P6*)2 zwBenXqHz6_no_3AqBTZg7LVVeg10z5hE1Fgy9~ROo;O^O9b}Rz!)ulxJY_g$qryW5 z7YvuI#A7oHZ~p`M!Y=7D6w(z0=vC4&1n5OfLunAb(C}6OVAyWYggqNfRu0DuHbvB1 zA}mV{cPyPu!c77QL|IY;%5q&}Hw@5*Ro3zLPk_bX&w6l-=qc|$0)SuOF!xsH&L`4K z=znF=jF6u=SPjUtSVm?zC*fK`{)v-50TLOHw8zqUfPbYI64B&@5WTqAu{BB9oL048 zNTg%YgnSVYlLIZ5(a#`z$U1)Ty$*G*hdS3nU0SH?F_A7n&mz6>g{Wkt)J3?VIW#53 z1pyLx8(p zI*H&z1T6p{ZA;JaaFYnv99~4t{MQKZ<~2{TtD;mjyQLmvbxgoTk#rYOHeL7GbV;}# zi^qR^ranfV0?aYY3q+{bv~is_W>4m-RNA;kyENLR(k|9fyH0DrYs_9zY3&+4snL@v zJ^9O#<5@v(ZqZM*=`B6_sdk8s`iYhwZZc2^xT-sTB>>(dz))PMAfCVrpP9COH=O-C zH=O@sbwV8;V;S5Xjowk|9ZPIWtJZQsZ|%@pdztXdrd*#BVZypnajs;@0K3KS@!V{ zfP4#I()-)R@a1kvgRgLuwC&lv@7b5Nm1C3>Z>7T%TN(w5u#@c{!w&bKQY$nVe)iQQ zi3u?(i-ubeWkpIaz=?&2hv8)VNk+p$A#+#!4)DdAt-GSM^(LWLMpoDkbq)V?{+}=X z`O;b)d<(Rii6w3k+zD&64wguzb(q%qpZlLxyr_7}e&)pDsa1NciM<0YII-DM&!%$g zpnbH)r{NPL@TO0wN^_$XebXDf~y@2e+@t4T+hE&uQ@4Qlrd zt$jdizFF`fftNJ5Esy28^3Hs0wJSgUm!R5pU2D6cofs(ikibtqIJMlIv**V0U90x| z$3OFGN3V9OPiyQi1dyQOH&g_Xppu+uUGB>@_G_)zwWb?|DkL~W zYU>M!5j#R^LRlva`EE9)g?hB=j|$b;UPEf?HYSbD+*UBewK{tW!~)}--C2!GQVzT} ztXhCt7;A%S2zz%2%w?Gu426S+3+@Hs%8WT3^Ec*$hP!xWW~N*|K-Lr#j12*HWe3TiIIQU--(| zbtQlHoUf;QriTIBNow!is%@I{y&wI3=R4GxQj3!ZMbqW5zk= z1izKFMO`!QF*otsqlGg?V@1SY5cSM>$Gjvz9W9>OF}7o-WURzQanv=R)~&HpGj*0? z9j{QVlPl%CT+!P$ih2kB)n{xcYZ{?~u1_#H9JDC5XJV0fOtFp5%|_i zDFxR#UVy+SCddk5_vjQi!wrREp{pDZ;gU0>(<9+fG!nbo9TK=R(U2fObR|Teo}J}F zd?*&?hT<%jNi{3J+4w9o$;W3HHWE%S6Z4F~C6pcEDK0$COy3CcR|STfnN7@x)&8oG zP6wX+7wF5sfZ^sS9O5zaGcfF9mMIw2zch_mIU8qZEuD}VVyqBTKw@kd!`jDa&H?EK z>5!9zXbd?hc0UZ4i*s{@ToL>iPMRyyO;S|0KRfm|HECj9uN01XSobT`n3pXCSj_Gx z@kOsV#&!^&=M{Rag!Mw2k1YmRN@90F>`vk<0bd#M`M_6Be5K&4Aika8t7H$bWt@X8 z=Nyw(5?cYS?jo^O5L=awt%O+rrr2E&yBof*3cre!_CriH@$H7%18g-{$OgEYbS*Wn zxW{VQ10=l`zM?MeuLFNQTMu8bhihQ>yh6PVBlM0wN@I->+psBiFWacMyBBH>vOzt( z55oIyQ#Vax`vE1J6boR^!lE+(&rm253xsB812-ZuHhu$~#8iL{@za4sBoXB%LVO?| z3tS?JLLd}l12duUg^^}bxG&BJSS}HYL^(DPiA~1&nGj-ifM8i5K9>k2rnmqb56{hT zu>?s|OLp1edlbu@z$sQ?J{DGN;2oV-=m|jZ;m{1HIKqhL#OoBoJjca|znZxY3xQ=4 z(@Z!X6B7JfI1%R=Kxfi~(B;L7%@Zu|L5~&Mol~r{A@(ML^NNkstJrQt*u<1#56|&J zoLB5qT;%FhLb3B)G{Q|PcC|^xemx@0g`&`#IP^af<9Nl92u*X7@JWK=nuzl($E#KC zn1ULjSW99m5}uB6f}r>fy`79)o#VMoU;C5;49kVWiOBU(f@5G{;{v1312e^ipk|1R zMP}!sWaO0Q?A&U;?eY&R^yF0-rD&WFn|1V|C|u(%_KfFoK5s+Lcl6wEnf}ZKHDUYdC%dM%f$F@2RFFK7 zuTb+-RCYer^sd=hFXY7uPd|%h*7B}3HwSB5q!^9D0iA-7Lo2}+K!`9Qj3FVtk1P#o zZapW4^nS50dQ6d)wrILlp4hF0pwEbn!xRCTX?e&9mFpo) z(?6f&tTd$UGK8x15RS873nh@5q@Qcmnr|hb`LbQM(AYnI7ko)gb`H(Y7QuMbYN1^0 z`GeYQgf{E6nzLPqug?x^e&gCRegT<_JzCCem-WCGG-xroUjS|8FXe?&I!5J|VkzJm z#lwnSr8p>`2&yo`B<5$iQHXHyp@_gS9M8x3$aApPBcH({=5f(SPIY@I9v29|7r+A( z(B`XsiUlhBk95wsu(U7nuuzI5t$N0m=XhAN%5W; z9b}$9eX)0VlsR+$^vH-pGfX5FNiYnLE0;%v=W#{zxX5{2ze*7U^qvP+1Y{P;zef+J z>A#biiNw;0F5=H5gl=XMz@JX=F~Fx149^LX1=3rTtazj{iVc__aI#`X6}ku|CS#^J z7>zP3HeqfSxe72Cbrh7H4DjRVJi@eW$IO6m2h|}*Rw|eXEvKY)Qy6B+JiL`VqA9tbCTI&P|I7<1JJ@zo9%Ya|% zCj_k^ws6r&g42p!6{lfV86sRTjDXw^q^n!MT@D`~e?|cLew+hQVJ0v$Cxj-(hq;@H za5O&0j`zf;iQvMGk0j>U$lT0$&$;eP1Zt*zs2ZGn;aWCDbBZoIWEaQ2!0@dPF? zSLY(*%`leN$InM5#)U|NYnly(r(wS!jKlg##Ag!Ikr)hAOBx4S!XPjurkiKy`Ge54 z1vf~5&DwfFVkrC$R_y1us12HO6t2<1BpsCK{W85@r1$^EPB|)Mx@M(bq-Ws$)xNHW z*B>S1v(wVPsJt(##sXZYYoWyb9*J&~={AvWTc>x)bp6WcLt3OyOY~`(J`J9Ay7J!P z`w5ZmkmwGX?f}o@-8HwZGQBHRU5jp2sycAnddHIrkm&MM^8f2hB)NjJE4V?K z94At4?`s3E4lE1zdgQ97BzLFm?iAgfTNW5FL5Vf@fu#Gu{n53izGPFM)O1d6Iw!gN zWp}^m?te_XUvs?bSZ-SJ$u(UPeNv`RiuB1;I(q-Tgj{`4A9@&lc%J|cP+`CU{Xt<5 z|DU`M;427;x~P{evaMu^j(Q8g(sLPGLKn!Ov|c7pK3zE5J|8l#2d3em9Yk?90!wcz zc2baDFp3#=Aq6Z4JB#>yhJ8FR@gvZ00S73+KMRomI)DWiuA_8rl3^5LZ&5JRYxKS( zy-%VKz~qZ${vF;s&NaF+3D^&aACT#QNC(K0*>@izT4lObq+7|7sat_H6qMkbsi(+KWGM)4?GtLNYKLf zLjisOfMShCCKEw384krp2)ck32hziWy;(qwMRN|#ybK8f$^f^hU%QI#bly9fbk&Kj zI>i6}SNp#`cxUi7`P;Bi?s`br{K-gF$tS-AAE@qJu0fRg2=8U@PmJ=@m-+N1^ETym zRMc8S*Vx9A1*9nKA$ef9bybiShwh@;i1O2{+zZzg8t(E z<+K51^nPimfiC|%^fp+)p9P2S0-(46Qzqlc(}7L9)qpA^@g1061~L*Vx-_|jNlTIZ zA*{(p5Q?9`oJF8h;KB)2KtL%?52x#U2672Fyue}ux76kMH3%+L5xm<%?zn=b)&T&U zOLfnEdQDF~C&Ht!68x(ck zeA)adhQ`gGsSc!Ff)J#klWN#!tZ>;Xd+Sn-`_~%JBpc5>x*#=<%8jEKTQ8D#qZE6t z_J6~hU6;CQvhfvn=491ehjogpCZUsuTpV7>N`X@8XVC;$3uQCAc-U=cZ3IppcKHi z3pP-kQkvfUsB){8PACW=6p%A?ljNkYa&g%H@bmn6=#f&Q*9UY1H*t_JXjR$Nju>}C z+iaw%j*^Z;rKjEsp({9y8L~1Bp#|7$0z1pB0D9sH>Li0xqn`w z7i4-tq!-c^|2{>3t@WuqNtfU2S*tpntUA1!kdF*VRfBTXAkdx4(@1>)e#ov3PbG(^ z#K?>sS(1idl80Z)P6xu}=tjB)5aJQ)vT?^fpIp%<(d{7nirTAEpe*`8p?p9nkPkd? zgai1|_R?o$@?Z!eK_Vf!fEn>|#5D! ziNtR~hF5g*0qy7y)T;Y8k-n`;=)E?U$R!L=x86(Af1N15Ji1N)w<3#M^+s>Q*c%{; zTb0oJVJwl`e@z@xMIo9$3?s!KL4fiQA4PzKf-Ufiei_3H8r08n6UoY=FF7E4FcNc&A?47f(U3m3EX089^n^M(Txyndl z5>o%1+&?F|ugmW1qWk(EuO_GrUJ%{)pEW_3Hlwdj1E%03a?zJH%~5;-@)1Tyo^4Pd zFAC$}yaWI0qi$p#ScdyXfeZ9NB;SjGh^n-v?Bc%xaq9LZEk?cs5vq1X%k!t0O0w16*(my9`A@=8U;%2h*oj54}6M)<+RBmIBQpTHJfMZTabIfNq7scq_40r~e2;zQZw|jPEcxnXU%lw7 ze_Y#uvs|4PEnX{nwMe4NK^Z4%@8(%X(u=2ZPa5*DEFu1tW;o|GjPKu?fal+N8|TAF z+EKR6?7s=V=xm1I%a@yBq+js4>SLx7C7M4Mx2`$0ltnl@T{NqwqG?GvjUcYP2r>)> z`3ndLIYU(8{{(?b*k<62IvS79YLc&&oJNddhCIS8k~WptY32Sk#0cL3fXIV;Q-U)fNU2Bf+N zs^;KIgRcHkJp{veJR#)qC@`GO2XM6$iUKm~A8D7nWVuS=-j_9f&pe59t5c+e9U4hL z89I|6?>5mUJPXV!uhm2LpE}lMVsmk46XsgT{t8rb`oItj3eqZ0IP{|_{y5Z{QRS%= zM@J}41*6xZlxv4&dJSmKFvkfhF5&8ijglt5+=k#nA<`i|`;Q<>co6_#(|X$KK z8$WQw34VZGm&$PryAZTl$jBZ*4fMHQG~pf)2Ce{bAqxi}k6!&&WklEx{9=@P2ohz4*$3*DIt$nG&=nMYRpBAM ztzU(RCn#DWS*ffhXF0plM>{SLid3aZR|AN&soF-uWk4{MUDYcMN!MP{wKr84#8^<4 zldZOKNBonMQu!IV{LG`#wO%IK%ZOK4`O2)+`=Z?YqD1pD&5PRm$HfXFUwi>pXnFph z#){1TB?l{TJELxK{w4VILr+y9i-~C@P&GFH7IWW0fO}iTqv>zp(3%I+M#JF-(m}FX zllp3X`Mqs)j{2?v%IOcRCVds_k>JU-tTC<+qUX|A@OI_KVRo0yOO_?;l5Nra@(YWW zmtV+U@!3*mwj~p>kJ2fq+8IY!J3S~=X-gd1fztui=plm?s*MR)L(GQo&>)jQutl+eevfRq!54|C zdu)Q9WCu=m+ep5^TtYi`$kd=#4W}1)WXJy*0-fveNNE+*yvpNnmXOEkTn;;{icDH{ zA3%&C10eEtB@nUnetgYcm2_9(G4rvc|JcJ8$v+_b2PF5P>>d=|gP=vLYh0^6k*q!O zFfP>&%eBLjyZUzT^5J`J_d+R;PxJ&p-=9AUOF)*pBR%GFUyUWv(F4{l(z;dg(~5NgMMH6 zT1i{7r0s9_{7vIe8rRyplkMG7dym}SBbD^ZCB34%SEZQQs|)cFG3SYrUYVfHGhL_n z9|Pt<^yX*Lw31z3&%owL^hO-X=Cs+ig+{#EN`Le*2e#Y8<%-PwPGx@mcyx?zGngia@N<-m;G z$y&kwvN%%@$|+mvQnKVB$qjq)ka5fK5B!36Y8gEX?^6 z;8U0JN%Wnsz=AC&!rw|njk z>r2z0bo*C)Yc-w8n$Cx#@4q0`oR@3Pi*CQ<9+KTdqI>9Zg@3K$K(gY1RM9L~G;dJW z!U_VGZ5w7waYf2k@#cj$F5Dk|_l4yPlCM+tb&BNue7!6HmL0{ATLURy`Et*O1%jV{ z{yD18E47^ts7JmI@2{#_S9d=2$;U2BRpWBixEc$P*vd#~S5qr$udo9?`~&N*?tuA& zfU~>F_Q3%YK&2>@0NOY)2R2tRG@%A#=ENKyGcZpNitjfwPR!2Nu2?8c{c3g*RrhO!m?Ov|?8+_|Vp5GBg)W*Dk<@qkxU@geVn+CIk`# z=DL$`aRkhDe~ekJ*Ww_?eHXl%aZ#DUk`c_ecrXfy^YaFCqai2&y#dV0Z}o}Y{RhY+ zAO?bYquK5#eq2%}m$ZSFvvAS0zVE=hjep(pvK2`_99ns6lVaKKi%%Rjm*JO49tPh_CM*a><&;!+nX&PG?@Sz zEc5K}DFpp*5%f<$Pq^8DpoXtQk;O{;i)LtJ4JtMJKB7>`Pjm-G@Ta$H()rpK-1O0@W@5(#W_H0 z;q;4hp^v z4M%~|f>k*GR~WW~K{Zqk*7ufhRLDAA=i4B8Awbs8HrDn}AQw4(%(30Oe?~qq4yJnR zo}G7=zWn>hxK*#BQL|IC&Q|8HPc_@5$phyWEt3vK#3VYw*S0eAqL?dWe$Sn z7XjZ^R|^NX)IHhu_hB0d;b4^o7t?#*q;^D zvTS;cc|ccb%CE08=3}jCGjI!QTQbM|U$T^4FI51g%q%?uvUZ{})2VB^_Tn0z^O9#J zOPbW;$k|qwh9VPh?5C08E?HQ|l9hEX*|umC_rc^@$(ngB4%)OVS`(<)OFx;*`-WIu z7m{n6ZS0Mq%ucONL+qEV$tahz1!;_r|K49|GxWmuhxE-*(;x9GVRbdYPNP}t8-?1g ziY0pj1(5W!xJlrGeF(i|f5{%BRriKT+mmEdBEdv1H;pC5Pv75@f*$I_)N=-a72xHg_ib%M-Lu`3v(^uP^>A^ z6rKvju5wLqEwhRAxd|>rHbr7h+GV*Ttw-8B4j(>Tr+G3R8oF??H_$)acVTk};O7m5 z<{9l{NDsJJ)108+y@QcB*xnMFjkK^g;L>KKCB`+WK6KP^(p7i*_mM+<#f}@;NLX=b z=4dg+io?hwZ&Yk#Xvsy};ZJbge}aT?RI$hKrx>D&eIX7u(rnP5wSyRh9DE~!9sqFv z6t9f(XVC9ZZ#ja>jX#GO(58gPV_W`Pm~4XqhP#*cFy8wW)C<8;Xas(`fj`);IL>m3 zr{St1-0%bgJG=`LVc`l9`DCTE=f(`+%O#>CIIZa^72Cu-4?nkH3&Yh)`1J)e?2bmA2|P=`xkCJz&Qab zV_&&ka_Z5!WXX9E-ls?9r%NND&)z+|=BrQo>Lp);>}wEx4XB1b+WFI$-g`+pa#lWa7Tf7q_m;k1aJOL18%TNs zlDAg&){5TRbnKf&Zxl)1fb0#3-oRr|#hRx&>8X}HHL|B><=LcXzv$VYDz8|!E!$GX zyVit+7COLE!%wX#FWvO}xvPiNkn z`J4Dp;!;_kT-LX2O|`a*-lkM%m*_nP$`c>#9_5n8wUQIbk`oVEu_v_N)$@Mzd_n4B&9SLCiMpW4j63Daj3!pGd?KSJ;- zYG(lc#z~d#x;rHM_OAK5lD@8o39&b}ezN!dMPofDugE8_VEod@&wey6jxo~E6?y22 zbTTBL3_<;+VXPk@R15I)&wm3aZGKSr6z<9Z7}DkN>(0B*<*YwY|9lR5pu%11ApyB+ zv_ZKFO9>!aD;)#iM8RO52Nrs%(h9k>`_WXgbXY7M#ti4*IREIByYd$?H9fM zsUuGj3=+K^@NUFSfZ7{~-&p{ZQ{Gc1s764h{EGuURs9a?mkwwD0n0B-JpGN9UpCsn zuefkylg}yu`6H~Sj6LC3J(bQq`GPe19N=iDHvbKi z$Uz;>hE5g#9s&#Hgeu})nVkC1B00PXS%4hsrxo={xE_94zc0Rp)z|UNjpxgf`sGB@1khL>oCR7)rG@Nn<|{$K>Eq!~tWGWZhSz}=Rx2A>2I znE8XVP#Xp3hp(@dTqmM-ZzW%P=}(mX5}D6*hn+a93 zjy$YeeeT_Fiu=0c`jhgmQ<*#@V=iD#cH6!UN(WwxtsK834V*3;Ua{O3Ryu9)8F@gt z$<_hnUITXBN8;>O+YP9C3+T4kfK}uHPK&J)6E*>-!v^OHdB9E=eqkO^Szz0{K>@gz zAkJzJakd6K3Ty&&8R5MV)m<%7-7kQDKuM>q586a{-=ex-0L$IBx(zB1sIuBx5#zwQ zuR6q^7r4!~7R1f`fZi&Bl%NZ2aJZv`9hALz!)&!(CbNCn^r;0RUb&o(DoUr0kkpav zRER3-HrYB?!y6R3UjWaU?Y05aDhv|3zaLcTBd+vd897E!Il^Dz`X4|b0#NKA{DZX~ zA#EyELrSMO)ZZV$6y#@0q59h{LNoad9QF5bJX)Nf8eowh=26PD*c^UAetbbWVmJhB zRyRumxcJL4Li1cA5{)G0HJ8!0iGpfrf<`9%ID&Qrgp}PwA08FY}{QrVD zqsrW93li~OZ1=PmM=q8zu#UyAbFB7Z5W@D}+?Q9*I*H%0kHCssxrnN zJ44=MH3ab{PQ*OWo0*m0OeRAn>^|NoyJ1Jk4$6-7qNilHs#UXYmBfnGYF3*cD>;uD zEt+3@&aJNMs&?BU^CG=jY0Kqvzd!2UbI(2J-gElrMMVV^JY3UTlmB`@Mg0#9=uckS z^Y|`!Zc!}7+M-ktU3=6Pvj^=qEzS{ikThq|NnBUZMO=5#4Xz`a7o&r8EI*hZD+m@q z87J$C7REe55AnOBMX^o6O~juU^~Q>W#iU+3S`ynF+#D+nmf9#gb(CWBuTpFQM_usg z9ps9+P4BuW>V5dvo?sbk8>Iq;Utn+~U{muhal8;o!~+i1bvh0n)ipLV9pzN|Ct?g635(3c93ya|x;Z?>g)cG}XG8pXf#G7);#^qkuLkLK;PKng zm+!$)b5zjAQbGG^81kTF3I_bAwxE-9acSRTXfYHEFr0zuF}EHtQX=- z*=uq@w{rBPlf;%o&I)!1@mE~U z4{l5Qw}HQs#8yJNDz=LAu+?03y43cop5XR$&Kk&B!}_5&ey*0Sy-K|cU;4iBwZS@w zty>dY&(<5gZGhSuNL$Z9Th9<*BlsGxQI~DOCP1fvS_rc~mH@oD#6{;93jFZsLH}$d z&L(ET5vTlYh`;C;BVv@B2=V?z+<%573jR=>^~XZtlcO!9@IZq1vz!=;L^;+UiBBf@ zSP0S4PcX%wm=XQr6z69X;h7j07fG5{vbz|*O|?(3s$)jrR3{|QsID+#r|O!Gu;P^J z4$tsHf>+&BT;%+esJdezLF6FJbI}Mlsk((Q&v9|peJLW$graJGH~~#W;*cd@3|-_V zp;bXGoJjC2$7@w?o`Ra9SerN%315tJ&|0YxHxUY7JkKX);;dT5T!JOTGU7!>Opg}> zSWmt}7*KaJEEfukkxLfx_0)GE-}^@1cWmFc*(kA4Po=0#J#SF&LXY3qdk@_gi*n~>T-&h-j34F68UJWwIIQA>CzN*52@!#VvXo^xC8QmrZ@t<0$GI z$h#?1TgE4D&-ktV+bDG12{Uf`_DmhD`x??DJDYcv&K|FLaXlp>LZzPuig(zkm#MgO zmb&bCnVPk+?l&lAvz|^urACN`G-K0ZF;r%x+^EzJ1iKKRy3J(t;Cuvy0l+Nsjh*T?haYCVtHg*Hqxkx2o}H|n&ucGqJK z1IDhqww7x$HD-KlL3Rx+tTe{2=U{Q44gpAo^F;s6!Yp{f#F+x~NqaONat(eO7 zu@1(mNpB+?@BUeBHbI*^^qS2s#0Sh_-EXC8*&__4cIr9JF1rc7V3!_~{RQim@y=_D*ma9XRJTU-kvkJKR*VtnrnxbQDC9#CfnzwHhn>y=`M&rRYFoor;Uat-2k-+s z5PRD)_|`t6L6przc-e%MnKEwxOUBw+$Gbq*-_MYC3%MSp-g83dVN2#j*p(x&zY6o) zduIeO5gWT0iNj{hU?g)!;|^LN5OAsm7&j3SW1(r)o)A>$bO?5H=Y>Qh9g%_TGP99YuLm9v`o+ak?x9yViRnrd%n@cO0_UdBpwkN zrll*IfC(15!K3AChVK!c2k_(yb;tR4-d}h>wttlOYtOGdQvbO0%A_=vSfwc5cFO)G zMeQH8|DHhb2gcA3@Cx-9r;W#vi5%|nQatV>gfDo{1{~D+f%(F&-b8#da(;&Ay65w| z29WU?jCTi`fsf(hp^2!@q#$3%5WbE9#!ht!GtxBULg zVU9>F>Lv#GJ07?~V4aZN^BUnazgNJ-BJp%$A@OGtLYFfM;7=#`7~mg8hUbLHJo#!A zRCr{VR2T4}(6bUolVJ#NMHZo&&*;1s;UKkPRJSmp>FMYk!nBOU#6U=bdXOttD+uCi zNY2DKaVo(wF!8_!t2-DN9AFD4fC1&XG+!v70HuvQ47|qLsdXD9>b12)9&w80L$m1^ zh79BeCDk_4x5(t&Q^U0&ZXBge5b|KPh-wXCr8yQ_WzWNR7@r37 zhFw#)0<|)C8kqsr$6$TggY29Df})nM+aE7OIs}VO>tMjmBS%5jgzCgeSKXSF z%D3a>=Q9kEEEq;`L--tsJ%_LGomk`mfO%i8wTxVX@FA?aCr@DQuF_O~(Fz?%(gB&? zrO>-1de^F(%CGn<*Bf~^@)WxKc7sGu{I+iIy-W8+<^?2gM`ZelLLULoLweioy>~>3-Xqg{6nYPMR-NwrlHYkZ-&k1j zHYUA|%QLdKS@AZnQudq3n^3YqpO4;&D zG9cwCzSg(ufH)W=7>=5{Yfgo(OlfXas>XlKdBdCX*J5;es%D243~0f=W9ZgC8agEn z1%F(nRP4GltW+Ghe?X}ikl;PXuAIA+Ja?NWMSR%vvOfTDGcDy z9E4GMbLjfel5o3Esd`@abSa)L$v5$FULSnp_>JS&$lt1i@-#rg+D}Iwm0;=#_)x^u3lO0_ z!r#D$8lSJnqH7fe7VS?rAd3#D-Gpz;27hd>d%05!h!lP)N zuVK>i4Bv;9IJIpUXGYxw=Yqi5YfJ;OcScyNPr!kJjW~@$XCXA-U_qgExDgg|3P}L4 z=Dekfw_}xZ=byHvs%uxOo0HYea&@ax-Fj^#wY_d-duwugtGvBk+1`Hbox6H0I z_9Pp79(2o%rbdVLNXBC(VJK?}YsV<4$XZOHQS@KGn2qrKvaB)cfG1+%%>%jbUtqMBddR?61~qU@J^@X;^Q}EPNv# z!eRLFC0NKmu)&fy;kgyNbFY8}8{jFF%^cXlF~$0ImF7M{ceDpE9Vd}IR(#%| zgn@(B5?`Z_$il68HfZr*qK~G-(@a;tejk4bQu+p^))~tmQa{dG`!?L!Q4U)3us{XhZo zT_!o{^IQU?CVq}Tg7uXe^#Qp+p%3z&5EQw<~~&D#qQ znlHD|6qLf!wZtG*@WE05?*1WNq_L7!NxDj^Zk5`5Wx7wH`y{$A!#jGfdv7~e$~%(f z9ryMqoda_DQKkIor@ocJaB?s#u~Q0rSst8I2IpjYUZLkDdOlt8n}0&l-|2lSPl9mK zw^Fq?S+)0`sO%e(tBxyG$ASKAJAzaQ;HT`$$W(GmmVkpbYH za2w$#0hkylwR%JOaz0?5qYbmpLB)@Y0RZt&bL1e1!TTq4m|wuIE+WY8Z_P}6!*0y) zGWYl^GLvS$i_H*z&OE3{$_RPC0kKHlVKG9K_FTz>kdgcKQ=+llvl*N9$n!ePhp7!K z5e6b*5KFxm=$iXsEs;$yAg9qw(tm?kzdp7>|JNgz>-ENH!`hn-`fv2ZS|YpuI%A|U zMKs?JU(XL9K*Gl(!_ChiIEvsHf=dA2(|BW^5Fy+{brN(L{PQ(tWXVD55I2N(0RSaR z6?$(Rk_sE|G$=a{NIM4}dP?3ndgJJuC$FE((0~uVD_0#=s;s0(lm};&!5P_eN%35g zJeR(?nxHaxfi>TC)COH5Xsmj55)Q{*JSZ1fP#>}|K)aya_>yABQ2UfSt7-_vzLCD@YL(0AvwvgC&?=dMlo) zq^Ancm-Z*C_up@otA~{8A=z_W@f?>t$6+I_Z(6B4n5;W^KOxtRD0L&Ur{-G!(%#$c zw?iqfPxAVgUzDEN_pmW=r{Qkv$DQ|Q9iWj?0Wv= z(Fa>T^(lid%LjwX!Jyo9R%tqG79U(xaV=B|Rl*Abgs*(1v^`nc{_mdo`=$??Ryul; z9X)bKpVHAMm-Z{A{gS7D?aqTMi|jlsc(QjMK96kg#;V+aa_3xWR_xKv7l1t&1D@^_ zG{=u3Ae((}HBSvvt}^inAV5zv+or)d3y*ZLGskHO6$ z=OokH6ndMazkdcJ!T%L>T_1`u@M}Ynho|LmYQJ_QmLQMy_$i(BuOUHb2Vfb9L0bw= zR$(CEG?}oq$bHImg+f=rnW*-XVaTkSuz4DBb0w(pU%`V4Cf|hAx#&1gp)AVUeq^7t z!-cd#+C?`slYTPtuKn+S?3^p1zgOU%4hPj4x#|%T&o1J-~gG%H3G+38KThy z1;0ST8_v`~QLsNynCCGfEv^x0418-Jh&R@XIn}xja#K+|{}L48Uq&zqfUwQ!C9ns= z^G#;%!MNI5d(*g#g=+x-GA!>|sqanJ_de)b>HBuF@7r=8qx3Oy{W+!n+!c)v1@cK& zV7^f$KL~|0r+)lF3?2axaA}m*7%#P4zq&IDqrTJ(Cun3B=k8pF=-!0jd|A%V_#q?- z(*W>}wA^@UWxXno@u)G?1KR*a2(%;6LQAYu?X zmGa&PV=MhkvY&zbCFR_--2bZ5|Ef&$3e8LU`^{npe*0Hpho0yEY3w+P-${74EbKrT zNt2syflojBO;b5c%t8k3nCRbNsoMyi1z@?iLbe(i;Kyouu>!+lyF~H70Cb1wwa
    5C|PzpqqlJwJ%RtmhaOIHd6rBOrN$v%3>?AWXmltxSRTHw$Ch~auC zi)p1%WZ2VBwkn@Sc3__-m-_r($cAdM6KS>B_dq$GKMs+q160-d6X4V6&@lQ&FkzE+ zdl8cK`|+P#>l^d`CVF0BEsW@W~dd`Y2CkoQ`7WB{yiiKzXw1# zu(I1*q{13_$z?=mvbyu$z=uP>9J)U*?-^3|49V5UmFnZy`fiLEvPE^$Q@!k4sqISE zcHJNQ=oPv4gi?D#@>I*7VZ}2nd4?ZVRIgO*PFC!eD_WF_mQ~7GR6)R!Yt`;3sYv-M zZk>Gla@AR->Z}$EkSHd|sKihw>94REKKv7BWsl$fiNBzy+4ae88$fkaNCY8o zVg^)6h&m7`Y>P8|+;T#IJ0Si)J_mrvA2#FO63@LLR(nP_(yBDjTF;GcHYx$TXV=gO zE;S8IQJrB>J%N}GD8erzAXAT>GQ`E7LSVkw%(-Bp-$1Oe8vvQ~irc|tVUtwYlq%hN zvs?1i{;stAt$jE5-RgR~Yk8Ag+NzYcN}krWTM8l>8G;~qa0sktsv9ViuJhSzZ+h@Z zKod6{{I{SLjpZwvjhWP!(u+WKr&adgMtm|f6BTpq+dqRk<}1wOVX5jLAz9c300$<} zj9eOAcBhZltCMu~?aAfyGToxkEt3A`rtM^0CV(2=qJXZM&_VdY*U>%r2J+^l?IOww z>Bma5HwrBRMa<2=@`n%{M$n9)4FS^8v@QVAuCizXoPoqF)ky6&C`$nj1=#-#c?Dcypj~AL9j8a7 zTb0swRBKwW{Yh#~-nYF!v%iz~bI(saQgh#fDd}5hq?hMp|GeU#my5rn6n{t3-&Gg3 zqP6t|Zg`53NUqUr%IG!`Quh}<+j{&IlDZbhC(Sm17M=tdbAq>52;L%(t3R1ze1pjS z+{_0EKQZsHnLX7^12PBe*4^KVak=ZsmYXk^S=H;>)j?g*eoNB zr|MmnVa7$mH}O>>$`I)%b1cfbt#xK_-Fy%l$Q$9OpzI%=oh|KcsuR^3)B;dS4Nnp4 zr$4%$YuVefe|~?O+6n$y7!J2K17JBd^YcM(4ojD0ak91NApgBoa~o zNaDRhldSBArg)ru)kV%b)lJiLpcEQs(sp}%7}FeM;VA4opeIVSX2F7qR1Rvqj&M{k zU6}FDLH79_WBJT?1CKm`<>NR(ImEGf@P4m#Z<;LQVUs9^~$klt5>b#q`#|qnko;p4{wSzkRk=vlKlU_ zbily$&u!`OzW}u2amn*{5ui9W-)^iImWzUh&sQ%P{@-HZ4*-}Ed;%-8-1}~*y7%9( zIMTg;Neq8M_MK9ErzHLT3Jg~ZG%a(~8@KSj$UKmZ;t?nDsta`WecoJcK#S_ zC0HMMmh3_guo*eo7VE|V!mS~ouE&_HDPgcAW>L?YYuUKl())z2H4i8unM6fvT5jt- zYaY1evn>~z>(~9(e5^gK3kmjvi}rZ+QTKlv+NmR|f>ex;3yHv$um;$r#%CcI+NEuzUx`dL`R z(g2I@UUa|aj?^pb3U$W%h|Kq#5h@_2zZ!C^YB0 zP^s6RT^s9$9vSuFS~33zJfZWz4-<27I8yPCa+*!JVO>s$q(3o9EX6fp!7nEK#7f(b z_T|JD9j$lJ5Pdij<`V)~cj+eSEd@r^y*$T8M8OYsH&9swJTq}H(oVz=7+JvZds;Zq z+6pE*;fo1i&L*RY*_Lo3*7_>kUSM9KwWIU7&b?qR)*24QnpSgLbs7L1Ro`_2rXIl`PC?Pmsuhx<>B4!+pW^c^{MoEbjZ*RKXPOlEre2Vm-% zj<#d%ssn60wX+mFw8kX>Px|QlC5W+J@NHl$^*N@=EpV7o80>BJ@&)cFJph7_#h!~9Z~s;gTn-VZ{#52O*Lv}vXEV6yb!eOBrVJ?!rLDEj%{&$^_SzAYbrMLGV8 z+|4N6493SkANcHq^ztk62}U`=$ld3Z?sH$d?7j)x?Yxp{-;XHl#+o}ssMtpvfj$OnRg4${^a6X1vI0`OU@Dx zKRA{wJt38zfNPIiBX5t$z6QnDAdxp!R-u&jJeW$BjYwr9nBm0RC*B&lIkE(QYZHgw z9=d&5_U!<2A(8hHl)y+>gePPlkda}@H~eUCdJXpv;acuV^$~@nBa#Q-)o1Wqv@g<* zK#VzrPevRktE>?Qfe3}hd}j+!%cc}4m433XJwU`VVR%MB%#HWiVkM6`KF8|da} z$JC#!HSRW-)cqT*2izjbV_gqxZ$|N~4=fW1zoXp_=4+Q5KB8coWl@~X;^4l^4MI8_ zwxDNa&wkjqCC`4t7T~K*UBTKFUV>km(uRFxB(MW*{P8XhEb$8%v}B(lR{0)=fg{dn zIwg-`fGuShazP3v|L~JvUWN(9;|cATn*>Pm!$+x3JObrw!OPCfJw>$3LLI&n6L)G2kpS`*>PJW&b>b3tPeKlxdbu-8^EW^<8i@^=Kxhs zSKBfSCOCIAhxl^>kKNUZXp0_C%;jmZq;M6=rFPBR`*$c z+oeU5odt05$1H@F88H%#h;zEj=%)sPrY+*ZPO%6G#rP5WP#=j<5%@tEjhJ@x{~O|v zya+acz}MSsDQeRd@|U8jCF`4_3a*g96qSF4{G}-G74ny&ims5q6cv!xe;-jzlJ!kd vZIbm(QHLb!`-qB4x!zTG*l9y#Sl?M{Qa0B~4c*e=(J!@ZzuzD?8KVCS@q!hq diff --git a/.venv/Lib/site-packages/customtkinter/windows/ctk_input_dialog.py b/.venv/Lib/site-packages/customtkinter/windows/ctk_input_dialog.py deleted file mode 100644 index 6c4669a..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/ctk_input_dialog.py +++ /dev/null @@ -1,117 +0,0 @@ -from typing import Union, Tuple, Optional - -from .widgets import CTkLabel -from .widgets import CTkEntry -from .widgets import CTkButton -from .widgets.theme import ThemeManager -from .ctk_toplevel import CTkToplevel -from .widgets.font import CTkFont - - -class CTkInputDialog(CTkToplevel): - """ - Dialog with extra window, message, entry widget, cancel and ok button. - For detailed information check out the documentation. - """ - - def __init__(self, - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color: Optional[Union[str, Tuple[str, str]]] = None, - button_fg_color: Optional[Union[str, Tuple[str, str]]] = None, - button_hover_color: Optional[Union[str, Tuple[str, str]]] = None, - button_text_color: Optional[Union[str, Tuple[str, str]]] = None, - entry_fg_color: Optional[Union[str, Tuple[str, str]]] = None, - entry_border_color: Optional[Union[str, Tuple[str, str]]] = None, - entry_text_color: Optional[Union[str, Tuple[str, str]]] = None, - - title: str = "CTkDialog", - font: Optional[Union[tuple, CTkFont]] = None, - text: str = "CTkDialog"): - - super().__init__(fg_color=fg_color) - - self._fg_color = ThemeManager.theme["CTkToplevel"]["fg_color"] if fg_color is None else self._check_color_type(fg_color) - self._text_color = ThemeManager.theme["CTkLabel"]["text_color"] if text_color is None else self._check_color_type(button_hover_color) - self._button_fg_color = ThemeManager.theme["CTkButton"]["fg_color"] if button_fg_color is None else self._check_color_type(button_fg_color) - self._button_hover_color = ThemeManager.theme["CTkButton"]["hover_color"] if button_hover_color is None else self._check_color_type(button_hover_color) - self._button_text_color = ThemeManager.theme["CTkButton"]["text_color"] if button_text_color is None else self._check_color_type(button_text_color) - self._entry_fg_color = ThemeManager.theme["CTkEntry"]["fg_color"] if entry_fg_color is None else self._check_color_type(entry_fg_color) - self._entry_border_color = ThemeManager.theme["CTkEntry"]["border_color"] if entry_border_color is None else self._check_color_type(entry_border_color) - self._entry_text_color = ThemeManager.theme["CTkEntry"]["text_color"] if entry_text_color is None else self._check_color_type(entry_text_color) - - self._user_input: Union[str, None] = None - self._running: bool = False - self._title = title - self._text = text - self._font = font - - self.title(self._title) - self.lift() # lift window on top - self.attributes("-topmost", True) # stay on top - self.protocol("WM_DELETE_WINDOW", self._on_closing) - self.after(10, self._create_widgets) # create widgets with slight delay, to avoid white flickering of background - self.resizable(False, False) - self.grab_set() # make other windows not clickable - - def _create_widgets(self): - self.grid_columnconfigure((0, 1), weight=1) - self.rowconfigure(0, weight=1) - - self._label = CTkLabel(master=self, - width=300, - wraplength=300, - fg_color="transparent", - text_color=self._text_color, - text=self._text, - font=self._font) - self._label.grid(row=0, column=0, columnspan=2, padx=20, pady=20, sticky="ew") - - self._entry = CTkEntry(master=self, - width=230, - fg_color=self._entry_fg_color, - border_color=self._entry_border_color, - text_color=self._entry_text_color, - font=self._font) - self._entry.grid(row=1, column=0, columnspan=2, padx=20, pady=(0, 20), sticky="ew") - - self._ok_button = CTkButton(master=self, - width=100, - border_width=0, - fg_color=self._button_fg_color, - hover_color=self._button_hover_color, - text_color=self._button_text_color, - text='Ok', - font=self._font, - command=self._ok_event) - self._ok_button.grid(row=2, column=0, columnspan=1, padx=(20, 10), pady=(0, 20), sticky="ew") - - self._cancel_button = CTkButton(master=self, - width=100, - border_width=0, - fg_color=self._button_fg_color, - hover_color=self._button_hover_color, - text_color=self._button_text_color, - text='Cancel', - font=self._font, - command=self._cancel_event) - self._cancel_button.grid(row=2, column=1, columnspan=1, padx=(10, 20), pady=(0, 20), sticky="ew") - - self.after(150, lambda: self._entry.focus()) # set focus to entry with slight delay, otherwise it won't work - self._entry.bind("", self._ok_event) - - def _ok_event(self, event=None): - self._user_input = self._entry.get() - self.grab_release() - self.destroy() - - def _on_closing(self): - self.grab_release() - self.destroy() - - def _cancel_event(self): - self.grab_release() - self.destroy() - - def get_input(self): - self.master.wait_window(self) - return self._user_input diff --git a/.venv/Lib/site-packages/customtkinter/windows/ctk_tk.py b/.venv/Lib/site-packages/customtkinter/windows/ctk_tk.py deleted file mode 100644 index e137dc3..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/ctk_tk.py +++ /dev/null @@ -1,333 +0,0 @@ -import tkinter -import sys -import os -import platform -import ctypes -from typing import Union, Tuple, Optional -from packaging import version - -from .widgets.theme import ThemeManager -from .widgets.scaling import CTkScalingBaseClass -from .widgets.appearance_mode import CTkAppearanceModeBaseClass - -from customtkinter.windows.widgets.utility.utility_functions import pop_from_dict_by_set, check_kwargs_empty - -CTK_PARENT_CLASS = tkinter.Tk - - -class CTk(CTK_PARENT_CLASS, CTkAppearanceModeBaseClass, CTkScalingBaseClass): - """ - Main app window with dark titlebar on Windows and macOS. - For detailed information check out the documentation. - """ - - _valid_tk_constructor_arguments: set = {"screenName", "baseName", "className", "useTk", "sync", "use"} - - _valid_tk_configure_arguments: set = {'bd', 'borderwidth', 'class', 'menu', 'relief', 'screen', - 'use', 'container', 'cursor', 'height', - 'highlightthickness', 'padx', 'pady', 'takefocus', 'visual', 'width'} - - _deactivate_macos_window_header_manipulation: bool = False - _deactivate_windows_window_header_manipulation: bool = False - - def __init__(self, - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - **kwargs): - - self._enable_macos_dark_title_bar() - - # call init methods of super classes - CTK_PARENT_CLASS.__init__(self, **pop_from_dict_by_set(kwargs, self._valid_tk_constructor_arguments)) - CTkAppearanceModeBaseClass.__init__(self) - CTkScalingBaseClass.__init__(self, scaling_type="window") - check_kwargs_empty(kwargs, raise_error=True) - - self._current_width = 600 # initial window size, independent of scaling - self._current_height = 500 - self._min_width: int = 0 - self._min_height: int = 0 - self._max_width: int = 1_000_000 - self._max_height: int = 1_000_000 - self._last_resizable_args: Union[Tuple[list, dict], None] = None # (args, kwargs) - - self._fg_color = ThemeManager.theme["CTk"]["fg_color"] if fg_color is None else self._check_color_type(fg_color) - - # set bg of tkinter.Tk - super().configure(bg=self._apply_appearance_mode(self._fg_color)) - - # set title - self.title("CTk") - - # indicator variables - self._iconbitmap_method_called = False # indicates if wm_iconbitmap method got called - self._state_before_windows_set_titlebar_color = None - self._window_exists = False # indicates if the window is already shown through update() or mainloop() after init - self._withdraw_called_before_window_exists = False # indicates if withdraw() was called before window is first shown through update() or mainloop() - self._iconify_called_before_window_exists = False # indicates if iconify() was called before window is first shown through update() or mainloop() - self._block_update_dimensions_event = False - - # save focus before calling withdraw - self.focused_widget_before_widthdraw = None - - # set CustomTkinter titlebar icon (Windows only) - if sys.platform.startswith("win"): - self.after(200, self._windows_set_titlebar_icon) - - # set titlebar color (Windows only) - if sys.platform.startswith("win"): - self._windows_set_titlebar_color(self._get_appearance_mode()) - - self.bind('', self._update_dimensions_event) - self.bind('', self._focus_in_event) - - def destroy(self): - self._disable_macos_dark_title_bar() - - # call destroy methods of super classes - tkinter.Tk.destroy(self) - CTkAppearanceModeBaseClass.destroy(self) - CTkScalingBaseClass.destroy(self) - - def _focus_in_event(self, event): - # sometimes window looses jumps back on macOS if window is selected from Mission Control, so has to be lifted again - if sys.platform == "darwin": - self.lift() - - def _update_dimensions_event(self, event=None): - if not self._block_update_dimensions_event: - - detected_width = super().winfo_width() # detect current window size - detected_height = super().winfo_height() - - # detected_width = event.width - # detected_height = event.height - - if self._current_width != self._reverse_window_scaling(detected_width) or self._current_height != self._reverse_window_scaling(detected_height): - self._current_width = self._reverse_window_scaling(detected_width) # adjust current size according to new size given by event - self._current_height = self._reverse_window_scaling(detected_height) # _current_width and _current_height are independent of the scale - - def _set_scaling(self, new_widget_scaling, new_window_scaling): - super()._set_scaling(new_widget_scaling, new_window_scaling) - - # Force new dimensions on window by using min, max, and geometry. Without min, max it won't work. - super().minsize(self._apply_window_scaling(self._current_width), self._apply_window_scaling(self._current_height)) - super().maxsize(self._apply_window_scaling(self._current_width), self._apply_window_scaling(self._current_height)) - - super().geometry(f"{self._apply_window_scaling(self._current_width)}x{self._apply_window_scaling(self._current_height)}") - - # set new scaled min and max with delay (delay prevents weird bug where window dimensions snap to unscaled dimensions when mouse releases window) - self.after(1000, self._set_scaled_min_max) # Why 1000ms delay? Experience! (Everything tested on Windows 11) - - def block_update_dimensions_event(self): - self._block_update_dimensions_event = False - - def unblock_update_dimensions_event(self): - self._block_update_dimensions_event = False - - def _set_scaled_min_max(self): - if self._min_width is not None or self._min_height is not None: - super().minsize(self._apply_window_scaling(self._min_width), self._apply_window_scaling(self._min_height)) - if self._max_width is not None or self._max_height is not None: - super().maxsize(self._apply_window_scaling(self._max_width), self._apply_window_scaling(self._max_height)) - - def withdraw(self): - if self._window_exists is False: - self._withdraw_called_before_window_exists = True - super().withdraw() - - def iconify(self): - if self._window_exists is False: - self._iconify_called_before_window_exists = True - super().iconify() - - def update(self): - if self._window_exists is False: - if sys.platform.startswith("win"): - if not self._withdraw_called_before_window_exists and not self._iconify_called_before_window_exists: - # print("window dont exists -> deiconify in update") - self.deiconify() - - self._window_exists = True - - super().update() - - def mainloop(self, *args, **kwargs): - if not self._window_exists: - if sys.platform.startswith("win"): - self._windows_set_titlebar_color(self._get_appearance_mode()) - - if not self._withdraw_called_before_window_exists and not self._iconify_called_before_window_exists: - # print("window dont exists -> deiconify in mainloop") - self.deiconify() - - self._window_exists = True - - super().mainloop(*args, **kwargs) - - def resizable(self, width: bool = None, height: bool = None): - current_resizable_values = super().resizable(width, height) - self._last_resizable_args = ([], {"width": width, "height": height}) - - if sys.platform.startswith("win"): - self._windows_set_titlebar_color(self._get_appearance_mode()) - - return current_resizable_values - - def minsize(self, width: int = None, height: int = None): - self._min_width = width - self._min_height = height - if self._current_width < width: - self._current_width = width - if self._current_height < height: - self._current_height = height - super().minsize(self._apply_window_scaling(self._min_width), self._apply_window_scaling(self._min_height)) - - def maxsize(self, width: int = None, height: int = None): - self._max_width = width - self._max_height = height - if self._current_width > width: - self._current_width = width - if self._current_height > height: - self._current_height = height - super().maxsize(self._apply_window_scaling(self._max_width), self._apply_window_scaling(self._max_height)) - - def geometry(self, geometry_string: str = None): - if geometry_string is not None: - super().geometry(self._apply_geometry_scaling(geometry_string)) - - # update width and height attributes - width, height, x, y = self._parse_geometry_string(geometry_string) - if width is not None and height is not None: - self._current_width = max(self._min_width, min(width, self._max_width)) # bound value between min and max - self._current_height = max(self._min_height, min(height, self._max_height)) - else: - return self._reverse_geometry_scaling(super().geometry()) - - def configure(self, **kwargs): - if "fg_color" in kwargs: - self._fg_color = self._check_color_type(kwargs.pop("fg_color")) - super().configure(bg=self._apply_appearance_mode(self._fg_color)) - - for child in self.winfo_children(): - try: - child.configure(bg_color=self._fg_color) - except Exception: - pass - - super().configure(**pop_from_dict_by_set(kwargs, self._valid_tk_configure_arguments)) - check_kwargs_empty(kwargs) - - def cget(self, attribute_name: str) -> any: - if attribute_name == "fg_color": - return self._fg_color - else: - return super().cget(attribute_name) - - def wm_iconbitmap(self, bitmap=None, default=None): - self._iconbitmap_method_called = True - super().wm_iconbitmap(bitmap, default) - - def iconbitmap(self, bitmap=None, default=None): - self._iconbitmap_method_called = True - super().wm_iconbitmap(bitmap, default) - - def _windows_set_titlebar_icon(self): - try: - # if not the user already called iconbitmap method, set icon - if not self._iconbitmap_method_called: - customtkinter_directory = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - self.iconbitmap(os.path.join(customtkinter_directory, "assets", "icons", "CustomTkinter_icon_Windows.ico")) - except Exception: - pass - - @classmethod - def _enable_macos_dark_title_bar(cls): - if sys.platform == "darwin" and not cls._deactivate_macos_window_header_manipulation: # macOS - if version.parse(platform.python_version()) < version.parse("3.10"): - if version.parse(tkinter.Tcl().call("info", "patchlevel")) >= version.parse("8.6.9"): # Tcl/Tk >= 8.6.9 - os.system("defaults write -g NSRequiresAquaSystemAppearance -bool No") - # This command allows dark-mode for all programs - - @classmethod - def _disable_macos_dark_title_bar(cls): - if sys.platform == "darwin" and not cls._deactivate_macos_window_header_manipulation: # macOS - if version.parse(platform.python_version()) < version.parse("3.10"): - if version.parse(tkinter.Tcl().call("info", "patchlevel")) >= version.parse("8.6.9"): # Tcl/Tk >= 8.6.9 - os.system("defaults delete -g NSRequiresAquaSystemAppearance") - # This command reverts the dark-mode setting for all programs. - - def _windows_set_titlebar_color(self, color_mode: str): - """ - Set the titlebar color of the window to light or dark theme on Microsoft Windows. - - Credits for this function: - https://stackoverflow.com/questions/23836000/can-i-change-the-title-bar-in-tkinter/70724666#70724666 - - MORE INFO: - https://docs.microsoft.com/en-us/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute - """ - - if sys.platform.startswith("win") and not self._deactivate_windows_window_header_manipulation: - - if self._window_exists: - self._state_before_windows_set_titlebar_color = self.state() - # print("window_exists -> state_before_windows_set_titlebar_color: ", self.state_before_windows_set_titlebar_color) - - if self._state_before_windows_set_titlebar_color != "iconic" or self._state_before_windows_set_titlebar_color != "withdrawn": - self.focused_widget_before_widthdraw = self.focus_get() - super().withdraw() # hide window so that it can be redrawn after the titlebar change so that the color change is visible - else: - # print("window dont exists -> withdraw and update") - self.focused_widget_before_widthdraw = self.focus_get() - super().withdraw() - super().update() - - if color_mode.lower() == "dark": - value = 1 - elif color_mode.lower() == "light": - value = 0 - else: - return - - try: - hwnd = ctypes.windll.user32.GetParent(self.winfo_id()) - DWMWA_USE_IMMERSIVE_DARK_MODE = 20 - DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 = 19 - - # try with DWMWA_USE_IMMERSIVE_DARK_MODE - if ctypes.windll.dwmapi.DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE, - ctypes.byref(ctypes.c_int(value)), - ctypes.sizeof(ctypes.c_int(value))) != 0: - - # try with DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20h1 - ctypes.windll.dwmapi.DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, - ctypes.byref(ctypes.c_int(value)), - ctypes.sizeof(ctypes.c_int(value))) - - except Exception as err: - print(err) - - if self._window_exists or True: - # print("window_exists -> return to original state: ", self.state_before_windows_set_titlebar_color) - if self._state_before_windows_set_titlebar_color == "normal": - self.deiconify() - elif self._state_before_windows_set_titlebar_color == "iconic": - self.iconify() - elif self._state_before_windows_set_titlebar_color == "zoomed": - self.state("zoomed") - else: - self.state(self._state_before_windows_set_titlebar_color) # other states - else: - pass # wait for update or mainloop to be called - - if self.focused_widget_before_widthdraw is not None: - self.after(1, self.focused_widget_before_widthdraw.focus) - self.focused_widget_before_widthdraw = None - - def _set_appearance_mode(self, mode_string: str): - super()._set_appearance_mode(mode_string) - - if sys.platform.startswith("win"): - self._windows_set_titlebar_color(mode_string) - - super().configure(bg=self._apply_appearance_mode(self._fg_color)) diff --git a/.venv/Lib/site-packages/customtkinter/windows/ctk_toplevel.py b/.venv/Lib/site-packages/customtkinter/windows/ctk_toplevel.py deleted file mode 100644 index 9780380..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/ctk_toplevel.py +++ /dev/null @@ -1,307 +0,0 @@ -import tkinter -from packaging import version -import sys -import os -import platform -import ctypes -from typing import Union, Tuple, Optional - -from .widgets.theme import ThemeManager -from .widgets.scaling import CTkScalingBaseClass -from .widgets.appearance_mode import CTkAppearanceModeBaseClass - -from customtkinter.windows.widgets.utility.utility_functions import pop_from_dict_by_set, check_kwargs_empty - - -class CTkToplevel(tkinter.Toplevel, CTkAppearanceModeBaseClass, CTkScalingBaseClass): - """ - Toplevel window with dark titlebar on Windows and macOS. - For detailed information check out the documentation. - """ - - _valid_tk_toplevel_arguments: set = {"master", "bd", "borderwidth", "class", "container", "cursor", "height", - "highlightbackground", "highlightthickness", "menu", "relief", - "screen", "takefocus", "use", "visual", "width"} - - _deactivate_macos_window_header_manipulation: bool = False - _deactivate_windows_window_header_manipulation: bool = False - - def __init__(self, *args, - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - **kwargs): - - self._enable_macos_dark_title_bar() - - # call init methods of super classes - super().__init__(*args, **pop_from_dict_by_set(kwargs, self._valid_tk_toplevel_arguments)) - CTkAppearanceModeBaseClass.__init__(self) - CTkScalingBaseClass.__init__(self, scaling_type="window") - check_kwargs_empty(kwargs, raise_error=True) - - try: - # Set Windows titlebar icon - if sys.platform.startswith("win"): - customtkinter_directory = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - self.after(200, lambda: self.iconbitmap(os.path.join(customtkinter_directory, "assets", "icons", "CustomTkinter_icon_Windows.ico"))) - except Exception: - pass - - self._current_width = 200 # initial window size, always without scaling - self._current_height = 200 - self._min_width: int = 0 - self._min_height: int = 0 - self._max_width: int = 1_000_000 - self._max_height: int = 1_000_000 - self._last_resizable_args: Union[Tuple[list, dict], None] = None # (args, kwargs) - - self._fg_color = ThemeManager.theme["CTkToplevel"]["fg_color"] if fg_color is None else self._check_color_type(fg_color) - - # set bg color of tkinter.Toplevel - super().configure(bg=self._apply_appearance_mode(self._fg_color)) - - # set title of tkinter.Toplevel - super().title("CTkToplevel") - - # indicator variables - self._iconbitmap_method_called = True - self._state_before_windows_set_titlebar_color = None - self._windows_set_titlebar_color_called = False # indicates if windows_set_titlebar_color was called, stays True until revert_withdraw_after_windows_set_titlebar_color is called - self._withdraw_called_after_windows_set_titlebar_color = False # indicates if withdraw() was called after windows_set_titlebar_color - self._iconify_called_after_windows_set_titlebar_color = False # indicates if iconify() was called after windows_set_titlebar_color - self._block_update_dimensions_event = False - - # save focus before calling withdraw - self.focused_widget_before_widthdraw = None - - # set CustomTkinter titlebar icon (Windows only) - if sys.platform.startswith("win"): - self.after(200, self._windows_set_titlebar_icon) - - # set titlebar color (Windows only) - if sys.platform.startswith("win"): - self._windows_set_titlebar_color(self._get_appearance_mode()) - - self.bind('', self._update_dimensions_event) - self.bind('', self._focus_in_event) - - def destroy(self): - self._disable_macos_dark_title_bar() - - # call destroy methods of super classes - tkinter.Toplevel.destroy(self) - CTkAppearanceModeBaseClass.destroy(self) - CTkScalingBaseClass.destroy(self) - - def _focus_in_event(self, event): - # sometimes window looses jumps back on macOS if window is selected from Mission Control, so has to be lifted again - if sys.platform == "darwin": - self.lift() - - def _update_dimensions_event(self, event=None): - if not self._block_update_dimensions_event: - detected_width = self.winfo_width() # detect current window size - detected_height = self.winfo_height() - - if self._current_width != self._reverse_window_scaling(detected_width) or self._current_height != self._reverse_window_scaling(detected_height): - self._current_width = self._reverse_window_scaling(detected_width) # adjust current size according to new size given by event - self._current_height = self._reverse_window_scaling(detected_height) # _current_width and _current_height are independent of the scale - - def _set_scaling(self, new_widget_scaling, new_window_scaling): - super()._set_scaling(new_widget_scaling, new_window_scaling) - - # Force new dimensions on window by using min, max, and geometry. Without min, max it won't work. - super().minsize(self._apply_window_scaling(self._current_width), self._apply_window_scaling(self._current_height)) - super().maxsize(self._apply_window_scaling(self._current_width), self._apply_window_scaling(self._current_height)) - - super().geometry(f"{self._apply_window_scaling(self._current_width)}x{self._apply_window_scaling(self._current_height)}") - - # set new scaled min and max with delay (delay prevents weird bug where window dimensions snap to unscaled dimensions when mouse releases window) - self.after(1000, self._set_scaled_min_max) # Why 1000ms delay? Experience! (Everything tested on Windows 11) - - def block_update_dimensions_event(self): - self._block_update_dimensions_event = False - - def unblock_update_dimensions_event(self): - self._block_update_dimensions_event = False - - def _set_scaled_min_max(self): - if self._min_width is not None or self._min_height is not None: - super().minsize(self._apply_window_scaling(self._min_width), self._apply_window_scaling(self._min_height)) - if self._max_width is not None or self._max_height is not None: - super().maxsize(self._apply_window_scaling(self._max_width), self._apply_window_scaling(self._max_height)) - - def geometry(self, geometry_string: str = None): - if geometry_string is not None: - super().geometry(self._apply_geometry_scaling(geometry_string)) - - # update width and height attributes - width, height, x, y = self._parse_geometry_string(geometry_string) - if width is not None and height is not None: - self._current_width = max(self._min_width, min(width, self._max_width)) # bound value between min and max - self._current_height = max(self._min_height, min(height, self._max_height)) - else: - return self._reverse_geometry_scaling(super().geometry()) - - def withdraw(self): - if self._windows_set_titlebar_color_called: - self._withdraw_called_after_windows_set_titlebar_color = True - super().withdraw() - - def iconify(self): - if self._windows_set_titlebar_color_called: - self._iconify_called_after_windows_set_titlebar_color = True - super().iconify() - - def resizable(self, width: bool = None, height: bool = None): - current_resizable_values = super().resizable(width, height) - self._last_resizable_args = ([], {"width": width, "height": height}) - - if sys.platform.startswith("win"): - self.after(10, lambda: self._windows_set_titlebar_color(self._get_appearance_mode())) - - return current_resizable_values - - def minsize(self, width=None, height=None): - self._min_width = width - self._min_height = height - if self._current_width < width: - self._current_width = width - if self._current_height < height: - self._current_height = height - super().minsize(self._apply_window_scaling(self._min_width), self._apply_window_scaling(self._min_height)) - - def maxsize(self, width=None, height=None): - self._max_width = width - self._max_height = height - if self._current_width > width: - self._current_width = width - if self._current_height > height: - self._current_height = height - super().maxsize(self._apply_window_scaling(self._max_width), self._apply_window_scaling(self._max_height)) - - def configure(self, **kwargs): - if "fg_color" in kwargs: - self._fg_color = self._check_color_type(kwargs.pop("fg_color")) - super().configure(bg=self._apply_appearance_mode(self._fg_color)) - - for child in self.winfo_children(): - try: - child.configure(bg_color=self._fg_color) - except Exception: - pass - - super().configure(**pop_from_dict_by_set(kwargs, self._valid_tk_toplevel_arguments)) - check_kwargs_empty(kwargs) - - def cget(self, attribute_name: str) -> any: - if attribute_name == "fg_color": - return self._fg_color - else: - return super().cget(attribute_name) - - def wm_iconbitmap(self, bitmap=None, default=None): - self._iconbitmap_method_called = True - super().wm_iconbitmap(bitmap, default) - - def _windows_set_titlebar_icon(self): - try: - # if not the user already called iconbitmap method, set icon - if not self._iconbitmap_method_called: - customtkinter_directory = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - self.iconbitmap(os.path.join(customtkinter_directory, "assets", "icons", "CustomTkinter_icon_Windows.ico")) - except Exception: - pass - - @classmethod - def _enable_macos_dark_title_bar(cls): - if sys.platform == "darwin" and not cls._deactivate_macos_window_header_manipulation: # macOS - if version.parse(platform.python_version()) < version.parse("3.10"): - if version.parse(tkinter.Tcl().call("info", "patchlevel")) >= version.parse("8.6.9"): # Tcl/Tk >= 8.6.9 - os.system("defaults write -g NSRequiresAquaSystemAppearance -bool No") - - @classmethod - def _disable_macos_dark_title_bar(cls): - if sys.platform == "darwin" and not cls._deactivate_macos_window_header_manipulation: # macOS - if version.parse(platform.python_version()) < version.parse("3.10"): - if version.parse(tkinter.Tcl().call("info", "patchlevel")) >= version.parse("8.6.9"): # Tcl/Tk >= 8.6.9 - os.system("defaults delete -g NSRequiresAquaSystemAppearance") - # This command reverts the dark-mode setting for all programs. - - def _windows_set_titlebar_color(self, color_mode: str): - """ - Set the titlebar color of the window to light or dark theme on Microsoft Windows. - - Credits for this function: - https://stackoverflow.com/questions/23836000/can-i-change-the-title-bar-in-tkinter/70724666#70724666 - - MORE INFO: - https://docs.microsoft.com/en-us/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute - """ - - if sys.platform.startswith("win") and not self._deactivate_windows_window_header_manipulation: - - self._state_before_windows_set_titlebar_color = self.state() - self.focused_widget_before_widthdraw = self.focus_get() - super().withdraw() # hide window so that it can be redrawn after the titlebar change so that the color change is visible - super().update() - - if color_mode.lower() == "dark": - value = 1 - elif color_mode.lower() == "light": - value = 0 - else: - return - - try: - hwnd = ctypes.windll.user32.GetParent(self.winfo_id()) - DWMWA_USE_IMMERSIVE_DARK_MODE = 20 - DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 = 19 - - # try with DWMWA_USE_IMMERSIVE_DARK_MODE - if ctypes.windll.dwmapi.DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE, - ctypes.byref(ctypes.c_int(value)), - ctypes.sizeof(ctypes.c_int(value))) != 0: - # try with DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20h1 - ctypes.windll.dwmapi.DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, - ctypes.byref(ctypes.c_int(value)), - ctypes.sizeof(ctypes.c_int(value))) - - except Exception as err: - print(err) - - self._windows_set_titlebar_color_called = True - self.after(5, self._revert_withdraw_after_windows_set_titlebar_color) - - if self.focused_widget_before_widthdraw is not None: - self.after(10, self.focused_widget_before_widthdraw.focus) - self.focused_widget_before_widthdraw = None - - def _revert_withdraw_after_windows_set_titlebar_color(self): - """ if in a short time (5ms) after """ - if self._windows_set_titlebar_color_called: - - if self._withdraw_called_after_windows_set_titlebar_color: - pass # leave it withdrawed - elif self._iconify_called_after_windows_set_titlebar_color: - super().iconify() - else: - if self._state_before_windows_set_titlebar_color == "normal": - self.deiconify() - elif self._state_before_windows_set_titlebar_color == "iconic": - self.iconify() - elif self._state_before_windows_set_titlebar_color == "zoomed": - self.state("zoomed") - else: - self.state(self._state_before_windows_set_titlebar_color) # other states - - self._windows_set_titlebar_color_called = False - self._withdraw_called_after_windows_set_titlebar_color = False - self._iconify_called_after_windows_set_titlebar_color = False - - def _set_appearance_mode(self, mode_string): - super()._set_appearance_mode(mode_string) - - if sys.platform.startswith("win"): - self._windows_set_titlebar_color(mode_string) - - super().configure(bg=self._apply_appearance_mode(self._fg_color)) diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/__init__.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/__init__.py deleted file mode 100644 index a75c63d..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -from .ctk_button import CTkButton -from .ctk_checkbox import CTkCheckBox -from .ctk_combobox import CTkComboBox -from .ctk_entry import CTkEntry -from .ctk_frame import CTkFrame -from .ctk_label import CTkLabel -from .ctk_optionmenu import CTkOptionMenu -from .ctk_progressbar import CTkProgressBar -from .ctk_radiobutton import CTkRadioButton -from .ctk_scrollbar import CTkScrollbar -from .ctk_segmented_button import CTkSegmentedButton -from .ctk_slider import CTkSlider -from .ctk_switch import CTkSwitch -from .ctk_tabview import CTkTabview -from .ctk_textbox import CTkTextbox -from .ctk_scrollable_frame import CTkScrollableFrame diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 4796eaae19c48335c4e1f1bd604e99ed42ad1198..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1299 zcmZuv%T60H6!j27o|BLOrIga7>H|fn5UQ@Ks*6Bh5~WoGs$`86&BKII>~ZAr5crI) zD)k4d{z%uejM#S7T_tv`dhI;Wh*(!M=bY=Yea`r&Y330Ovia>Km_z7~B9j4JkE`GC z`i?y085A)C8-~JjbdIHPO5+rrXK9?)c%Ck>49;krrdgK5IgJ-+o)vIG;|wh_6Pp@m zX^E9_S>qgCWEEV|I8Uo=2`_0}pv!CpuV`GPci1Xk)!3wW*&1HcxJ2)eV8Y0`bhHP(mR{R-DA7kgY}7CFuIzOj z?OUWEiOZrAT;(0U6Z1Ec@~@<{l5%Pm97|k?g(*K#If%@ZQWmCN{81*Mv5ZaB$C6qUBDwMjk`7p7`yTcHj~lx_qalqf5qpgxwP zu*BkxG73yolrq|28d_&$unMhT=n9_b`iJ|{Iu3~lEh0R^>MROv$2x>XT*@QQ+ULDU z|30fNBhQbRwg0~L)jE3KY&Nak-Flm!$bl`0)!ePWJN{rv)#!91-`YMS!I^d7J67mR z@~m&WJ-bUn%Z)lQl$7;$+QIYB5UGFiD|1OKHR?QA4y9Cu^3n8KXoE(Tg})vs~Qv V^(aP(8YU@pZ?8PsNIZtn{sVvjjl%!{ diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_button.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_button.cpython-311.pyc deleted file mode 100644 index b059779f9e522370b306ad492edbc89f94664ff8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33778 zcmc(I3rt*Dn%=E~f`YmQg~2v&iZ=xq4A}VDeqj8ztJ?;@@S_@Y3xf>>zE#+58u!?< zt!!`0yW^R7(`0r=QyO*m(9=$qOnNoWYDR0VHi{#SlzU58sY*#5S&5QtC((-Do>iie zBIWzft$XX@xCdJ`_JUi9$Uil)jxsd z15V%s%M>@Fek~&wxUEyx>70?A>D-arY1@cxI&UOzI)5bJ!U;J-?v#DHV5ETAZBvEQ zju8j5=fR&J;h8;u$~j#$QpD``sp4tZh>O_^rb?zajBK!QR_-V#6u!#|4u8?dIUM&X z{?%usRIm(j9{vk*dOfzd?Ob4TCJ?s`&&^KxS}cMk_{Oa}ZEil_slLI0tt(ICan zhx^D(AOx!&*5lJiHKr1!nmq}}R|}x_4^eV{j!J99dJZKxk|S70a{V@co{+N_5ewG! zCma%-{(PaxZxf2~@ABLIwhA4$P?F-_fH?P=)_$f1yyra6A1)#u$dOss*0nn=Y-A1T&;M zgq8?y_~sbW)B|n<;5Q<4!wt@#Z-ku!p$T!DQMX&)b?H?ca zkA*tjlhniA!MWMl84=F0smZZhNHaY>8W7y{AM(Eyx-%+H(s{8PT*?C98J z;Kmn^5cEYg4DT0KiscB2qX7hp05KfT3lNs6c1(??DTF5C zc@zH08xx_pQ_Zta92F+#f^lBWxlfH$lyD{R#_iW{_{L_YX2iICT(db?86~{6qw^Try9+gMr7Z(t+!@U5;lCT2o2%n`Q*QTG10jb$dDpQzNh9hO;Y z9Pzx-z}Uo$IF{^69A`(_JMjNiQ$EN2spSLAQX!gF63@r@eyTaRn|g>)x?owzU$8FZ z2$mn^E>wJI`4fwUTgZJ-9?I3Db2s%FPB4ttf?;$BSQc^@IG>&-M6@KH1@30j->La> z9Q;A6`Utu6Nbxb~`c$XwW3;DFsZFuR2z|k}Ci)Ds5a_c30+o^qEf1~&-DO`Byu4(A z2R1EmVaBCsFtqQ2UC4iGPorHgkA;FY;VLlTD$9ziz+7U;6R*=zxF$S?@i>qjPhlD! zy&e}FYr^ALQ+^z2c#8D=@N2@uuL%#IhNoD^<3uUyGvh)LTqSx~FaLOpMWHR43+)`%WN&2UzBw71v@MjR(OIsAhWa!c>q$xf&ZNJ&6^eD} zaeBOPWinpUh8R_v%ZwYN0vD!nKJ8g3HOEBGYqUtLRBAO>3e9?~&^|2&%Er{|8O?gU zusazqX#>smn#)WHXhxg%HE5v=8{ulyUFgHUCf&6eu4dg;4p)oj5~xkIYOc^3%|<0J zpoN4zNuQ(*bhT?PGhM5s=*XPnY4OJxLqFBWQP88;Gw|s4u%VS{kT}qYKNtQ=o^JRU zE2vMkRTO98LRXXVjF3_(_H}FV5KFg*w`#t|FJdJ740luSG3L5uElOLL7?Y>;4;HW2 z6d~a-_ahe1&?}NDQsW66_^>jsCs(9SAiBw*W-n6v7OC@#)aFF$z#_F?ks8?WCs=nS zxtp50*uWRF*l(JFlYgPFqlO21=T`4HxTsS{lpf} z5ohj#L7JJGn-0YD;Q*r(h!?6J%$^qv0mi*gIL|il2y?SwpzJ>1WMDGn^NBPU#ckl< zrv33Eje$upQaRI;Sc5V~C0^_sn-hsQ^Jz?%&%|aGYfg>ND)BM)P-TXEp?kCbc!5vn zxOktD<#K9?Ri4Y?OEOyE9+QqF*Hz)m%63)zR^z*B5}{cbFB`)aPf)-(*0_`TX*{t= zGg#b}$Q^NLYUXS{#;p}j1}6hx!~$dfc-5#N_=1!3eiTAreDcPe2pg92M0%X}&CLqn z*VJTMX{nqtE3G`0ZAL`ZlMy4*ycXX?fHS~!YA{)fc%Dz?2=mm!My+c+VFB4xrZC^9 za)t47A6pE-iPXg3`^33G0Ia%5{7!tMZ*+Ec>K<{`H~b-A5E(%j+Kk{2PKtgZ!EP7p z?nFDuN0v!65zoCLP6{INGsuzvp@h%Rq!RIpAmFKWmdYigm_A zNs)#~v5O2E#zY#yL>h+TdAIJ4ilD8)ha!Yr#peqW6|_Rj{5<&GkH&UiITyr2;EErs zv}yPB9F`MTyx{uBre@}ZD}yt)*ka0mWhgX z{wrI1+(*wHzY?MV-;KG+D_vM++_`dU^7@tFWXQh-tF2pD@ddAp%>_d<)1h0Fw36z+ zi}J)!fiKl&uzM_Y%XghEExTs#i3dRa{00&gsb1P>LE~ERAHdZA?+4tIQYCvX*eU{oq3zWD`QQ)^sNTQaZA7=`RD#(O6foLqDtvMC!K#&=^vHwzWts5 zg&Ej#*82DAXNBX2te36$+_VPhLt$UiXU6(l_48itqoUZYJJPLpeqF8XI{D(Hvg@LB zX3awaSO%=W?o@W4dU09V zeMuUbP7tPmV!6{#{BDb%rdB0%&*VW3wA!*pB z9DGw6y`vnwD;>Oxv{$X81n{agNC4>r&ye+K4gg-Y9?Jnh`Vhc+)WBs+&_ec>Snp~2 zdSZRA)3+UAn<`PFg|Qub$fG>g&AyefU9UZ>{%1!&IsWwc((xDDq9@;soCF1a`Q*5A za-33p?%4QPcyjZjR@u?6INDb@OTiIKjCVac5#@U$eDCr$rEgH?4=em(i9ZZPo2#Om zIwPApm(IzX`jkz50OE-4+)HRHRA9G0+9^9a6-OrlJH&vUjPhL(zH2F@bRU%Y0firs z_yGW`u4l;;p9T+H&RA^=K1H$W27LHf7ceOH=6}fJ%IlYMW81dJT05ex2P3TqpEoH3 z=j7J&O6&PpTW7RwAksGQe4BFUg4}jdX}h?RpHn_!`H~~^x6CAXD|W8H`G}9&D}MtW+0Uz6!l4frEF?*>+C4 za9O!ID|Mr|8)7uy^EZRd1CN1{Aioo{+w55l63l;%wmLiA&Fm_~NPuQZ_ zj9d@4@<|gtwyM}s&c;{xGR$JdVudjlZ%xe?y>aHyHx+*lw)r797!P;AKL%cW zRJ`ZbI1)GHq3-dyz?ix*Ga0()o*9Qomgdz?e5a<|B!ImuVm5ZqfYBC{Nxi?z-+P$m z<9)E4@{iu}@B3ZhUUkyl(zDN#FWx}O#d8T4xC^jkOb#lZg|B#-f|%zNr6lf-gt>mf zV-*7wAqXQ#UCQkiZ)=aA>HjZ`dn0u_q`Do(JWeeQK0Ph- zyA^)7#P80W$EoGP&rZv(0mU^Sxdt-labbD*v#YY}km5QdY43`YbMFMcl|s(71%)Dt zDETqtxJW&QL`z@&HGJ1DmR+z+atqdkFqRAJ<0&BNPwJu;{X`#4ANCntVZHz8iD7{d zLLa-#{)T=Is*?iQrxvqNfGxOn5v~zN2HJGdYgTG>ajX#%@P11aZwZgXP~Vrt zT@VW++pECrOZKXlj$*}8B{^Er=M=s=%C|)LmZiaH=U}9B@cHoHjL4mDD4lOee2dJV zQTQ_we})06jMyt>do_4`$zBZ~;*Dw}_S*1pw0VD|dH?fV<-m~KJghVi$6DH>Ee9ek z2cDNH2hYhZ=arW8D>+<2-IrkWE`rG-lbF7X762k%Cp`FGp=|enRh6_??V84pM4g4P zI@D>YYi8ds$vo{WWa5C5$2pfm9`3vVGqZ%lHIVIwvmQy=vCEMu904>OHftE8Yj zu*clfG0LG5lN(QKALZBxVfBjd0IJ8X)@?DXTVWDAszJzNf@&xJE@G_GlaoVBrjGnR z63W&T!_> zUv$qxmIU@Pfc^CucS3TL;4Fjcray_~Cb28eA|(cXwu`UI7Tq*ks4?%(h_^wu6kFFu-s!){-@|KOkQ=iQIrK?jTqYR*K+j#R>ReLZdMzh;G9r7|e^X znx+bah%-!a=V3hHzQ)*(b+EI9_|K*Y-z4)b3g3dM!N9MD>z58L-+q1u@+ZDV=Fcnq zc}aW0Zt-oHYF24sXOWAP7WU(iVJJbZ>LYZ>P^;!HFODD{vZy{;ha4SJHbyFJz@R}( z-TlJ=Mg1e~F}FuEed&xC4L!!ZJ#1QE4l+X|sEI+%V`0Km3~RJr5zmt`LPil8)X?G; ziDd}2U&xVXNuwbl`!4m7tT{#GT*f?8rYZ4{0m|4GX&Rj0Y#8klZIOw_e@>DA5(d~7 zVnnJXN89Jc6^l(j>iFm_xp=Emymf`kb?(@linm>US&Hr3;0n@f{JV(M^d zRNpW+#I-bOl~)%35s1V{#F`2lf7p&ot>~Y|LOR=iib!LRI(6n_M2k*7nw)Wagx|g_DE&ue{+PlallWr^zUX_!?-$GV z3dr6dpHp8}OGiwiGFp7FYVx8Bq*hZ(q3KnDH2RZ?e@u=}k1Y?kp|bU{E88fPZS2Xm zh{Jf3asC4?eH=132XoV6b7^uhmvIRuSb#-ew&@v$1z7Y^)2K^i#`rYnYv9aX6HbFp z(6@jST10EeXMR#A3+gv3DjW+CAGY*={GNdqTUfj1rAnussf;kJ;#}={0RCXllNqbhQFP9eC zOykoO{iHSZIq0ZlZHpzD@vJ|^(-e(&M%e}px=@@DD0@w%l6j1P_Ec7Svy{vFQ>4=y zIQFrJH41ya)e2)S=n2@wrK} zFJP<@rL(nCk=CTSb6=WF0!Jv|#cFmBM?p3KR5#|=`1 zQ0W6_VGz)6GS??7Z+9Xp7i!mRXeafWJ<(&o89faeG&BCEY4ik0F#Z1|-&x0&EWJ@5 zyS`aTWEr{ANA$qVH!6uNxyXQLj}Z^!DU;>jsMVYCo7!hnG+Wo+)0;G?;AJm>ie}CI z;IFfdSx+~cTM)(=Jr%~777c>&n@aCG#v&c|*BpypmHt&@(W}z0K9(3tGzm9|`+*cCPjbv%97gLser1ut0;$h6!!+xVHy!Jk$)4SFd zsbTk&d*hYqijkq2Ss$IFQB_PWI9GyQ>3CJY-_VchFwak{@q8R6f?A2~}}#jw0V7gCyJ7Z?lfyfJlm9cv_jbfbE2d zUWzgaBfgobCK?D%9H?SqcT$l}sKKg84pX`tl&%o_`_t-{TzpevKQ2W^70(m=Q+^!L zsbM&nG!_Cc5eKs%;|fhAv|z;n0(yju?-Jw!pLS$PBZlDbnU zeutu$iqHUp%4d)$r>#qUbBQES$&JHlxaNzKViu;X`Ac{PJHZPkcNxCteBUW;YLV@& zioI2`w=(gtM|NyyTZ1)GUKO}R``?K4zagDDr<@Vwe!tT1kM-|1c>3l3aixD8;y336 z$=hH;-Ujofs=3e@;Txr<1J6Uzqt_!xuS;V$ehUqEXyL7J+#%~Asly4D!%WG}a)c?_ z;Un>lUvixDD7j%GD$In~Sp|6TMQ-%iSmfB4BupTZ-*Sjz4O$OV5WO* zXo{ZjM^5;q@ta6=1DOQCBUVP!4a+eCcoJ|CMxO*ghQN7(0o2SyN!CU9I?3HD^L+~6 zC-HqRYa5i>?r81lNbTttLex7E@lHsS)5_$6?7gpe@5j7n4W9R9?>mb39kXY~m~YG8 z1;xAYWqwZGJE&1Iv2zTi3BG!9PI5HS+qOq`G$rV2i0}AW2CY>9dXBOYu*D~B)0 zo{Ng-;);!PHhsxiourya=89@UeWUErJK>s0ahFuw1sU!WKI&?XxLTK-v8~&pTTe!| zo_sO*8?U_evamQ`n@kgznPc&N0j~%czt#=*1v<^ z*Y?Hs4JiBGSaIexorS6*nZIS`<6J2ItQ3LXsH;BWs+V1jimOp_HNIR$C1{O7DM~iR zROXx$&M^0IXE zlRY1`Dh<7n(q5^wH&#}zlr=@mx*}y=%iE%T-bf#cLwS8d?weHlCZ)12x$Krwc1vRK zOJnS&Xz%GrFS>x@y(ahilwKc;{iag(rd0MO5JgM7BBf9(efo}Ex=$(H_k2sF^mVE9 zbrVh<%5MU4?^UJuDg$y&DZ3`IH#5pik^eXL3Q$}o-K@5Vt4(&bE3S4FLaecs)f`%G zO1+W(m+KMwRs(Az(A;YKys6{E)6dGJrhRhLKBZ|NrL1Qu8zQa-+0~@Dnj}|KIxJQh znN_|J89*{>gPDTNN>r-^X>9=XzN);Nqh;NZvhHLZ|K=UJ@0!wgO)Be_%X~^1YA^A! zB40;*?A5qDAYo+#D}STjn)qyRZSW{cF6ixjGT?g+j=RH&HX-*4gzA)v32e+^d3soW zS~@ihm;?xwGs0w4WZsq!*>prC)@Rg_k5E9o34Dl)V2@ddVqW0ghlpuS@O5mjzy&&z z7jmTFB5{45MwRg^6yg}P?Wx0jod=0evc%_cWIA(vs?oFu@N*XOGQ!UspT}|PjPa9# zdcldh|4~*7i-ZCk8brG=YqH!d(1?4u6D6rH{2ulIQf69;Kz)`v0t9`#z+Bepc@02p znH@tWTC?#mx6Z6^3UJsy4UXV~+5-Mf)NcF+)MmtD zr0?O{sLhz`jMQ%W+SC@{sIM)(Ox8_pDd6O!!^ueP<^;7TfMtCxAqy50we?0g#LqB78VuV1h+6{CLcn0E z2E;8vI9WXMi(CA0%UvdGQAIP>c-~$0N|SsXy`__*U(jUevEmdi6U)&43p-s58OFbY z-3xHkvBWYuyFzMG8K$e@Jr90-Eqd8!BpYR1ildZ-NeW0DA(F_9>4!m76CgmY0E9OJo!;~%GUp1W`S{a( z?xy;bCiH_6C4&>AcZ2awDV{2E!61$4kVMd28&Q4xaMuPJGkg`7{ z5qCYOxaK7GV(F2L&%*i@SHI-yhr}R(vVXarNeH$n{5FZFV=hs?Il?!G$Cp7%v&`>M z_#F~^St1rTx@=)#y$ate@u>O4=@t{6?1;}XuHoh>L zsSkKnBW%q(?V1e1df$T8;p%vD%zQfV=qtB%;mLgko|N-5z(Z3Yd)9@=#_-VUL|*}F zaOj)0JZRvadd^0Aq3t04Z3BzLlnpo^+xMmly zB>8e`1qELdOUi{(X;^gbj^(BBYhp=JCQHMj^Zg8qgJG%8TGQ#5M(Jx(mL6+$)azi@ z^eM_#C`(`^P=a|m?o{> zH?Y#qKHqLg%ayJ)hVs%Cz*faUBW)?eQ<=3a(=SKU`@K-c(spG{Tb4$nTcc;qG;U-# zvX7n{({R*lIN0d9=@sReqT+?tp^smnQJ-x!nDkAnE0iOytE4q+;xWg#sgJTkxv&{$ zqrpq5XQSESlnO7qt!r4lsf$XNUDqY{k&TE+xuQ$GBglgQtiI`!ydVf39puqT#uhTV z$mk}6nzVXPP*Gyz9Q)>^03hx|h^Hx@GdnY@?)lRq)vyjfM$Y48oFL;Q8En`7G}*jl zoFRj)yT41e^JK8Sf0};8e@whZj9C~d$BBu~`O>6TfR6Z0@U6k`gV}>-K+I9O zIIiyS#v0mw*8bD>C7;~zn$qyvdxHvJ#}+?y6M@Xv!70I~rv5$eOGm}xd92WBkzU{W zv&x@VE_vnpJxcu^N>!URRn_7h$MM?^U?{Qy#GyQ|C@5#sM0n{NtzQ$nwOCOZoIKAeSbdk^AQP@ zY#CCvFiP4JkxCw)$E6NVjG3HKZ15` zmvcWWWZSfR6xSZfwdbWnhom0VYX9hlT->D;caf6EX$uy(PYR>1T@lx=XHClPld|iS z;yNX{PQ@x}q7_|{ims(Qe?I^7`DZP1_d&YWr(!^<7$7P#fIFdq>yNnlmqW^qW3ubG z;yNz5j1-D*iRu5VN~^kj$C(dHLdb2}M#UyW@_Hl+ z!QiJpEJV9Zh(Z9#5TaeZLm~PCoTafD@aRis7LsQO(HFxkB;OE{XToDQgy;)VmZrcE zqAwm5C%5SQ*+d>miTvY%oiD^c_jH2&G2u- zU^9HhqA%j;lpLM0(#=XKJI?K_T6`zs+#)%*Fu!KVSYysAsjfTX?3SF}%(GSETVEpL ze8lOIoF4c+*(dS!h_`q@;_Q^1D!e9%Zz8`8@D>*$&JM}h!N4^_-HqYc7IAKqoZFaZ zr^I(M&s`DcF3GuzdG<(r4|%#eLeaEVxZ!4mzK((>=`c(UVzy+7C+E|N>Tl~NL^rym>E$E;qAH0Cq# zIB!A<9{Sj1JUE;jeG>iWc1Rx$a85)YXY}!pwmS7O<{|D$&a$a*#VJl;OrB0rj|FFj z9yZ`ai%UF0iV%? z+*(;^Ur)Xldd;IEZWN8%Mn&w(LCZQXaY1Vi`SPzUlRe=|4q~yWh=v#21RFLzsro4Y!=gw@msHZV8Xa9k$1bI8m!!R4 zpN`EagB2^>2I7@GGiB);7sMkl&gVG_(>#g@mN`z8jD1JH81mo1SLbgY&{(7M zH219mns@b3oS!wQhGiD&lZsnre`>N2TUe$oPutU@pCdr zf@%;)kXFDaiL0n=^z$d7c!}XShkEf@kg8nYr@se>Q9PhudiY!Fsd-vYeY9s0>ff}2 z2ygpv&vIL&aktdCTidg1gJR`}UddID_hnO?(zG2G^d^Ju_i0`CTRL`0?i^7%M|90^ z>F{~kb3yT3(DlAAF}?3gOz#^e>3y5kYK@A<(uvD**A=A;+Qm>azN)ycO0KK4<%cvz zRZzNAWGNKwJ`w3YA)UM;cVAVy5fvAITvJ@vB<)>kq-*gCx{-(!b{Y~$UnQxI`{Y{_gHTd++(BIY+FJpg8&Q{dl zbXVp%9Q|!=m@@S@ott>L6_|9_w~fir&yKKDPO1H@KpaCMs*L+TC)=uBO#B>C%-v`n zKB?V^T@z|Yg$MsTLNVdBZDDs6s~Q7WBdYkv-SlA**jl_V6IL``^$uco8JLp^hz>>C z4oQROO*m%#)Q!KhUFh0tD;N$FR}(ramfDN)@Tz zS7TLcjE1jN{)2ujfNo|@-mGuFgw-5YLlv|IU=kcj8yJFu8f5)@-uJySUk#C+q`hDm z3Tjw*`h-j(0G7u%Eap6h^iEGVo+Fq&2|e*42>;$ zTDa~4ApJ3yv*Gq*>wK>pmvc=8^`c>ZuJ%Cgms%VOD2Qy@hE(Wh_~w%^^_(dx!M*u&x+($2VNaXQp5-tpt- z0@3mCd!-CK9je8Tj*5Sa;-_CZEj&LuHRnH!HKV9baO{{W+sz`*QQJ-m!me(mQ9^Ay zDWTU%NsMwPx+~^l|V9g^vpt$HK#lw-#@GzM)#G5#$YiWrJVh{m@d> zZ`W@NA6+hEH|zH+cF2JH(dx{TRegl754SBH#VIJhUgq~HJVa0X^c&=~`H87A?p(U? z3_>WJJ>0MG`z7r)O-k`R>PM5pnBEXTG*u>Rp!msHYM|DK<_4Lvl381Wgqj!%MD3s5*RF|KStt0P@HO*! ze+M7q$f?43jXJ=O5JV$q3HC(L>cJ+|-o~L#OQ{H+j7<1AMY{T!dO%ggUbT2EEXei_ z#oi&=JJK3IJ2HE0Nzjk|rnP&zn=^cIDJ1g=Wm=|MOg}RbeoLa?n%Jt?w@TW(%JjAk zq?@O=wXkGKR*Z&_xNRIiNE%F?Zp0NTF~g~J7V9Jx7%g})zq9?iXmN9-xLGc4Rf_3I z`tO_80!9VNrPApAd!pB{U#`dWrqk?+6no_24yBkX@b^u#L!|`rxG{ek)zCCIiQEiv z&!p4c5h?DFi?=AnbX_>3+p}4uy%dr3&b(gr2h~VN%FCYNVfJHdurn#eu$P^05J|x) z!Hs*p9?KE%hTdUMC;i$P?b!Kz@j@Tnkv%s>cHZZ^JvTa)2+8;P@B_B^L9`7363;QTOymD?m&KcJ=#OmsC=snim7i(>Mx$8*m(9zhD z6S1QwV~3C9tpCfaqp|I~aGLyOO&fmZC$|3(h1Rw}K_RwhKh!m1b*(Eq&RJ|5S2!|b z71b*_WO-R$wPIubd0b`9N4(l0EGm(rkaM>!<^1UWii0_MuAzCw$*eB? zW>2^@>|Z*xT)K4Z!x^c5yHeG^Qo;f^aMexW!%K}zbIU`|8ka9V{f^X*lg;~;ssk&f zEJhhu*BYK%8d`3Cmh)`rnf0eJ%Wr*FCv_fBS`I2T11l9QMkUwU&1h(Tp7VU@x&2q& z()Qy@_X(xt6TtQqwF}V^w6;osRv8ok(D|Y z+0AwLt<*DX1GjbCN+Ywja45)DW^Loj-C-MOx)2U1?(NFv{uK`kXy@F`;R{Oh_T`Y& zyho|qyVAk@JGqM5#R;ix?=wNF9Z<>-t!!cbT^wqun_0JV6*Vh8%-YLUxx@CQ4NF5y zn-zD@@;1r6L#f=k(#Jx#an*Gz+nKeWD%4QtYRzXb1J(-LAm%GFm&%tLpJLIQ^fB4{ zc^iHeDuYpNwINjo!)~KC2O~VhKF>Bwtt1w4Ofn>lDbNoQRuhW znpSWt$SS5c=YYj_2=GmxLF`|8hI);8PLFy#06EU6!6&u9!=cpKvAM)d}p54h9J zwo=<=_@|le<^r`B*xW0e+1Qk8YsF>Cn!y*?4geCFi$m&n88QxXzp%X+lZGz5m{g8k zRDCj-n|NCf5!|yFWS?b5zUsw1RHNErBgu(oC+Q8XVz60=jfdDzXEKEt z#>IFZewvZ4yP*kyjr}4U)!C##(?h%n*9G~Z;0I=p-HSsqd+{I{g=9D=PAQ9%xYe4C z%Ko6pQ*b*OGytnx{G`IbXke;>DoMBD_dEMubsF0z=3)q^Q9MYDB;-LBON=Xe!2V)f z;RE&;<914GdtY+RlKG8sb&~mwaV?Vhjd5Ef^BdzTB=Z~NswDHfl6Sbkf?CLIKIXq< MA-~NM&I;rI0($Xh?EnA( diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_checkbox.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_checkbox.cpython-311.pyc deleted file mode 100644 index 09669355b64e95484f53024ab7472ffc41e9f271..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28996 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 diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_combobox.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_combobox.cpython-311.pyc deleted file mode 100644 index 6f08cff8d47785ca19ac0a188af566d56330c3a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28000 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 QAGdx%Lw>hKI4zt12YlIvMgRZ+ diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_entry.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_entry.cpython-311.pyc deleted file mode 100644 index 021a63aeebfdc6cd16aec672036339e809348dc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25678 zcmdUXTW}lMl~@A=z$VckKv54;e1YH-d`lv!_luIKH#m~0$8aQJKy;IWL;#uwD2W`7 zt=XLpDQ8GF7T1uGHjx^=f9Cfp^u4vU{6?Iq4x}%;+Pqccn+QL|w;|yQ<4#PVI?xQk>`4s-uXL18? zxxo0j&(Rz3+p_kHu}D0YwNK35o)xm}`0XTkL$lek!?F3#Er8^=WGjwL+&U79-3cYY z!%f@}qQcowEHopC;IBL?hVCAV%|v1X#scbSC?On~4J8n}9QwCymiuc1A6W!mPtErmvt7yT0)H_NpQr(HZNuzZD3!B@h+Qvg_}MKU~B z;CBhoe}W7CxoK-2&*AkCLz<1KShXD5Q!vK5v5rBRCPJsRVE`S64Zh(XQ9)R2Uy#TlK`vC5Em$_$|9D@0G zILpGsI2KEa^9%1+df}mN@7+l9hF6Tw#dv}DhT~#P5EH%Lskq1sVy`zT+)LgGiILFM ztl&+|-M$?clfB;Qcz7=14aIox?b%RRxDlTP9`mT;r#Z} zN#~8vCB4ZTf|rLJqCzZ5 zp<4niJ?o6b5`vh#8{v~TvYhIHSs#fCSy#?CJx#q;_Yz?-K06zZN25^ZtXsH;%}5Bd zLKv%-b!+)+7}aV9YA2{ARIBKQpwAybRX=Y45Xd@{Vknll9TK5QSw}RKND5-suBLR{ z5F#@-l3AD9xj`|+N9Gb)PR%N)BC%65!Ek&wE@s(j&81Plbcq?D_*!B^`eX7S(Y<=S}rdb2K{C;hc&EwtFHb92A z=O;h!$h%{kp*~1xMbBb6U;dai*JqIl>I?Z|#k$HeEbg(5YnD~<5%l7xdQU<*dMg$y z*HuoXp-pR-Q(06_h1T#zc3tH-*HsQ%R1RfQu&hPfy2>#u)-lVX4SEFWkv@y|b>-kP z)YP(Qha7M%p$}gUK9}ZOA@1`w(-3=HuPqtI>RmuKQI< zzvg2Y^PHiSuqhv#cP+Y#dTz58n;g(w(2LB?e0Wzr+)S@xvk@;l4(+t6?UOXfE2{dbl|UNa54)lE*a{!`y7s+&s)jT(4-0+O<&Q zFSJM>&BEMo>J(<|X@0{G%adpGc`O3;-R#u-=05(w@*NA*Qm2yS1q~0{<%U(R#*9x_ z-R?Y2-esm@ir15m&AUqA_2y&qt`c~C`PjUx5RYeof!PGIgV+K{Vg~{o1hEwX5~hgj zG%){;yL7V^aSDsrKNBb+b2lonk1G5Q2gz#>Gz3j#DP*SC6JSuQwt8<|QqSq0EYSO`Lb z?B>#ii?~H+Hw8ntZ_myn+cqO4g9)fwBsPq_X6lX=;7@=$) zMA)D}W!P+a@>V29IY!EoXKQk0(6;4D5OMp0uB5DLFnJ5o0w*5~C6i)gYAz`xpzmmq zh&vk;5Ecb&98wZi8ixY?hH=Y6AF4=Gkr)rHNM!A_UjAy}z=hdqb++Xvnm$$38Hm$M zokRI4g;X!%+|SR1tV5Nwfk1;{l+lC11nx2@f*7CszyCMkJy$ORQ=hmhfbY2#Y)dbA%zS}@cpi4+x1u-TWkLJ36;4XAS{B8n%acmO< zVXd3{Z_kUkSuIp+B2>RNeQ_^Mya_z(Ki+44*Tqy+eXIOId77&kDWLPfEwkT{%s%7c0#J0$6KVkbN zwja`*u)JcCj$i&!1F7p-Iz{Ssu2hn`BNDvVLg{M>006ohPiGz zXZ@}E^RDedRp#_X>GZW9?IZPlOE*dV?v-9re_Vn$Jd+O3E8%%a{HEoY6;kq+F-(a+ z@7f4ko1u}sWz_oNBI(?{(oH&#Nn_VZXHe=4Lb4OqGuHo&Ki94Qp#DH$&^m{Cov_}) zyzmF}YRinjCXI)Gbd@v?ELW1oy(8u3r>^$PsubuszmWQtcUA38(ZTQ=i>FUGZ_Dpv# z{&r>>{rI~zv$-C+&6ye8j@~XPytOmc`{$Rx`|A6zK74igXnN?RGIa83n>;j5hQ2c}etK{NsdEgB)@W#7G3D^6ZE#4(tW@tFm z*^}-(taKiJ(ndxv%AJ=;=cPAd_Vi!W(k}Ec;<(2($+!QIsg3{}jOYK~87fs4{G*N|+H zi@T}kSj0K0`IY7J^Q|MlGQhza(Wfv!RFzV7scqqc7nGIWm=FfGBP7mywM81VFQRvP zE=F}1u=^zEz42*KJ+{I?XjGT*IT+mfA@70hv2UxPuaRFr%UFQ<`^5 z%{z^#SC@uJ&moyROt{06_O6yO-d%twVtHX*%mxo`j+7kkL#=@vzI^yCJdn%dGP6#b zib^_B7zgwgRY8a!Kp2u9eM+lLAYaHisf)QNbgZG8FcP3iagfvn*B7Qn&V@d_Z2`(N ziyQ?$XjNVz^MV>7H%cFK`t_vX?F*37oNn6s*zpnc-KVtwFk?7l0JeX<{rG}%^OMcg zcP~isHMPxO9-zWY))q_L6+S7;I#iZFTL#iV)&a`T@U8jJk<3)_#x6$D9YYWYkhR?o z@%Jd4_g9J+X%I4e;wU;d1fw8gMCYQxdqF@%4o{usWe_f&M-)3%{E8Fc7LNe<#6stF z0;f!FMqdTz!lt4bjm6x8sKk!}_dWw_@`K!3o~mB5EO$t_sP881Zi(If%;_f1rc@j8 z?N*$-CFgF#1Wp}Z+O~Y@Ghcg(Pj?(rIu1SANDfcP9T!Q*#a~~(O8J|+%C)=Fy+z;# z<}GKfz#;^!0B5wPNx!TJdt{fRXoZU=0CnRo(zvSqMuiPtc|Mu`vA{UVk0vUb>w1R(HeoEH*U zd6XB_jpiKq7Mk;9Y1Dk{GTvQ4O6&sw1d24+n0B@(&KB9(N}R1JQE~buryqzh&2=bT zhs<>mu1nHh*hIK)h%eqm9FQX}yw4v1?W4Bb`T~9VO`J>gS+sz5(Tds`^Y)R_7bp!A zf1z8A!=*>Tf~YT%<|Pz#?@(4=t4vG5y3%LOQc!bJ^gt>4reV$%>a|viHI~iC)j8~V(3SC(sz6vPf83eevs%vId5Qs4%3cN1rYkpPK7jeZDg8(#ww&6ju7{cHw z02(FVS1I{VA;`GE8tU^VVm}1{!exeS_%k~SmxOJ2#7k^nY8rt00w4XrsdCAwp>*qB zrFHMh(Z4<=w;m_0$0cN)PZ0Km#Gc44(B_q8febQyf1LOGzo;;PH zuRO=TCf&c}?0Ug`)aRIaroeoJg)z@eQT=JjxkDMuQuJ&Ki1(p`Cd9V^`dO7^-IQc` zIO&Wf;P^73(&jsWK?zj+XXyIp2n0G6jJiZfMY$o7z|^{-3k^woh*xnv0!LSJgL4I>vaN0@j_;h26S>Urho$j^*|JA zk++?JUDFP#Z^yzF?`_bWf#?^5^Ygejr?JXOeF^mt9~F}kICZB;Ikh1@q*wKvUS!!+ z%)4>%R*15GUh$hy3sr@V?3{?)Kmc^xC=QC0rp#+#)`{7G&Q!#0JAqhqm&HNJZO!B0 zG%jccHS4z_D!~H)`ER{z)+!4sGo&o9!g^)aM_8Z4`d-Lz0?!F=@y2a~k}0+P0vv^l z4UDQzSxLmqJ?2SFkJxm)wHBBBXq#!t!WiW}GnJH<{meKj7xjq+N9ZinPu-h1aAliB zAqsN;TIy~QM@3yf%3;4sit%|(h^KoJP6}^sM|uz33m$zn$f5sB2u+*@fU7{Uvg@R# z>>5_M;boqT9GAHhggYT|Cw`-@8SlBj?Uva(P&a{apuTj7#!LzuWIN~>O~X=II7a5) zNa^DMY4m5Y6dR<^`L#yuWtpv)-ws}oLf;h3)bfH9YcOZ#!_Bv>i`Il4)LoW2=3$vw z2^6lgXr&o2D6u5N1u2op=wq%UFn2HtW~Ot^Jn#&oL>|1RKKqrahN!D4dU)H**YV|3 zJhqq6_aMtppFdXLy?njCjufDWfz{7w!V~-Zf8w~TG43yD%^E5G$m6m`DKB5IuOmhA zxU6GT!0=_w+33;e**t?^K1InxucsmXz}>_f--9~ymi;|kCp<=!3w!C zRU`R_w`Su@x8{$QqI7Gh*jy1915*X-)Qsqb`k`qh+5vz$V=@6&)V66jQ^=Ns+8>U( z(KzC}h_r!^!09YldE&wR3}q&>8{jyZkH==`4PjNf5rt}IpjkDlxtC?F(=++JfUOjA zd3ka+n0oI1O_Y71LXCI{tI$Xf(Q~$|K@qGuK_pM!$eA^$!q5dkRP~#q=sJRc%JT1E z4x4i)?Z7$^d9mv~*SB5L<_?+d zgtJPC?R?hcBTWP8rn5@Z*{6Iua6<{)fU{H*S(F2Bk-%G-zAR8{97+$KRt8T$J^HJFJop+Jd=2!l)m@;6t-b~o zL9)BDb}r(N;1FKtZwk1GD7PbU8My6m4I{)x=){psBk%I*nzxEhvs^JF() zI&gS*diWJ(_!a5gMRG1E55G=^UtcX}sypC7wR#GB1>mX?R$|frKR2Ti_0}+!tqRwg z3ee+Uwfo4i%d-Cp@n6aG4yJpLE4{~`+Q^AXx%V~FizDG`Lyb5c34o{(2govT$nEZh z6Jl4`f+Gy0;!`{ZDj}oS<&Gff2xdn1q({yvBj=>^m&o~;JQ61(@yyV!^w796G%md| zL0*}ahoWRCio@QD!yc!@9;d@z0NES~6c%<~?zliYE|?3Ol1IX1By2A1b$KX6hC+H_ zVOm(27FGcFGOhbyBB;WqE@r^gMHU^I>F3s*Aj4Z0t#=r4&!RO2!Nm_>Ah>`HpDy6Q z7OLmHmI#vL>w(NfC)z*5T1`I>!DiY~g*QdnBb;F|qkY+0>~a4?qZ z(xTIHD!!zgVvBTL5PYd}Drq@yuGyYqi*#ME1RB>Fa&gQ=@ufvUXHvHd21B7dI}0<# ztaUZa9i1)JC<=dhu=6$uxCQB{^>#_N)vS&H^6=3cuFA zQIPv%kGV9woN3HGujuACL>QA5KH56zHuz>LQO_;mq;r41U(CH?%$Ki*(@xm$)KpZ+ zs0mQRXun0ZkM4wQCJK$Q+aXYFLx9w(s-=6t1&Q!SH7doa2m$z$t;+G&z+R&;AnwGt z=4=^U{1i`Oio6~h>rJ_N%B8FPI%VUjOmG!rM-d!DFa{v&;NglG*yUbEPua1+(X2xi zO6YMlJ-sf_!iwL)#N!A~BM2ZkjsU4doJ4@fj+%_{6ATC;m;z8B6QG2$utApz^i#>d zLDVT#F331HJe-!C4e(~RdjD=5f+Ij+TlIxfHFbJCd^x-b~Lxy63Rc zbNETe-*x{@w{%vJN2kf?wA?d8dS)<5S1w82qf3&r72Zrsd%9(((z0{K@yp6zR6aQ% z?>bL*otIlKkd_OWqNzAV=f_)rymcucx9lY?dsQ4f+;3F4Mwx3ST(iVsYq2p~A3?XZ z!JF}Qecb)y?xmpY+fRJ^F;z1)2`H7SF$I0r32&yo=i|vAPfCNMa{Cd|egu>GGVU76 z@7i2_Ms|1Ghch4Cl0DmrXS?LtZi-3qq+_4#*-t$CCHjJ0Xxh`Qc)DdzFY)wBp5A9p zLzk3nAX=KxAx?tvC>`Tb!i`GY=rd>aL+H(Vct3O3J!<=5_lGmGyPvrG;h@cRmh$A4 zY0qxOvwNkD>^Uua&JfQT$#W)C*O;#BSL*tg?)+@wrwc0`^1xxpTdo@=b)!HLr%GgZ zO3Q9U@r*1d$<7n9=Opo*lsqS&6%B%+W?H9}xejLb9QtMVFS?&xlJ}e;d(J$x5zoM~ zL-y>HJUgLdbg6FSXM29SXBmiRKk0#fYnMF-i06RhIq-~aL|aqBHcISucz^93TE2u9 zH&JCW6BLN4pVNdAx7tjX_^W{jLyZ71WdKK>RS z-&|ml_4#=7j_Wl7_2uh)0*rMX_tnByJA)h@Z(vEV%t*N8!P z6<3Gk>cF7A64!*;B}wxE$%QWsP1m$4HK1pZYj%*D9TKlLUwDaI+onv*!-v`{@N9@9!-=6AQ;W!RE5ltKD^i1Tny#1w(GZ z+u76U1uO0eaSoEky>LGYuD#q5;KDqx8}Ka*nmZ~{@q-p+kWav0maV)Lnw=Al;Y~7? zt(k$=Yn+4t?reGP0=xJ#@M+vc?o=L;4P=If-VM+P2_#@RjrY_%Onk5MVdbN6YU0tY zN4GxP&>%JP@&_w`R2*to4+fL3V+0*)hg$Unwp=%g{7djG zxb>w(P3yx^z5+35b6+hv8)0Z+|8IH&ZiZNDM9^#@M2c8AOolI? zg0~c}M5dbQo2;=0ygjL3GX@2TzTFm2pgen$(#2VGPEeXY@4hA!L@RjDb3t{)*dgy2I2D2<6oFyhAu?gB8{ zt6u~ELX$oRO5S|z#wpK3=#39MKj@LUe!}%jT)&}^M{l6H{Vti?O}O2X_O4bl9LQEaXc)ZE z8bdQ)FpGasG>gSw0zE*e`jp;53)R_h>59%*@h3Pd@xV)cOgZT@T8qVBm@oQ_Hixfe z3jOjaN_~pN&_Z0%iXNC>2F0YoV7h37%C7|LQQ014uGL(HJl?XP1&^_R7A>eOdf+LX zZT%3MWwq1SF|h2)PdS{nekavvs8fzkuM~u;GmA2`1vBe7=4Z!4&qQw5$+8+FleNPg zwd^SYKQBi4{h%|AAzjf4uU9LdaQtG08mkQ zS2+z`on8703e80~Qu}ipQQRX_@LT+tcScb2;_jr+JgQi;!s)$LRY@I%48ZjLb@<8J z1-SH_G~LdNK)CUCUcs%tgE$mEz(H$sFt{||!>sq>Rnb~t{NVj++cN>}`S(x{5!)mF z2LPsK+<*Y1wX(4pk=T)fRo6L3)7Vac+h_m7jxSJ)8@OxGyw6 zPwasC3wfze%2<{bSYR!z^D?z-tztzqVc37gdC1mpS7$n%)wB=kHj7)MHl3Z*5iya3 z%bj?^rV_5@=iH`gO*dQvL#gURk7EaiAumcMI={Gg39S8h5O#;e?tr6y;s#RzONBpm z^n=qMkNUbH5>$q2E-k@mcIQ)NALamx(Z;#~!?ycDE?* zmQ?%FX4ySR+{j`VZ_E0^F$P(gNmPVS6oS^}OSfh-0YNh<(UckX2ud%7tQ7_>;O7>p zl-m!Aiu2f{HnmB3!3q}dvIRcB<7}+w(T`n zT(yQ)$H=P6OLlrixrizJJFI!$yoMrO!MZo7byvk6(IfvRBS@FNe+Hch9#ejOfsQ!4JL}ptE z+XA1yP+ztF#yu0)0sMbH0$@G#QmjlgQj3TaIJaF=w`rHbNCVB#l`;hNeqIX^Foo3# z>s8#|)F#>8N!)0V_0`oG>WK?bwmbq~nn{2P=s$taRACt_oHyIg;qgUP_9<>(YFKvr zi5qWbeRWlaU7S|grG7gx7~=7Zj>Q!xSn|ek zIu%X73>0CwhhxNzVy~iZK&RtQ#obvz5`d#Wf82Uk^?}`2PO94S3gxNay3fEiwIwQhIP+xMmpvlthi~4 zwkhtm)Ww1!`3e{Eto`1dh;X;K%Kr_koZt5;);v^K{Lc{a)%PYx3j~wmJ3=xJtKsWV zYSuDsTDAWNRxwWz#uST19gDMc$s)VEi5u0jUkk0PHBvvJtI@h6HW!_Ouh`k{-Uubl z6#hR;wMR|;&C(R^ShmUTVdBQ41lpq99vukyEo1(&Kw!c@jNi+{kH5k9@+yO9qdhl^ zZY~&nV=gqCizyEV;k&}YpqPX@sKyqTvBw>O@$+X7pAjACDFcPPXh#HGBeG?%A&EA0 zv6ph+IfifS;g`wjcjoA4zo_4Nhytvt%tS#!q|7$5s3P)vBC<`C9T9Oy7jbtK{|f?K&_!GuMO;Scd=!zw zMWi7SJ08BLr+#BCEX>XZgK(lS1)-EDJEYz=_aG_))CMO)(DHx0&uD+E)-pQ_EIfcp zW^27<+q~+q`fi}vs}3bw(<;X_`!dZfV3iGDta`S4EOX>|=J@H%v6Go|7oQzG0tU8V zQk`jP|6y#k<)p>FX_Y~kscTp*L&vk)`c*p(cQ9KUSIeoBWm^18H6OTEE2y`U@pdhh z{qU_-C-qh_4K1mfl(2MUxn}9a2XU!onADG~x@n|`X=qCwTWVdJTfVT;x_ssFH>K_a zr0pQ7KeSp+F*aas_NDOh@Jh`}c%}B|2c`Z|(shJ1A6>1X7#o?U4x0U@<;2R7<$FJG zmU<77j>DvJbafNO*vxcqUv6J1TeR>s?&x=h+Z z4=lCsCC&R*>uGoc(*{jj;+N`3>yFh%8rH*dF1J2zRNW1DwT<2XPv3 zSTH{wfY*oK8~`r}*E#?%eqv4o;2lJ74iv{0AcIl9#hwFzdNcz9E74Fas+yLeZ0c zksk~DMKPdNtigtSK=j2-fo8c|+FQZUOjk6IN&nZ<>C;KOsw?i8&&u>Rb4aTzeRUs}{mKLnN zO9g4p@vhx#<*Iob&la(R29j6vF6*_E(2jQ*Zxz=4R4+*<&hNO9y z5Q|4So^u6aLX;Oomp{t6W@7@!3;m?%I3M)K!;&i)6Zkn&7>b5tSW@6!A}_i80l?)# z(K(kCb4kd08s>D&74a|dnB)p#LB zADWw&RJ+z$pWx?0aZzQp{`#~+%xu0@DpP2mUV^k%t)KM=7PPT|_T#W=-4NA|*bQE| zDTE~6w;q8=bumE`$Zu_ zUDtEC>I9vrNEi}Ej{eA$uzf=Rl%}Z!^G>}4bPCUPU9NB?E0Qx7`7c_VppqpR1xyNP zeG0XGq1Tw8d3 z5PCxEHn7Y^ENH!6U-a5Ga7$_|!+r73z-``gtSh;S2bJZcRa$Gp0x_~v;g}^%+nQyj z*!w7*FaZUf?-J&1QLvOzFarfvpR=Yy2--t&R_Iw(F{K!S8Fv(7Px8~27&-@)V?3~Z z3Y_|d&aKd%ngVU8M-L}=6jDpSoE3g7$3C!^Q-M`eit8-JDTJYSwS{o$7clDz@h93^ zRUW4)sjpBHN37V|@^a9pU4?Q97*$`r9;1@Q=_n+^7dXdJP6Koe3S@qb$88dDP=uWb za8Ly7oq!W1AYB2gQduds=qt#%>CZtuD9X>kZ2>zjU@rw+czKfQj(HHHVHBm(d?>IG zDwwJ@L^4^S|Fs!U#P_}I|r&rbu^|)PG5YH^Gm$=IpuCt&0>5J zWH#gTg`y$J=M#|kRWsRH)EXbz2=Zvs?L}U-`||Qzlg`$V7>bILKN{e*0l*%s7QK^d zgKtauT~(0h`JF*0O}ZeU5K-%V{>8=cZQL#9c*!RQ{9%ypDxk(e+()JSHsa9Z`Aw(N z7a$6nYF-Tc1H5Vp#G=8_TwLJQoq3W#nD@gT8Q^`97zagsg}q3?)vK~(FY)n2l~Z^7 zp1<3uW`g3jt0s{T2eknyGDC5C36~&8XuN^UCNyH56$>~0!kh?g@dZ$0^!Y@T{isD0 zo_D_e+rW!6S42=BW_ZvXBCbeW^v}+C_*+sS9E)=^aygVaehHow&n(4p6M{mrW3(d}mu&eeh!p;j?tvC~i zi&88iErg=5zwd|rm5bdJ;fr%3?hi-{KB98;FWwg1(A=e(f(F!IU@Kf4q7&Hqn|G+3 zi?THQmHEBOdzA`PFEc+#R;<=PtXsbUL405JwJbKmp(lGI71^Fltgy-#T$TAftdPdv0L?Pu?sKB&51wb9a^X&Fkl46RPAACy~$ zQY{yimWy}C?|C-dqu9DGXx(MnN6VLjzYHs_1FMZn>#;ST(t2KoH+&n*G-WTmwngXT zq=&!XP@5^+Lrn^TU?om!&Np)XUy02z?dNVyI(>*629#qC&N%dS)damUv zjrCsoYYO2X2)t{$$L1KyV!y{`n8q~IxO^$uzT#gSl$pj9b6jDL%gpgC!(w)8nrTh$ z$#fh~cN|~i{ym!NIInb^mzmZS<53uo%y=F(cO|7y5~=2cO7lT%VMBK43VsJR81`q@ zpIDRQcdaSLtuSu6@ID6K0M-|HDK10vVT$ z3zeXgM5`&3D12d`&^5RxWqg93qIOdfirW0MhZ5i{nxF%QS3&;Yq;45srEb!0dg(o) z#^YLrRT2b&J0A*jAgElipsTPb$WZ`wYZMawnw)|(Tui+>`Ya#t$3@;1lDb7#GzN-4 zDCI!QH4BKK)k{bbm3^IRNJ4r#0k>J`f!3;3{&1W>B?vLWZ4{1U zlATnO7r3Hu0@6er8JFuFVFbRyIDn;Hg=+iD$&W#%I12#Q`5#%Tq4jSnKdQ{s_owUo zQ}qK%{lHy&&S0{%XW51f>q@h(WbG%-DYjo>`(?I2>vYMi>l;|EIf}Nl7lD=mdGO|p zkoCPvRC%J?648ekdsR6stKdHgMa?d$sqIz%N5c`cv1u5(LL=MNyK zKU?aV)OB5lFXyLcU|@^MQ;zX~F4tF4k4oyNfC3JF%lTc?PChqy+=imY;AS+wV100$ zENrNR8-&9^K{x;a_E(Mb%_yqq5XQ8Zc4nYZ{6nXGz zd~yLwFV&axNwI=gAXmHz09fS_V@KT~!?dNDwxl_EBgOP9Oux+Z|1UGj>3}W_pe48+ z5Keg?c;>roP6@hvnUmv@Uc=MHP5A;B4S4*3txG?s-KT$a5aPP%Ng_XQdbScDfT?eC zSVT6XNei&d38n`VOEOVs+%iH=Z&+LQz0B)wjO+DFajctJeMh}p4MaKzEMbH14ZPRb zn2kwb74VTlU!f#WTed8ORepuLrCME52G23zLnF42(*iCR)fS4PiC@bx2$wOf5)MmX z_ThEU0Lc~hK%TpfXtPAk(2g{$b|B$zf&Wev_Cp!rMI^EdJp-GKQ6f=zg&{0=5X)J? z@)6OjMZyc1P{HwGUgFgjLLl$K@djyJugXyzDd2Rtn%mWD^c*a0b z=INJ_;5m8{3E(GB@GK#CmJmE!PH=2}PiB%&Px5l`Iv~wKCxPH;18LJ7J%I$z0$s?% zPo5yDz&=R`7GQoP+tO^C>^hKQhZJ^5W`{OfJCxS_nbz~^*7NIJ#xtMx%!Bbu2_;gV zJBsH{)^oWe@lML~mg0GZzWsOj(*wEpRKO_fX!5Qr>nbH?AgA-Oy5MhZ(_ancde?7+dyz}fV`+4b??c~S$fDFd(N%v4R!*OZ~=bzmffxl+hbHFe(?MTWB16nH7= z$-4V8?(wvH{Nc26>XnrHn&Q5e?H$PUo=NwfSvM&Y-c;{vN-wt0z6aW8C+!0W?L%0R zr`C~XJCalr@AgFU6*9GBgI};*voR^%{5VMCybhQ%G7lwSiPtT;4b`_ zfmMuW2he>DHz?s2>`ain`AHa_Zs6jcI74uTC$(U3Z0I#}hC8TZqa5D!l%Fidsn-wO zF-p2_4~`V0RHB2FYuZ9n!noB*qo^Z3Fg>|f-5cV}q~DiIcWtgBuK}I;Ki1Yt($@Wd z@*Gu`_q#j>^P}s#I6oXiYH8kb#y2~Q^)nm6w>$^mvZ;Q3mI=P~IrvZL^w55tFAyJ` z>br`}RnAq{_0uT02W?(mI68j1w5u`b}q6l6ZK#K(*_ar006rwTD61#0yJu= zX3dC8Y+JZ+!M0T}ZsE4Rv_s#WbtltbK)Q(I3_EnzR=2!Uwza{V)qMh||7G%@CfAly z2Pc(-lk%&t69>T?O3NGQAb?_bJs@owTQd#4>4x4^L%-6{k3#4;0r$<1oGr`zuVzxt z1B&wiY{NCjv$YK$UU>h)%JhRb?q5jN9#d+M$+gG6*(g?yDnU_dV@n3oEd!~R14;{! zFw~3^F+57&KlNx=d$RM_&8c0(%C2FcUN=f->s$WL@e9Xl?QdF_9jW>erG7-N9|7_W z%U5OFZg{ipotgH->Gs2G6<=Ea&HC`A)C-rD7cQsTrs*1+*bi^E zZ|EPr|KOFOP~Vi&M+)uD7iwG%YCBH0qvx}|AMai9r8NaSH8@) z5XDby72vn7@RazRan%;rn7gt>qb160alzm+QB48xSLB@rLJ)B`y9(wZdC6W}9)R&V zB#CbWASR4qwjYu0M+okq%ntssf~sx!`QZ-^e|YTuW67$NbHC!;FSGl}lurlr@q`xP z+9q=>KmcYK?)zvXFFGM?faAKO)c?d8%LVC=VQVek8rs6k1OgAXXw#DiYR-(a@olRM z{M&dJ3$9?HZzu0@?bj|Fy1u3NO)s75_H$e}+y|Q@PF}zO=TbC$+cnF(y7zUv;7ZrD z5C`0t3vNY$oA?Gek-f^`u z5Q{|MrkW6jk|K^6NtQp~Wzzyi&`n=SO%05VN@41#Gg{HT0d4Bus1 zK#zju_=UbC;T#Q4KNuZc*`B4Jb_e6pKxnIR#~XFMFaes&4rUH6>xJOX9ysgfVDJm` zNUr;Vn~wPN0%5p);JP^v_tbcS%=YG40aRn2#8!ZYZY2%VJSwT!D@xp z+`Qv1KUZ%;&XPl4jT+jQkSL-T1ZK-tBimYFia_MIz6s|5+9}{k4tw0kGsHbDvN^Ql%JUcQKj zG0ggWZ^r%Md`_j$2lo!)LJDd}su2c9s6fg%^{P>n1OXX=+&2(#P}=o&K$CITaB+xJ?vaJu1~Eqzuhk%zoZ<#tPD=cS6-C| zUsd*bbGxu?JvDrEZRnwC?TB*dRI#U|yH5g+wwc?LrsUKomK+7atwE#NT!#a@2~<5L ztyr#Vw|NSf^qKG?-EJO(LeGS!=_>O;awtc^XGQyv@Kb@yWImju$^mOO_hJX01IS__ z{N-_1sTFXw3hh70+ZtOVM{E2}*uM&HzVe{sf(#&rB4kQoF9It9)C5!~DWlyZ(3qPS zHGP-xGHS+Jts@ZnmN}-ayO)HwAc~AH{xbk@uG4guIw)`N-Jm+<@;6Jh$>ndB>XOUf dEY&BMzqyJZ8fX}@r^CC6uSw1yw#X;l`X5CXa_Rs8 diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_label.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_label.cpython-311.pyc deleted file mode 100644 index 7b20fd0db02f96adeee6132e005835c5ee6fcf30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18580 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 T(J2p~tba{nep?})^v!<)0Ae6Q diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_optionmenu.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_optionmenu.cpython-311.pyc deleted file mode 100644 index 7b8409e25f0d305c0482994ecca0bb75ef0239f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26566 zcmcJ1Yj7LKwdMc>K#&-a;6o3JFYrx}6ex)l^{}iLDe6Vhwn*zi(}o}pD3T%pdI0Ld z%Q$x8x=~WPv6A?1SlMKQ%5@z2nzi9(osBk?+Hmh?w_LTUtr^r*0fj2pvT8R!@?)#$ zb#CoeYJco^dN6|-fRrUW0f%RLx=;7%=|0_k&gs+hGq<~#!!OkKoylJgaoqo)2kmFi z1U~y$2z;LtIKeW@jj4Cbn1wxC$E>(pXA9w&b|UN<^RRHyY}s7-Sha%VZA_-#&b zg-YKq;J6R*ul~j=1j`8LDGk7v^U}X=i_Mb~bpELNCn6kPw_r z7n};;|Dy%yK1;f&fAn^LFnlK%#RES&6`BiO3WkHXLL#1v2gKmrGvQm);Si+)^>i>A z>Yoip8TNn}nHM5=!-XA9EVUixkGS<970j3P$Zey<)+I#2cr0+s{i2;8% z`rI~CsoM7R$w~NNA zGU0ZF_Xs}Jv?ElV$=mrhKUO1jA#bg4Qt-cR8LPv+8~1u)A7Z`2e&TWAz}vR5hD^8z z;YO4}@x2H)A;&@FXckW49g5KgWkMetAs%BJOge-^c%K&3pRf)izfCxTm{#E^D76XC z0k#Xr0DTX*dzP^d%s!{nZVY~Pf}z=9@!Q2-{M3j!M0oE`$ELhuWFahs1n)#d42Q&M zmsiNlAYQ`h^4Sn#vr1|y0%bI9xtn&(1*5T$ zn6}@Y7GhIr$5d$g)>JI*R%;m$gTnMeH0`{3D=-n6jfiRIq!!|DF2rJya3;Py^E4H? z6B09V#j()6SSDPN4F`njD7~nVF4LMIpqE;yM;S}1&||a3q-~R!Z_{o)i9I^*1ZNjQ zsIk_ZX?qln5lY)xdFjGTqozH={cvz@dLkf(qSK4h;ah1(Fg!685hr$O;|KR5{JZe~ zS=h;Oe{cCd)}k0K9+}_!xPPcUa5H*}uxrV(WM8r_6$q9e+Lm^`XZg0p!Yw)8+#R#& z=-iCHjtPbtS}4eluW;oO7dPa{=3R2U4{9Ik6qmSwzFI65J{29?Q_(5RqvOzOvE+Oz zI`*fczonw5D#5UlKB47{@@h(4!hTD|PesRRsOk1S zT%1RTNoz!CspQR)n1N5te8}p~t2HvirINfd-5N%$RtuqgZYCSQGaLWD6+DN3^(WRF z@#6Zrqovaw7#{7}OdI0??;a@AQkTl`RIWVQGy5&MmiQ(2Qt7JeeenK=S^nn&df#9^sMGL`ccEC|SKa3RK?`&7 zdLxz=-Wof0N=v6&3dP9Xkd4WPQ0GSN$=pg$$kDWQj@6R)(XJora~xW&S;LH7)IzLh z^!QwwfmRJK_JS7TxS4h>Of4SwX-~#G-bCl~oKkn9jnJmR(0g^YG_PMew9$T!=KqiPY*MO{gN3AXXEg`9q{BNu*gqr0HQ$Bu4WUs@ZAah%_2lrnJi-S*clQ zG>f!YLXmacWfEY9bh>;B^587Vgt4jViQC~&G@7l6Mu6p~mrmQ}gTg%q@26ciBcc!z zRl(9mf?L`l1o0eB^YfAEa127%6y#eXIV3JlVv`0fzq)U*O zL~~8(bp;Hd$ndDEEusy(J(cpKrpp7mh^^PSBpXNCOSU0&gh7>klphdNA%A?i7L*>nke<$36J!CRzrfHTz8 zo6}(dZx~J6S)J2GP{Srd0q_J`SL5Dcv5f$m7ie)5*#LIjz8e%#(V{?Lf=pe3K$M6+nS`SBPf1a2)%kNfY0!gt1prf-f%F%j&Y$4G%`E;>H3 z5RFCVGTq&c83SgxDDK2d(e8=Z?LdSX`-n09^Y_JLsQ=vc-)ixRG|_KW>(LUr>5qK*JV);@a^@ zcz5QfZL+IFadm8RmZCvRiuXLckmL^}_ycRbO3#4IpHcWT5`P8-R(X-lovLbJ-Lmf> z5o${vd7kdgsh!n`c4@bU{S;fb;VOG@JXO;vRd+oYcsTT6XrsD;0)KFoJcvD9l3g{5 zt7iH2gv%?rys5_4_qtYIf3N$&fWp^HeEmk_eir;gUB_B;>OkK|U8$Z!O3#H<@0rx0 zi>bczseR9Hx*hc=KIH)ZM1ZJPZ1;?i z8{!QsrzB^C?DQ*6zvT4)VV8Hsmg+s2YU@n4ol3NwT5ncPzbv<1QQEGg+PjkNrxWd` z*L#)zt8)7_rTyAwVZrV(%cmT{KQV~c=l|Ks)wacB?=8tSy-H0l)u!qX)r~)Ve$AHh zA4vKK6aK;V*zXo)|7FF0Ikm4ZTic z>m}1F6N+oXXu`?w697kX%6uc8UzF2(hG_%j{-GAKY5MMzvr)@+FD?5y~ z5b;8yc!Ofu^DJe8WIZtpAwMMetl}KfL=hlLT;uhM^As@!uvnL~mgWdKU!zR_9pFuF z!&M=BFtU&K%>PgxWje+m)r>&v8f278S_WL)uiAw~&LV%1dK4)ee zslvXlD{0z_raP(HiaNRq=7RS`vIdE#sRVUgrORhSlhAuYY_O}^j%k=p0(WuG*29d5 ze;eu1{{`?ShlT24X0=-mu2|MuC0h25D9$62^T#ruSM-$hhQfxuKen+`}M{d5WG~dm|magBH`)^C( zh}<8M+vk<`c}ctji7slnL=qj{Akht5Um%GtYI%_)I=bPhOSSH zMI`7F+{}ad1CCgl%+8-Z#DIJH?U^OZG`D2UY|0px#kfAuP^SI^BkBv49*KZy!2td2 zX3VO^%*t#)>%(tbD*8aop+c4!_A{4?dTp0O-;glpShbo5D>KMp_~rlJN7RRUG{ZAY zCVB!~JXURH8kyl{ABN?o5r`jHv-YAk6V+1A%OaoxZ(vp?7k@_lzDLMiWrLKeO`lh;meG^Z41Is}7Ur?5H z0O*4$XN{%})+`H>b8mbSK)s+l6uH?*YD_pAX#kx}w4YqB{M{b8eMo5^lAMjQ^OEAc zBsni-MkvYd@zG?L~a>XT1Hc?9m&>{iB@D*PQ5I*UQt@F&{(Mdl(Q6F zgUC#f1lMbpEyP+?N{tUZD3+Z*#p#o@OC2jlekT5-=g;7Q!^X&co0J`8y03iikI3 zSjvdrQPp{a?3L4SykJOC)n4g^ncAyPVqRL5Rm{5)@ph2;dU(aZMJ<@rA>OAD$vDHX znctuX#!u$CE$w3VLns1}`NcPZg*lWawI~{i%Shno5zL#x4CdpX5q<~&(syRD|NJRx z(~0Sf7|WY*dSz#$;%vkW_C(PF(gm)3uA#nQTmuI{Hq99M<}I)BY3pf5Ao*73quhZV zGYo5E&&LeQm^lyIrT!caK}mYKW)8J*u`;|-=4a-;c##%wyqj?{%OR$i!$9&Cix+WA z^Q!$<49$^FcL`DASptIu*rr0Anzr4RfkhLe0-f^Sr1msZenL5VJE(cTK)wQ^Y0hV!*uP?fY0S33MeR!k(Sjx0BP(sV z&*+0SZkQ^vZ;v{o-25MM>aH|qs;fDQFk8H`RNVPxLD6+QfesCP_A}FY_8hB)<`#LX znmM09hjgrGtJyX=wyc>)EB%>!MxUC^Ew-BDqQ&07T%!_e)k1L2sMNw4Q{fc)`-|5{ zcS?GS`g|Uzko(Pc9Jw7GmwD-f^T@3)^*+zizF+2jwxg5xK40o>wi#caGmdHNHShO6 zVm{PkGmAX0nwb7bi?8@qfI;ZH)|g4(fb;Kae#Ce+ZNBb8^gVIA_fan zY$~9-V+0^@z}OX>4MZW*#cDe1xPyw&X1frJ#=P39H2)}Mu43bX5r!-y&Z+gngn0* z0fDy(r9#BM2%H0=^hV^0OdbO}wulTIP&F`GyP^2&s{b^e7c0zS5ZjIa_eh9-0}E4D z^LoeqEw{9@Rd%*vKTvYE<=fHf8kM^4WZih8Zd`gbn0)na;?=v-y(L(*?pub)y!9GP zUwEQhDi`6BiZHAq4Cf={m++ci$R?4vsFpCKmH_l3TRqVui0!UTo@;1Py!(^hGYRjR zbs;%;BQbbG3Wk(mOsgfc%)MxRiAuU}VYizWw%L4E-E5{?YVd*~?}Bviz8t(S4=yT$ zi%&@U)NXB9g6V>wTT3BEBdBwJ42 z`snXolYOI#Zxm*FcQXu%?kiLiKo}GWIyiS3Z9=Gp9WoTAoEww7UQxPUF_fm9xhngv zDZXoZakM#Vb&s*)0G%i^PI?K#MDbSLBYXO2<{U-*-*nuSxv1jnayTfAgbT zN}WGZ>X%CW*t=9b-lV4^;pte3CA%*qx-Wd(t6UW1?vTS>bl-jWb%~j20lZ?G}ykyRh8xveNM~ zYl|xie?{W2WGopi31^Ew%rMe$sXC>u0b+EL5KBwpXRl$AAu}(8VCx-D+_z+nBRc;l z$kV?*JhCC{|TEwV0 z85KW-j;wIAweqkXALg8D$QMlEWlg>EWoYDh*}{7qyq?{RfN;WpX&St_On92-(kNjx z{;ly;0@_Vionm{k7v7TbY z7(A@={m_L9M*BaYoC>WSnC(!1itCD-mQHs8CrW0r$`R&y)26_79FgNQk2lfjm}(F) zJ_$Q+vo%2!jIr@8)dg0sU0O}e{10k+jZG!(*6@vYGbbQ#m6nRU`WV|zk)F}9SM&VN zab^W$Df{L)!$vbx&9?o&E3f~nwYsp`b2rPsXWRU{^YYi|`KvxBZ&hAia(`t%0Tfa1 zp>65z$;+#ss6iX*;V7M)sMkt0-i2y&2~e}?48+#BHMzJ#Evp~R_@CEb+wp6yxy;o% z^D~{8H=gA&^URFCf(c%s9$Vp%rPQr(wi(ti%+3;w<{mIGyB9+ZrOJz50ED|J+@OXT zVk1Q~5%^mI&1w?e#1;Z%3{P|75el~wXd}>0z(;^2Gmd1kMq7iNHky z-yy&Z^)nQ@O<Vw*Rc-CmkyRx$$|W@p;YZP<67B`FhpwG*#R1V0go|V|l0K zs>g-rWNlBPwr6edR~LS9;qju}dqL^FAlF`0YA?c_bvTouYWa%fYQmLjXh}94N;DjL z?D%c*uZ!1@%ZD#3hcC+wBTB;v5v|MQsE_waE*~!DcKUpx?fJ)(zn%H@jCB50`S@$f z@z>eszm|3rp`-YXiVY&VVrTzuVQIpBx zjSot$4qVKS^?0KF_~SdjUHtW;bRi(0xS^c5A-4yW_8?_x$z-XE!^g567xV9`Px8J5 z?_2Bp)zM!Zm5#q8_gq$bplSMKenjC%Bz|PW)ey(Kcj7YTU^SCYU6uQ;DSc4tkmI_- zUzhmn8?J1%$m>(1aphNIzZjEFzAPWSq8xgr{@m?AoYu@Fm%ES@B$!JeN0Wn|?g@gRzxjxwc2C?IBhrt(tPJ z2&>_BYr=n8@}Ew1_pH8=>^__5KKpT@^wP`9OH*?9w9-BO$fkI@;B)a_IN5qQ(Rx^J zJ*u=GrPwA=)ivZbo3gK;>BIwyXFy`tMnlUZ+q)$juJT71do{RHd%QpH_(4bfs=Q~f zvS%+Ub1}nhPeR#nRW3UuR~@cYP2-O*{NO_TzFf0ksexQ?jR3@w7_p+Snr6*gZy%}sSFrrW&yYVy zMQ8b4hBwpIT9(2;L&-VHB+Kv4A zu7t4^?cgl+tiG?tQpyZ@bk&iilp9iXrHZ9gWKyVSb=7g3p3PAWMz~m$R_9z-l&wox z$}vU3<)l&-v7RhpG0`e3SUuAzE?>DS4n0u_O4}yL&4dIX1S2>om6dk35@l`xQ59th zRNMTA6v3nz8f?0q{a@o@u{=kJ0i`|+<7fha`5II$2NJF>$<@W?vsO$!8}91m#e~}@ zxqXOx7yi}_DMY=IaPO7edl_1bgyq~_E!FoV+&z-JhedWud?z6;CET5oyOYH=NqiGS z>`l0PC3i22?2`B{7I`4yJ|MXdu*lYAMQ5U-bLE0uaY(5+B=LtB%E5&DpyWPiLb)VY z991fqi#XN6ShQBkkX&&@sW>9>N9b+tB-|~My9I^3i(Iu-$*(5de#z}Ol{+X`^e7cQ z65m4@_Y&?l$=&t|G96hS{o%M=(V6Yf^Y-AY8BlOTlwYm2D+33t2X zZYQkgCEg1xseXULy zi-<8#Pb>yY%7^;0qHgSc0Ph`&!lo2y4{2Lu9%p4;IC(f3!I{@c?4I%AzPhFMHDHSG z02rLNa440sX7||Wh~i>{d8}-K5~QIsiL#ixH%>IEj#}}`WW)YM!+yD;M``F`5_5x)7J|WW|J!0{d5e!aQV`yA@MRrvsw2Q3jKsY zoWLmnI8M_RXxbjaIoO!#c)$YUbM-|1R8NSQ<;TEKUAmrI#;zO5n(^NEp8I9nNB%_9 zNvY}Ne;)a`^7l3JnJdbfE7J9`#F;Va%$RAL&Ac;qL+%PHT|v{%*sHSdHO2RuzB6`% z?Tp=EJ7YP}&f)kYs=;W360ZDh9-YDBsJ)rNws#fWdNT(ML#)bvd7Z8gZw-U)+vkAS zJjyaTj*{1K!LXR^Vw<{Ap6$VtC{lb3VCuL#h}f#**zv1b>NsMAH_3C8yfMlBSMv5S zCAUA(-oHMe3}g;yq*{E*mXnDV<~E*jB}YdTdFcoR+wlaXBNS$+HaZ(sAVfcECN`?y zMZnzX(UZmzy>&z9&b$G=*^yVLv$ZF$vB~p~Oz0yDvoG0+F#8VSrkZ1NOfLeZXAS_+ zm%mgk#E#=`A$*O3+!QoROU8?q>^FL@(^+F1^|;Ck#1!cQIMXw; zTV~c2e~Vbt&>KZWUXSa}F4~7J?oy9`9jNH>x+Zq?T01hOdQmHIU!b!c#}wx=$$3ma z8SFnm+Bunu$a%Id!PhOvl==fQ-=pwMwDZGO0R+nMJS=xWeCN`)E-g31ZXol1h4)L^ zh0S%o1t|Fwq|O@asNr9gHM;+Ltf7r-@jv1vFsQfdQ}LgWF8(I~Q$JGdVwrj5qVvB_ z9XE-zzgEXV%fO|b)mHlkH1!{asee8rjnX`ij=+z97&dJ7ra2-ZGa~1{540sZ&=w{2 zI5YK-KmHRK;$a@qm|>O6+DR5HqJKLVdh-Z`ZN`Q|@ns>5UR`Xa80}}C`c+X`@7#X_ zEOf3e^N9a|2!p`$OM1*(AL;x{-lsY;XOiEc7NNn87QrBTj``6@EJ|T9SJP z@Og*z*AqSGq@HsaU`f6?!8gl%tAg|O+C`(Qo3b%1brvqbhgc@q+oE{-(fhK_Ttxt# ziO)EyqHDAQVJm!#OO2InUznXP?gT{@Kzwx_G7yZ`|g^Q91T)7UT#6eHN$DL*BN|HZP8% zkBSS(8}ZJ=+|Qbaoe%9FDk6Lzl6fDWsFkNSK9i4ciA6_29dEq+wIJP{vVzP)_=lkys=R*=g> zN_j})L&n1@?eVi~mFygBpW=kYvQL}C>DcS?6pl5F!Yxg99#x!2CGApK!9hpxr-cdX zeeFk_!MI@^0dRx$EpzYZSpS}`_u-<1-ZiS4Pt)^T<%%0QSF1DR1{^C#^O+n$@EHQ1 zZE@c=9Kt@F#7;Hk@XYYyx7*Zq*@kC^BjHdNm}erm5CzxZ;{@QBs5j`nxo``Nqwyds zdpZ{Nh9fcW1cYAEdv_|tzGXn1n$KbCcMrgn3t?ghVrr2xgY$@=e0K4_;>I{G?ND(T z)3NUq_%e1X#(BR7UX(f!4x#E%(Eo;q#Y*!+q89N3;=0$746bvPVMhb31}(Ynb$rIe zQX!Jw3`kovBAv-3NxeGZtX@7B7mQzJVaG$+2|njav+V3voZXVM8?2Z)etnPe;6BB< zPtvaZWrbz{#(TX8n3t8Ubt3buJi>|p1sQQR=mu_S`y@UO9L+ULh!WCrU1J&MKTu1M z-$G^;s!x`-BuZQ4(l!O(YSCQvfTaKavh^)uwV?Bud38>JWUeZuV-w@&)Z3RR^~t53 zN-2Fa=daz)F102&$u|+otGPlouQD^90sn*ix_2f@JLS^7N-3Q_W_8c>>M+C#IGL-~ zse<9*QC}y09*_250)cdKfIPGpW+}`E0^vV2U8vX)N?0NbuB*(W8XS;{4_<> zH*W5qwb)6?W4BaQ&1L}$ZS1bzw5v%DZcpuIp&E8_4Zf8fE78?Ginn(YhB(U0b2Sa| zig;+Hf30HW+OSqcm_?eZam4&sD$4zV3R=+BB99No8DAgx7OH~vP z=WSoHuS~2Rd|dH(;_>c}PGC<|Y42C+2R6%8lya`szY<#Of4t*ybiM!az2DSJz2_AF zd8OsTW`&AU$lN!0>$`t*Lh8Gq?7OJ64Q*DdC^b(YRI8$Rx!vBl9TmPB4=dh-%C5f61~sKoZRCZu zTPtrUzT=Ab#AcJ4(#-8?j5q(VZnH&wZl#vrr8Mkc>y;V~Dbf5O|0zuR@55{ZwangtQb(RrevYhZYRTI z9xSoh$qtqW`2sdn4Y0V_-n~*ljf~HWnZfQtd+#!u47XfRZm~B#8i7P$Z^{J@tG$it zXauO{b5zUcmXQayHMAaXAKO2kkVdY4JguC&#v*b7`eQ$l-oG4Wx3wO2%LS+n3e4FL?q`R~VWyeU<78@pGC!Zvvzp__8Wa-mvw7Ee-0#&(;jKgp}YTsv$UN zL0Y3DI_!g=;`5ZBHigwMcUCYQ_1jkJXC^~Yk*8$Z+!Y%M&_u0%>6W~_)GEy*^k?TW zbx}Jm{!cv893TA?0KOt)v7|VB7@hu7oa;^Ym*R@wWPd5{u=I4-2G=5)uM}4=nXeSr nDw(eow^uS>Tg6mKoax$hj5{poj;-ONp-)-LpSDS7t@8f?fpM;< diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_progressbar.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_progressbar.cpython-311.pyc deleted file mode 100644 index 3c8594106cb72bbc42d5a45ed0a17d7b55f76e78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18035 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 L$R9TdXI1|{hWBK0 diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_scrollable_frame.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_scrollable_frame.cpython-311.pyc deleted file mode 100644 index a07a345f5a79e5641eefb12d212c0d25e38519fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23814 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 JFDMI diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_scrollbar.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_scrollbar.cpython-311.pyc deleted file mode 100644 index 511293727ed21df6b20cfdaece7cf4f865fbf960..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17411 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 H+wlJYwX_k- diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_slider.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_slider.cpython-311.pyc deleted file mode 100644 index 99d269bed8e9ebfc35d522ee4980b50132dea8a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23953 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 S&CTJWJxtMrAa;|YM1ph!lq?SA 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 a^Bc>$kZpmMPH#Tsz9J#N+a#P+{r>>M0kVVu diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_tabview.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/__pycache__/ctk_tabview.cpython-311.pyc deleted file mode 100644 index e58ae82e66a203df4f277e1440ecc56655383fe5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28477 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 diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/__init__.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/__init__.py deleted file mode 100644 index e979ca8..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .appearance_mode_base_class import CTkAppearanceModeBaseClass -from .appearance_mode_tracker import AppearanceModeTracker - -AppearanceModeTracker.init_appearance_mode() diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 1bdfb9bf3506dc61125842290abf9d1b7f54b6fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmZ8dOG`pg5I*N#gC4j`0$1)rF}=1F34A~WXSC`c6g_^7 zfeUdJv}zZ)bJg6+K!@SXH)rM>zM02la+jdN;a&d~<42sVO#1_i3W9rL6PtR(r(H^8 zta+NRcXdiM0{V4gMS4K+vPuYc>MfE@d{X?%(s{bxcB{i7aKQr$E<+n?TteOBQeri= zUTO<&xgeU^t$CXNlT063W)Eqm74w9Sqvr>k4eFOHVqx=rCvcRx(egwVvCieQRc0Lt zLNX9G_!&QvyvLewqbx6sY}N?f$cI1yYpKX~BA+$RYFDg%Y#0VBl`^fcuf|*eGfJ7$ z&N)+Y!5l;mD~uo*u?wfiq@&N60qG|r9 zHw(kt<#q+Pk32XLdni3Vs;uJkrBh00q&8Xi87WWJ{hj0{BsC?uH7j&6|U}?9*;dU20VnnV5f`$d+;xtED(}i7B34)mNgI?>`W$UwWn(A#xvdC z>K?ov83nC4pq$7hAgz#mfh^+UL`3o-hrLANkVrjNqqSN>LW*+WltJuX_LNuEpmGlpM5H__NNK4cr{zK@ z9g+}{NhlvKC}~APGP;0B_%X!XV;$4#WgR}GVRAZWvrJtCDPB1MyM_Ja_f_1 zBm`0+VH(NFM7bSKw~&aaw?I8gqO_GpXdC>Xe}7FgjnPQ`D;KKQ#q2O?h1qeMAnl-` zoy6#lT$sdfD~~|KlbV+FPLhDF?(hzLI58L8%cy425A&L3X`QgyHVkFFI8WJNmN#O1 zR>z)&rsV6D6LNsHsS27W`Ml|H4Dre zlrfzUYHX|oQ}ThzVb5WnpSh`II=ixYU zfMv3P7_(r{>7bMiFX#p_7c6)a9`fOOn8n_jztw4gvMOLZG{5LYRaG~1TUARvTf1Or zW6%!Ru{8|h7J3owbfewNhuuRzTb(FJN8RYC6CHigeZuWNQ|>n@A_Jmpniq@-lF3tns=2#fb) zETSPoR2tqU5}O^@JzUEKh+F7oY|q!RgKM#asmg#7VC3jed|Y#-Z|&S4>{sl zPwe|T(Y2Q7Dkrd;z{?lb68%o1KRBooLhS?4>W32`WEYtc0BS9g7?y@eBF%}I+z1)wzSa^^95Y(~*AX1X>-&-i&t#Za{ zI^f$oa+3+2u!6;x;f~zl#=4iUti_Hxv7_tB19wlpOzyvX!gq%vSUrGi1*QpHPeCPk zY?mZkpcguz*kS+8Wlj!qI!i1`;76`UlzO)2I0r9ErGJYI#M7*>VFR;N2OKi)Nb%5_%?ozGVVrT^bIm5cWFNw!e9v9_fIghK|GRRm-;MQGP^fkPdUD_W-R}NjH#y?O zM_wlP-MJ`maNdi<#lo=WAxRn8#Q+|npi$uAFvOmpj$1n#b3BoPwEekc*P@PKbR$Y^ z&L-9J7GnCB;IdlB390g&6^Hil+wCkFutHfvUmy~B5NfstW^XWNa!DdBMZ|*kN1JCf z+0XZ1Eln5)1|LUFqZ`h|w!8h<=83IZ;6@ZkeWbO@@uz~?8~tN%ZC7X0tOoCGGt1vi zEh8aB+JsMIHcz)(So#He5Dwb@xs-~Jl}`GH1g^GYra=dA4o+z!!Z2KL{X_g-Z@t~_ z6)fq+8k$4~D)rY}vWpnh8YVDso+l!Lb))f$ic84>T(l?-C_Y~r+D?VAZx-}wHe`B8 zmh=^8x>Cg7M=4XwmsJ+(3uqTSFNO|sPV#vlm}^k9^`>~gPe^7C+Y4qjPgnzDAE_3v z?V6S^(vKK389M|EvmP$^iS|OUq8G|j!wcJs^As{J=6y#&1c+ppnw_QDDygY_XlY88dTRCN+K(?f@Lay?T$^++PdOQV?XvD%)`b@O>|Ljm`cJtd=XT_rcy2w>aksFR z=y4J~U&dDzr|&&@#PG3l$0fJpk`uoq7JXoq6FqLCr-Bq%5Gd@<#Z8O}LEqndR_I@k zJw5i7^ta)a;eTFtu3U2_r`#*QdH&nqm(Q#2d39y@IWZj5c8WJ#bK&{oQkmRz$<38v zq4vKW2P+75P0GvEfBW)VgnlKD$?$PWo{(SjudDJm{;P2u^dzTv2S{j7Ov!>=$5PVy z)GmGv=h#qHuTACG_F|sbM-F zGAdP2gN#bb2hh?WBZ|_y5`vg0z0IOsQ4TC;dFz2@(cY%)|MH`io|WS2_*XrvQ&0c! zEc|TzU#-qNSKNVLR}geNlWFm87W+`7qaw!@?prRGlm2_U7VY0`(JM^)Kj#gb%>V!Z diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/__pycache__/appearance_mode_tracker.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/__pycache__/appearance_mode_tracker.cpython-311.pyc deleted file mode 100644 index fb38aba63a6cd02507340c1d2c9211f0cc189309..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5760 zcmc&2O>Y~=b#|A#;x{RZ`m{*VqNIqHEn9Nh#(`_skt5qhq86}|G%8z`=B{O0{7`0> zRxHSXTKJ$t4r&n8I`l*6!FB4k2#Ow3pcnsxC9!}O3j`2Q^pG2aw1AOQ-A^1@GVO$Q12E50+JXExKgxI!TG2;_E_+v)pspLLqyzpyV1H?BT5B=Wr#3 zEOIhgChtLx-eCffiPJVdd^av_4q^ z&GlHlmsVDkEX|g3%IjrWxk0nJWrfav8i!A}B=w%EDMgA3&w=ioh6n+EpKk+rNY=?6 zha_{$?0o3?b+U7Cj>FNapZnZ82lJgXT}HWtjvzMUU_lncJ3<XR*H#YMa|w!FDUP7xk9-jr!SY6D@CQGDe3E4Mb1}> z>C0DNc`JQm_RN_x>6w|t_3|xkHA|KBnVH0uH?E~MBxIH<`SkQ%rF1v_TK;BQ&1=f3 z71&XBNm0|eimH{1+HxL*($lN?l3ZR@;VCaEntHnJquSpyntk}wEBCBuzLYH(RhI8=G>`0Bn~=09aB(t^jgX+-d?E4IxR$%JSM^XTt;1An>Ta0swaA_8IQM zU3a49PV5X+-6st93Eh2S&)2Q{VrHawH!@X=Og)~jM$Q_Mvzv2fD6*aW`AI!A0UgZk z1OIL~Sqmq3=BnXIBRr{xC-?e?jQ;65;k(b8(f)_m-oLh;GvZ(WSon*#8l5wub9!{n zoSxl+;grsLJw*I*SZ|L>txGVIO{d+k$J{|H!p~&3`9l~yB%YQidW5AMvQ9j~B+;DH zC1i|H7f0S^QE-*KE4)osxevL8lt81fjwMm0SiY-R-Z!&_it;L@W%?n%e-e$*#Z*s^ z!-Tcr&Z@V?OaO;E4`74TU4o~_^oI<8Y}Y?l^N;O(uj-#R{L^}~Kl>y!SSOsPXCIjU z$maa!d|d$SvuDp#KZyFtP@MeIds2A9ofL4pT7{N!fOndsxHOESM53uM8MFZ&;#sTPZ4*XCYf`=#sF5w)Ka# z&)Uh(`sIF`clHo~LI+Tnz5BrI ziEhno&7eYi9fkJC$S=H8!f&}Lp|b^U!itc^x%>P-B<|>3H*ZKXZ z_q!I912-+}|%@!$9VZm1f3(Fnfyv8V^X3EhlM8L`>T zg?|VnG}ws&GgMr6$86Vk>=LA7IA^Y3gTWEy(ULwGnOxh?5%IIFnYlhT)4g{2g6fjNsMzLsCQt;HBQ4+&0y#5&(xOT`-eXTDMX*WT0OAGp)vQ;+Xb zFaNaHduddBdYl8;Qj|MZH2`*VgjK!#m5TCX&sUU#jbY4Y4J`R<_jyQm{8uY#>{1`> z9t+JzgVbl+{j6j6Jd{43CY{-)U|$O6Q(lS$ib2}8N;Ep!j{u7bI)vaDf)^1C0B8ms zxXKb51JD|2kol;5X*lXb=jTho1L6+eu?+ z_M^E!eY+aIXoN57;frRtZ%f*eo_*3Y4CWrdl-vMjcmRAvfLFA6i6kdC1;ag}v#w&H z_B5Qhbe4a5*82((pI+nuwpbv>D;C%AP+BeUI-vtq8Zu znk?Ms*8#Ji5F1z47-FCQ%K9aDdeZ5v8;wxJHJODGWk zfrKvEx9c0O`G%{$xZ#WMOw@dnx^L1DmsA7zFLW=p2#d%N4S!T2!>#WtpPmQ*B|5BF<)o#mPDW;E)h8#z>r)+{O!*nA`^r8)7BK77=G3=jsF=`@msq z!P;klnoo&z8XlIU-CKbOYajC@VA#2|9oQG{^R_izpm?9b=&9ZY0O^I}OcLB+e&;%5G>(G}c7~rZ{NInDvTgqpK6&|3 diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/appearance_mode_base_class.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/appearance_mode_base_class.py deleted file mode 100644 index b7f757a..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/appearance_mode_base_class.py +++ /dev/null @@ -1,61 +0,0 @@ -from typing import Union, Tuple, List - -from .appearance_mode_tracker import AppearanceModeTracker - - -class CTkAppearanceModeBaseClass: - """ - Super-class that manages the appearance mode. Methods: - - - destroy() must be called when sub-class is destroyed - - _set_appearance_mode() abstractmethod, gets called when appearance mode changes, must be overridden - - _apply_appearance_mode() to convert tuple color - - """ - def __init__(self): - AppearanceModeTracker.add(self._set_appearance_mode, self) - self.__appearance_mode = AppearanceModeTracker.get_mode() # 0: "Light" 1: "Dark" - - def destroy(self): - AppearanceModeTracker.remove(self._set_appearance_mode) - - def _set_appearance_mode(self, mode_string: str): - """ can be overridden but super method must be called at the beginning """ - if mode_string.lower() == "dark": - self.__appearance_mode = 1 - elif mode_string.lower() == "light": - self.__appearance_mode = 0 - - def _get_appearance_mode(self) -> str: - """ get appearance mode as a string, 'light' or 'dark' """ - if self.__appearance_mode == 0: - return "light" - else: - return "dark" - - def _apply_appearance_mode(self, color: Union[str, Tuple[str, str], List[str]]) -> str: - """ - color can be either a single hex color string or a color name or it can be a - tuple color with (light_color, dark_color). The functions returns - always a single color string - """ - - if isinstance(color, (tuple, list)): - return color[self.__appearance_mode] - else: - return color - - @staticmethod - def _check_color_type(color: any, transparency: bool = False): - if color is None: - raise ValueError(f"color is None, for transparency set color='transparent'") - elif isinstance(color, (tuple, list)) and (color[0] == "transparent" or color[1] == "transparent"): - raise ValueError(f"transparency is not allowed in tuple color {color}, use 'transparent'") - elif color == "transparent" and transparency is False: - raise ValueError(f"transparency is not allowed for this attribute") - elif isinstance(color, str): - return color - elif isinstance(color, (tuple, list)) and len(color) == 2 and isinstance(color[0], str) and isinstance(color[1], str): - return color - else: - raise ValueError(f"color {color} must be string ('transparent' or 'color-name' or 'hex-color') or tuple of two strings, not {type(color)}") diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/appearance_mode_tracker.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/appearance_mode_tracker.py deleted file mode 100644 index eb20a73..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/appearance_mode/appearance_mode_tracker.py +++ /dev/null @@ -1,122 +0,0 @@ -import tkinter -from typing import Callable -import darkdetect - - -class AppearanceModeTracker: - - callback_list = [] - app_list = [] - update_loop_running = False - update_loop_interval = 30 # milliseconds - - appearance_mode_set_by = "system" - appearance_mode = 0 # Light (standard) - - @classmethod - def init_appearance_mode(cls): - if cls.appearance_mode_set_by == "system": - new_appearance_mode = cls.detect_appearance_mode() - - if new_appearance_mode != cls.appearance_mode: - cls.appearance_mode = new_appearance_mode - cls.update_callbacks() - - @classmethod - def add(cls, callback: Callable, widget=None): - cls.callback_list.append(callback) - - if widget is not None: - app = cls.get_tk_root_of_widget(widget) - if app not in cls.app_list: - cls.app_list.append(app) - - if not cls.update_loop_running: - app.after(cls.update_loop_interval, cls.update) - cls.update_loop_running = True - - @classmethod - def remove(cls, callback: Callable): - try: - cls.callback_list.remove(callback) - except ValueError: - return - - @staticmethod - def detect_appearance_mode() -> int: - try: - if darkdetect.theme() == "Dark": - return 1 # Dark - else: - return 0 # Light - except NameError: - return 0 # Light - - @classmethod - def get_tk_root_of_widget(cls, widget): - current_widget = widget - - while isinstance(current_widget, tkinter.Tk) is False: - current_widget = current_widget.master - - return current_widget - - @classmethod - def update_callbacks(cls): - if cls.appearance_mode == 0: - for callback in cls.callback_list: - try: - callback("Light") - except Exception: - continue - - elif cls.appearance_mode == 1: - for callback in cls.callback_list: - try: - callback("Dark") - except Exception: - continue - - @classmethod - def update(cls): - if cls.appearance_mode_set_by == "system": - new_appearance_mode = cls.detect_appearance_mode() - - if new_appearance_mode != cls.appearance_mode: - cls.appearance_mode = new_appearance_mode - cls.update_callbacks() - - # find an existing tkinter.Tk object for the next call of .after() - for app in cls.app_list: - try: - app.after(cls.update_loop_interval, cls.update) - return - except Exception: - continue - - cls.update_loop_running = False - - @classmethod - def get_mode(cls) -> int: - return cls.appearance_mode - - @classmethod - def set_appearance_mode(cls, mode_string: str): - if mode_string.lower() == "dark": - cls.appearance_mode_set_by = "user" - new_appearance_mode = 1 - - if new_appearance_mode != cls.appearance_mode: - cls.appearance_mode = new_appearance_mode - cls.update_callbacks() - - elif mode_string.lower() == "light": - cls.appearance_mode_set_by = "user" - new_appearance_mode = 0 - - if new_appearance_mode != cls.appearance_mode: - cls.appearance_mode = new_appearance_mode - cls.update_callbacks() - - elif mode_string.lower() == "system": - cls.appearance_mode_set_by = "system" diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/__init__.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/__init__.py deleted file mode 100644 index ccadbc7..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -import sys - -from .ctk_canvas import CTkCanvas -from .draw_engine import DrawEngine - -CTkCanvas.init_font_character_mapping() - -# determine draw method based on current platform -if sys.platform == "darwin": - DrawEngine.preferred_drawing_method = "polygon_shapes" -else: - DrawEngine.preferred_drawing_method = "font_shapes" diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 64064e89da7da38459b4c4df1378786df3f2b0c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 665 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 WT>gu*2fi=1eMj5Be@Qp8wEqI$+{uan diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/__pycache__/draw_engine.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/__pycache__/draw_engine.cpython-311.pyc deleted file mode 100644 index 05cde0ae503ddbea2a56c876904b739977eae3de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80857 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

    |8rHC$x`Zs4orAgj++d4V}q zA(NnnXKINl6ws;7!s}WoV5V!lhli|qBxWE5Ptn4Gd{X_hHdHPFCK&-$h z)`9r;_UUjWG|@i>jT~IlhDW`V@Ff=14;Yh*_#Z`{WyiDe8qdZUQi=jls&Po)gu&9$ z={X93Ri@pD=UnXR@3><8eE4R3{~L&JH=fzd#aC#h6}LW$TW8|Ak`LW5=2bDll`L>K zG4ongOtaf{3K0I)UjsRW-vHr{EPoC@e7Ahu|5qP>_wm#070DW_uqakoO=?@Bg)OA8 z*UG~_d?wdn-_+`>E->Uy)R0BwEyFMPp6)?=@b}?w`oaptOQO4 zYWj=nsH=Lhc(HA9YN>)8zy6cEJ|e(OJxGNh9N~!F4S`N$4wj#w!KF?i0g=~xzNV(g~Ang#X{$&1&eJJIa_`P{KG*q6~LL6%`xZx#fhl% z1aY27GsjEq^}>Uyhx=OdWkOM;~$MzcC#z(7EL+(ERb44{0|O zhcqkSocRWy;$4E<;Cb6Tc)MBCaQOGR&dt25H5@faYrxA9q<`65ZnA{jj0QaHS=bMJ zlR-mGI^d}TqY@vlf`NbL&kUyw+JJ|RKj9~2<4&H=wI%59g#vZBV+RxDXTa6P#V0Oq z!mx+moQCc~`U!=yCGg+mcuKD<_+ig{;Kq`0fK9G6>}7Mqo;pxI-;{FL%T%)Ju&U%1 zuVBqCbMw5&Xj#I^AbGjiOb0#J?60}8mkztVZb1x93ZaKV_fQBts86_u*;yjDR}@1J z-QI}1T5GknZmreUxC24J9tk|~2i-VXEhtci1-y#>$g~&?1JTg9J1`8-zR)-r7Y9e& zfv`L1_xZzNuQ=n@4ZLv}NF-KZ*8>t~dJuOIQ zfYdAUPtuZ8u@X4zoNORG_me9($W1%|PH*0$SG=(+-k(fFViU74Ky-qV5C(`&_GvUW zK$w0S4F?EP)ks}UF;^3DH6@II#C>?hy?;?y>U%Z{IxEAy;n6hOSI%5#^Uo{*-e|y; zbTlLfQskQ-4oP4Ja@r2x&Vrn_!)ILNq3{YD>aXCExcG{GC`_8ueNhLBK|j_K$3E)t z#T-83;1B5^UfTcSK6UiO96iL*qg(F5R1Y?QEF$(EHMai#nrv|kK5s>^O}T^69e7`k zV5f2iq1DR0n!?d48u-NB8&+u*yk{`1_8Tc*zAsBv%7Bf zEn|yeZ<5kp6ZRdXa~FX|C;dEp4-qxtWXuJl!}!*?aAlAijgDEqWQvSmCS7)SQq6-_ zHcJ@xBLsg}y<=zM3h+_madQSdu90>c+%gZ%EZ(0Xd+d%m_GdXT`CqGdW_+(!C$v_PE=9W}34@f`*pr8&kXF`qk&R6(lnqeq&Manm z-0txNy%T}`j99*>9I@_r4;E+^U5(jU#Pev_S*gRZYR zP+-epr?}0beQVDCHx?co-j%cGjfDqitgwyw08T$v=AiyL3GB8WMN}S)!%`DN6X5mi zZY#b>fc>^TIpdH@0z7BE%`g(+EPS~TNhQGUoSixIaQYNN16bS?nEj)IMvUHB*1Z7IY#C|%We!y0;Jl7 z6|1HYTgC7+Ojn^*h-|vK7c1Nm1ZWu&&yCDX!o*d~#t@wT#W#VWj~_ml8-%Y3;Ts&c zrE1Do-JjcAr1o}7tc8jVf0pn9fHzrIt98XvN%+4NOTkC%--@O1Bld5_vgsrCZ^cqY l%>G_yxnO(N`oT)}e!~B~$?Yz&f&|RrS1kNzN!~K?{QvX3;?Mv9 diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/ctk_canvas.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/ctk_canvas.py deleted file mode 100644 index f291e2c..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/ctk_canvas.py +++ /dev/null @@ -1,117 +0,0 @@ -import tkinter -import sys -from typing import Union, Tuple - - -class CTkCanvas(tkinter.Canvas): - """ - Canvas with additional functionality to draw antialiased circles on Windows/Linux. - - Call .init_font_character_mapping() at program start to load the correct character - dictionary according to the operating system. Characters (circle sizes) are optimised - to look best for rendering CustomTkinter shapes on the different operating systems. - - - .create_aa_circle() creates antialiased circle and returns int identifier. - - .coords() is modified to support the aa-circle shapes correctly like you would expect. - - .itemconfig() is also modified to support aa-cricle shapes. - - The aa-circles are created by choosing a character from the custom created and loaded - font 'CustomTkinter_shapes_font'. It contains circle shapes with different sizes filling - either the whole character space or just pert of it (characters A to R). Circles with a smaller - radius need a smaller circle character to look correct when rendered on the canvas. - - For an optimal result, the draw-engine creates two aa-circles on top of each other, while - one is rotated by 90 degrees. This helps to make the circle look more symetric, which is - not can be a problem when using only a single circle character. - """ - - radius_to_char_fine: dict = None # dict to map radius to font circle character - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self._aa_circle_canvas_ids = set() - - @classmethod - def init_font_character_mapping(cls): - """ optimizations made for Windows 10, 11 only """ - - radius_to_char_warped = {19: 'B', 18: 'B', 17: 'B', 16: 'B', 15: 'B', 14: 'B', 13: 'B', 12: 'B', 11: 'B', - 10: 'B', - 9: 'C', 8: 'D', 7: 'C', 6: 'E', 5: 'F', 4: 'G', 3: 'H', 2: 'H', 1: 'H', 0: 'A'} - - radius_to_char_fine_windows_10 = {19: 'A', 18: 'A', 17: 'B', 16: 'B', 15: 'B', 14: 'B', 13: 'C', 12: 'C', - 11: 'C', 10: 'C', - 9: 'D', 8: 'D', 7: 'D', 6: 'C', 5: 'D', 4: 'G', 3: 'G', 2: 'H', 1: 'H', - 0: 'A'} - - radius_to_char_fine_windows_11 = {19: 'A', 18: 'A', 17: 'B', 16: 'B', 15: 'B', 14: 'B', 13: 'C', 12: 'C', - 11: 'D', 10: 'D', - 9: 'E', 8: 'F', 7: 'C', 6: 'I', 5: 'E', 4: 'G', 3: 'P', 2: 'R', 1: 'R', - 0: 'A'} - - radius_to_char_fine_linux = {19: 'A', 18: 'A', 17: 'B', 16: 'B', 15: 'B', 14: 'B', 13: 'F', 12: 'C', - 11: 'F', 10: 'C', - 9: 'D', 8: 'G', 7: 'D', 6: 'F', 5: 'D', 4: 'G', 3: 'M', 2: 'H', 1: 'H', - 0: 'A'} - - if sys.platform.startswith("win"): - if sys.getwindowsversion().build > 20000: # Windows 11 - cls.radius_to_char_fine = radius_to_char_fine_windows_11 - else: # < Windows 11 - cls.radius_to_char_fine = radius_to_char_fine_windows_10 - elif sys.platform.startswith("linux"): # Optimized on Kali Linux - cls.radius_to_char_fine = radius_to_char_fine_linux - else: - cls.radius_to_char_fine = radius_to_char_fine_windows_10 - - def _get_char_from_radius(self, radius: int) -> str: - if radius >= 20: - return "A" - else: - return self.radius_to_char_fine[radius] - - def create_aa_circle(self, x_pos: int, y_pos: int, radius: int, angle: int = 0, fill: str = "white", - tags: Union[str, Tuple[str, ...]] = "", anchor: str = tkinter.CENTER) -> int: - # create a circle with a font element - circle_1 = self.create_text(x_pos, y_pos, text=self._get_char_from_radius(radius), anchor=anchor, fill=fill, - font=("CustomTkinter_shapes_font", -radius * 2), tags=tags, angle=angle) - self.addtag_withtag("ctk_aa_circle_font_element", circle_1) - self._aa_circle_canvas_ids.add(circle_1) - - return circle_1 - - def coords(self, tag_or_id, *args): - - if type(tag_or_id) == str and "ctk_aa_circle_font_element" in self.gettags(tag_or_id): - coords_id = self.find_withtag(tag_or_id)[0] # take the lowest id for the given tag - super().coords(coords_id, *args[:2]) - - if len(args) == 3: - super().itemconfigure(coords_id, font=("CustomTkinter_shapes_font", -int(args[2]) * 2), text=self._get_char_from_radius(args[2])) - - elif type(tag_or_id) == int and tag_or_id in self._aa_circle_canvas_ids: - super().coords(tag_or_id, *args[:2]) - - if len(args) == 3: - super().itemconfigure(tag_or_id, font=("CustomTkinter_shapes_font", -args[2] * 2), text=self._get_char_from_radius(args[2])) - - else: - super().coords(tag_or_id, *args) - - def itemconfig(self, tag_or_id, *args, **kwargs): - kwargs_except_outline = kwargs.copy() - if "outline" in kwargs_except_outline: - del kwargs_except_outline["outline"] - - if type(tag_or_id) == int: - if tag_or_id in self._aa_circle_canvas_ids: - super().itemconfigure(tag_or_id, *args, **kwargs_except_outline) - else: - super().itemconfigure(tag_or_id, *args, **kwargs) - else: - configure_ids = self.find_withtag(tag_or_id) - for configure_id in configure_ids: - if configure_id in self._aa_circle_canvas_ids: - super().itemconfigure(configure_id, *args, **kwargs_except_outline) - else: - super().itemconfigure(configure_id, *args, **kwargs) diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/draw_engine.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/draw_engine.py deleted file mode 100644 index 5acea56..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/core_rendering/draw_engine.py +++ /dev/null @@ -1,1235 +0,0 @@ -from __future__ import annotations -import sys -import math -import tkinter -from typing import Union, TYPE_CHECKING - -if TYPE_CHECKING: - from ..core_rendering import CTkCanvas - - -class DrawEngine: - """ - This is the core of the CustomTkinter library where all the drawing on the tkinter.Canvas happens. - A year of experimenting and trying out different drawing methods have led to the current state of this - class, and I don't think there's much I can do to make the rendering look better than this with the - limited capabilities the tkinter.Canvas offers. - - Functions: - - draw_rounded_rect_with_border() - - draw_rounded_rect_with_border_vertical_split() - - draw_rounded_progress_bar_with_border() - - draw_rounded_slider_with_border_and_button() - - draw_rounded_scrollbar() - - draw_checkmark() - - draw_dropdown_arrow() - - """ - - preferred_drawing_method: str = None # 'polygon_shapes', 'font_shapes', 'circle_shapes' - - def __init__(self, canvas: CTkCanvas): - self._canvas = canvas - self._round_width_to_even_numbers: bool = True - self._round_height_to_even_numbers: bool = True - - def set_round_to_even_numbers(self, round_width_to_even_numbers: bool = True, round_height_to_even_numbers: bool = True): - self._round_width_to_even_numbers: bool = round_width_to_even_numbers - self._round_height_to_even_numbers: bool = round_height_to_even_numbers - - def __calc_optimal_corner_radius(self, user_corner_radius: Union[float, int]) -> Union[float, int]: - # optimize for drawing with polygon shapes - if self.preferred_drawing_method == "polygon_shapes": - if sys.platform == "darwin": - return user_corner_radius - else: - return round(user_corner_radius) - - # optimize for drawing with antialiased font shapes - elif self.preferred_drawing_method == "font_shapes": - return round(user_corner_radius) - - # optimize for drawing with circles and rects - elif self.preferred_drawing_method == "circle_shapes": - user_corner_radius = 0.5 * round(user_corner_radius / 0.5) # round to 0.5 steps - - # make sure the value is always with .5 at the end for smoother corners - if user_corner_radius == 0: - return 0 - elif user_corner_radius % 1 == 0: - return user_corner_radius + 0.5 - else: - return user_corner_radius - - def draw_background_corners(self, width: Union[float, int], height: Union[float, int], ): - if self._round_width_to_even_numbers: - width = math.floor(width / 2) * 2 # round (floor) _current_width and _current_height and restrict them to even values only - if self._round_height_to_even_numbers: - height = math.floor(height / 2) * 2 - - requires_recoloring = False - - if not self._canvas.find_withtag("background_corner_top_left"): - self._canvas.create_rectangle((0, 0, 0, 0), tags=("background_parts", "background_corner_top_left"), width=0) - requires_recoloring = True - if not self._canvas.find_withtag("background_corner_top_right"): - self._canvas.create_rectangle((0, 0, 0, 0), tags=("background_parts", "background_corner_top_right"), width=0) - requires_recoloring = True - if not self._canvas.find_withtag("background_corner_bottom_right"): - self._canvas.create_rectangle((0, 0, 0, 0), tags=("background_parts", "background_corner_bottom_right"), width=0) - requires_recoloring = True - if not self._canvas.find_withtag("background_corner_bottom_left"): - self._canvas.create_rectangle((0, 0, 0, 0), tags=("background_parts", "background_corner_bottom_left"), width=0) - requires_recoloring = True - - mid_width, mid_height = round(width / 2), round(height / 2) - self._canvas.coords("background_corner_top_left", (0, 0, mid_width, mid_height)) - self._canvas.coords("background_corner_top_right", (mid_width, 0, width, mid_height)) - self._canvas.coords("background_corner_bottom_right", (mid_width, mid_height, width, height)) - self._canvas.coords("background_corner_bottom_left", (0, mid_height, mid_width, height)) - - if requires_recoloring: # new parts were added -> manage z-order - self._canvas.tag_lower("background_parts") - - return requires_recoloring - - def draw_rounded_rect_with_border(self, width: Union[float, int], height: Union[float, int], corner_radius: Union[float, int], - border_width: Union[float, int], overwrite_preferred_drawing_method: str = None) -> bool: - """ Draws a rounded rectangle with a corner_radius and border_width on the canvas. The border elements have a 'border_parts' tag, - the main foreground elements have an 'inner_parts' tag to color the elements accordingly. - - returns bool if recoloring is necessary """ - - if self._round_width_to_even_numbers: - width = math.floor(width / 2) * 2 # round (floor) _current_width and _current_height and restrict them to even values only - if self._round_height_to_even_numbers: - height = math.floor(height / 2) * 2 - corner_radius = round(corner_radius) - - if corner_radius > width / 2 or corner_radius > height / 2: # restrict corner_radius if it's too large - corner_radius = min(width / 2, height / 2) - - border_width = round(border_width) - corner_radius = self.__calc_optimal_corner_radius(corner_radius) # optimize corner_radius for different drawing methods (different rounding) - - if corner_radius >= border_width: - inner_corner_radius = corner_radius - border_width - else: - inner_corner_radius = 0 - - if overwrite_preferred_drawing_method is not None: - preferred_drawing_method = overwrite_preferred_drawing_method - else: - preferred_drawing_method = self.preferred_drawing_method - - if preferred_drawing_method == "polygon_shapes": - return self.__draw_rounded_rect_with_border_polygon_shapes(width, height, corner_radius, border_width, inner_corner_radius) - elif preferred_drawing_method == "font_shapes": - return self.__draw_rounded_rect_with_border_font_shapes(width, height, corner_radius, border_width, inner_corner_radius, ()) - elif preferred_drawing_method == "circle_shapes": - return self.__draw_rounded_rect_with_border_circle_shapes(width, height, corner_radius, border_width, inner_corner_radius) - - def __draw_rounded_rect_with_border_polygon_shapes(self, width: int, height: int, corner_radius: int, border_width: int, inner_corner_radius: int) -> bool: - requires_recoloring = False - - # create border button parts (only if border exists) - if border_width > 0: - if not self._canvas.find_withtag("border_parts"): - self._canvas.create_polygon((0, 0, 0, 0), tags=("border_line_1", "border_parts")) - requires_recoloring = True - - self._canvas.coords("border_line_1", - (corner_radius, - corner_radius, - width - corner_radius, - corner_radius, - width - corner_radius, - height - corner_radius, - corner_radius, - height - corner_radius)) - self._canvas.itemconfig("border_line_1", - joinstyle=tkinter.ROUND, - width=corner_radius * 2) - - else: - self._canvas.delete("border_parts") - - # create inner button parts - if not self._canvas.find_withtag("inner_parts"): - self._canvas.create_polygon((0, 0, 0, 0), tags=("inner_line_1", "inner_parts"), joinstyle=tkinter.ROUND) - requires_recoloring = True - - if corner_radius <= border_width: - bottom_right_shift = -1 # weird canvas rendering inaccuracy that has to be corrected in some cases - else: - bottom_right_shift = 0 - - self._canvas.coords("inner_line_1", - border_width + inner_corner_radius, - border_width + inner_corner_radius, - width - (border_width + inner_corner_radius) + bottom_right_shift, - border_width + inner_corner_radius, - width - (border_width + inner_corner_radius) + bottom_right_shift, - height - (border_width + inner_corner_radius) + bottom_right_shift, - border_width + inner_corner_radius, - height - (border_width + inner_corner_radius) + bottom_right_shift) - self._canvas.itemconfig("inner_line_1", - width=inner_corner_radius * 2) - - if requires_recoloring: # new parts were added -> manage z-order - self._canvas.tag_lower("inner_parts") - self._canvas.tag_lower("border_parts") - self._canvas.tag_lower("background_parts") - - return requires_recoloring - - def __draw_rounded_rect_with_border_font_shapes(self, width: int, height: int, corner_radius: int, border_width: int, inner_corner_radius: int, - exclude_parts: tuple) -> bool: - requires_recoloring = False - - # create border button parts - if border_width > 0: - if corner_radius > 0: - # create canvas border corner parts if not already created, but only if needed, and delete if not needed - if not self._canvas.find_withtag("border_oval_1_a") and "border_oval_1" not in exclude_parts: - self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_1_a", "border_corner_part", "border_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_1_b", "border_corner_part", "border_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("border_oval_1_a") and "border_oval_1" in exclude_parts: - self._canvas.delete("border_oval_1_a", "border_oval_1_b") - - if not self._canvas.find_withtag("border_oval_2_a") and width > 2 * corner_radius and "border_oval_2" not in exclude_parts: - self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_2_a", "border_corner_part", "border_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_2_b", "border_corner_part", "border_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("border_oval_2_a") and (not width > 2 * corner_radius or "border_oval_2" in exclude_parts): - self._canvas.delete("border_oval_2_a", "border_oval_2_b") - - if not self._canvas.find_withtag("border_oval_3_a") and height > 2 * corner_radius \ - and width > 2 * corner_radius and "border_oval_3" not in exclude_parts: - self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_3_a", "border_corner_part", "border_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_3_b", "border_corner_part", "border_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("border_oval_3_a") and (not (height > 2 * corner_radius - and width > 2 * corner_radius) or "border_oval_3" in exclude_parts): - self._canvas.delete("border_oval_3_a", "border_oval_3_b") - - if not self._canvas.find_withtag("border_oval_4_a") and height > 2 * corner_radius and "border_oval_4" not in exclude_parts: - self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_4_a", "border_corner_part", "border_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_4_b", "border_corner_part", "border_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("border_oval_4_a") and (not height > 2 * corner_radius or "border_oval_4" in exclude_parts): - self._canvas.delete("border_oval_4_a", "border_oval_4_b") - - # change position of border corner parts - self._canvas.coords("border_oval_1_a", corner_radius, corner_radius, corner_radius) - self._canvas.coords("border_oval_1_b", corner_radius, corner_radius, corner_radius) - self._canvas.coords("border_oval_2_a", width - corner_radius, corner_radius, corner_radius) - self._canvas.coords("border_oval_2_b", width - corner_radius, corner_radius, corner_radius) - self._canvas.coords("border_oval_3_a", width - corner_radius, height - corner_radius, corner_radius) - self._canvas.coords("border_oval_3_b", width - corner_radius, height - corner_radius, corner_radius) - self._canvas.coords("border_oval_4_a", corner_radius, height - corner_radius, corner_radius) - self._canvas.coords("border_oval_4_b", corner_radius, height - corner_radius, corner_radius) - - else: - self._canvas.delete("border_corner_part") # delete border corner parts if not needed - - # create canvas border rectangle parts if not already created - if not self._canvas.find_withtag("border_rectangle_1"): - self._canvas.create_rectangle(0, 0, 0, 0, tags=("border_rectangle_1", "border_rectangle_part", "border_parts"), width=0) - self._canvas.create_rectangle(0, 0, 0, 0, tags=("border_rectangle_2", "border_rectangle_part", "border_parts"), width=0) - requires_recoloring = True - - # change position of border rectangle parts - self._canvas.coords("border_rectangle_1", (0, corner_radius, width, height - corner_radius)) - self._canvas.coords("border_rectangle_2", (corner_radius, 0, width - corner_radius, height)) - - else: - self._canvas.delete("border_parts") - - # create inner button parts - if inner_corner_radius > 0: - - # create canvas border corner parts if not already created, but only if they're needed and delete if not needed - if not self._canvas.find_withtag("inner_oval_1_a") and "inner_oval_1" not in exclude_parts: - self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_1_a", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_1_b", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("inner_oval_1_a") and "inner_oval_1" in exclude_parts: - self._canvas.delete("inner_oval_1_a", "inner_oval_1_b") - - if not self._canvas.find_withtag("inner_oval_2_a") and width - (2 * border_width) > 2 * inner_corner_radius and "inner_oval_2" not in exclude_parts: - self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_2_a", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_2_b", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("inner_oval_2_a") and (not width - (2 * border_width) > 2 * inner_corner_radius or "inner_oval_2" in exclude_parts): - self._canvas.delete("inner_oval_2_a", "inner_oval_2_b") - - if not self._canvas.find_withtag("inner_oval_3_a") and height - (2 * border_width) > 2 * inner_corner_radius \ - and width - (2 * border_width) > 2 * inner_corner_radius and "inner_oval_3" not in exclude_parts: - self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_3_a", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_3_b", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("inner_oval_3_a") and (not (height - (2 * border_width) > 2 * inner_corner_radius - and width - (2 * border_width) > 2 * inner_corner_radius) or "inner_oval_3" in exclude_parts): - self._canvas.delete("inner_oval_3_a", "inner_oval_3_b") - - if not self._canvas.find_withtag("inner_oval_4_a") and height - (2 * border_width) > 2 * inner_corner_radius and "inner_oval_4" not in exclude_parts: - self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_4_a", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_4_b", "inner_corner_part", "inner_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("inner_oval_4_a") and (not height - (2 * border_width) > 2 * inner_corner_radius or "inner_oval_4" in exclude_parts): - self._canvas.delete("inner_oval_4_a", "inner_oval_4_b") - - # change position of border corner parts - self._canvas.coords("inner_oval_1_a", border_width + inner_corner_radius, border_width + inner_corner_radius, inner_corner_radius) - self._canvas.coords("inner_oval_1_b", border_width + inner_corner_radius, border_width + inner_corner_radius, inner_corner_radius) - self._canvas.coords("inner_oval_2_a", width - border_width - inner_corner_radius, border_width + inner_corner_radius, inner_corner_radius) - self._canvas.coords("inner_oval_2_b", width - border_width - inner_corner_radius, border_width + inner_corner_radius, inner_corner_radius) - self._canvas.coords("inner_oval_3_a", width - border_width - inner_corner_radius, height - border_width - inner_corner_radius, inner_corner_radius) - self._canvas.coords("inner_oval_3_b", width - border_width - inner_corner_radius, height - border_width - inner_corner_radius, inner_corner_radius) - self._canvas.coords("inner_oval_4_a", border_width + inner_corner_radius, height - border_width - inner_corner_radius, inner_corner_radius) - self._canvas.coords("inner_oval_4_b", border_width + inner_corner_radius, height - border_width - inner_corner_radius, inner_corner_radius) - else: - self._canvas.delete("inner_corner_part") # delete inner corner parts if not needed - - # create canvas inner rectangle parts if not already created - if not self._canvas.find_withtag("inner_rectangle_1"): - self._canvas.create_rectangle(0, 0, 0, 0, tags=("inner_rectangle_1", "inner_rectangle_part", "inner_parts"), width=0) - requires_recoloring = True - - if not self._canvas.find_withtag("inner_rectangle_2") and inner_corner_radius * 2 < height - (border_width * 2): - self._canvas.create_rectangle(0, 0, 0, 0, tags=("inner_rectangle_2", "inner_rectangle_part", "inner_parts"), width=0) - requires_recoloring = True - - elif self._canvas.find_withtag("inner_rectangle_2") and not inner_corner_radius * 2 < height - (border_width * 2): - self._canvas.delete("inner_rectangle_2") - - # change position of inner rectangle parts - self._canvas.coords("inner_rectangle_1", (border_width + inner_corner_radius, - border_width, - width - border_width - inner_corner_radius, - height - border_width)) - self._canvas.coords("inner_rectangle_2", (border_width, - border_width + inner_corner_radius, - width - border_width, - height - inner_corner_radius - border_width)) - - if requires_recoloring: # new parts were added -> manage z-order - self._canvas.tag_lower("inner_parts") - self._canvas.tag_lower("border_parts") - self._canvas.tag_lower("background_parts") - - return requires_recoloring - - def __draw_rounded_rect_with_border_circle_shapes(self, width: int, height: int, corner_radius: int, border_width: int, inner_corner_radius: int) -> bool: - requires_recoloring = False - - # border button parts - if border_width > 0: - if corner_radius > 0: - - if not self._canvas.find_withtag("border_oval_1"): - self._canvas.create_oval(0, 0, 0, 0, tags=("border_oval_1", "border_corner_part", "border_parts"), width=0) - self._canvas.create_oval(0, 0, 0, 0, tags=("border_oval_2", "border_corner_part", "border_parts"), width=0) - self._canvas.create_oval(0, 0, 0, 0, tags=("border_oval_3", "border_corner_part", "border_parts"), width=0) - self._canvas.create_oval(0, 0, 0, 0, tags=("border_oval_4", "border_corner_part", "border_parts"), width=0) - self._canvas.tag_lower("border_parts") - requires_recoloring = True - - self._canvas.coords("border_oval_1", 0, 0, corner_radius * 2 - 1, corner_radius * 2 - 1) - self._canvas.coords("border_oval_2", width - corner_radius * 2, 0, width - 1, corner_radius * 2 - 1) - self._canvas.coords("border_oval_3", 0, height - corner_radius * 2, corner_radius * 2 - 1, height - 1) - self._canvas.coords("border_oval_4", width - corner_radius * 2, height - corner_radius * 2, width - 1, height - 1) - - else: - self._canvas.delete("border_corner_part") - - if not self._canvas.find_withtag("border_rectangle_1"): - self._canvas.create_rectangle(0, 0, 0, 0, tags=("border_rectangle_1", "border_rectangle_part", "border_parts"), width=0) - self._canvas.create_rectangle(0, 0, 0, 0, tags=("border_rectangle_2", "border_rectangle_part", "border_parts"), width=0) - self._canvas.tag_lower("border_parts") - requires_recoloring = True - - self._canvas.coords("border_rectangle_1", (0, corner_radius, width, height - corner_radius)) - self._canvas.coords("border_rectangle_2", (corner_radius, 0, width - corner_radius, height)) - - else: - self._canvas.delete("border_parts") - - # inner button parts - if inner_corner_radius > 0: - - if not self._canvas.find_withtag("inner_oval_1"): - self._canvas.create_oval(0, 0, 0, 0, tags=("inner_oval_1", "inner_corner_part", "inner_parts"), width=0) - self._canvas.create_oval(0, 0, 0, 0, tags=("inner_oval_2", "inner_corner_part", "inner_parts"), width=0) - self._canvas.create_oval(0, 0, 0, 0, tags=("inner_oval_3", "inner_corner_part", "inner_parts"), width=0) - self._canvas.create_oval(0, 0, 0, 0, tags=("inner_oval_4", "inner_corner_part", "inner_parts"), width=0) - self._canvas.tag_raise("inner_parts") - requires_recoloring = True - - self._canvas.coords("inner_oval_1", (border_width, border_width, - border_width + inner_corner_radius * 2 - 1, border_width + inner_corner_radius * 2 - 1)) - self._canvas.coords("inner_oval_2", (width - border_width - inner_corner_radius * 2, border_width, - width - border_width - 1, border_width + inner_corner_radius * 2 - 1)) - self._canvas.coords("inner_oval_3", (border_width, height - border_width - inner_corner_radius * 2, - border_width + inner_corner_radius * 2 - 1, height - border_width - 1)) - self._canvas.coords("inner_oval_4", (width - border_width - inner_corner_radius * 2, height - border_width - inner_corner_radius * 2, - width - border_width - 1, height - border_width - 1)) - else: - self._canvas.delete("inner_corner_part") # delete inner corner parts if not needed - - if not self._canvas.find_withtag("inner_rectangle_1"): - self._canvas.create_rectangle(0, 0, 0, 0, tags=("inner_rectangle_1", "inner_rectangle_part", "inner_parts"), width=0) - self._canvas.create_rectangle(0, 0, 0, 0, tags=("inner_rectangle_2", "inner_rectangle_part", "inner_parts"), width=0) - self._canvas.tag_raise("inner_parts") - requires_recoloring = True - - self._canvas.coords("inner_rectangle_1", (border_width + inner_corner_radius, - border_width, - width - border_width - inner_corner_radius, - height - border_width)) - self._canvas.coords("inner_rectangle_2", (border_width, - border_width + inner_corner_radius, - width - border_width, - height - inner_corner_radius - border_width)) - - return requires_recoloring - - def draw_rounded_rect_with_border_vertical_split(self, width: Union[float, int], height: Union[float, int], corner_radius: Union[float, int], - border_width: Union[float, int], left_section_width: Union[float, int]) -> bool: - """ Draws a rounded rectangle with a corner_radius and border_width on the canvas which is split at left_section_width. - The border elements have the tags 'border_parts_left', 'border_parts_lright', - the main foreground elements have an 'inner_parts_left' and inner_parts_right' tag, - to color the elements accordingly. - - returns bool if recoloring is necessary """ - - left_section_width = round(left_section_width) - if self._round_width_to_even_numbers: - width = math.floor(width / 2) * 2 # round (floor) _current_width and _current_height and restrict them to even values only - if self._round_height_to_even_numbers: - height = math.floor(height / 2) * 2 - corner_radius = round(corner_radius) - - if corner_radius > width / 2 or corner_radius > height / 2: # restrict corner_radius if it's too larger - corner_radius = min(width / 2, height / 2) - - border_width = round(border_width) - corner_radius = self.__calc_optimal_corner_radius(corner_radius) # optimize corner_radius for different drawing methods (different rounding) - - if corner_radius >= border_width: - inner_corner_radius = corner_radius - border_width - else: - inner_corner_radius = 0 - - if left_section_width > width - corner_radius * 2: - left_section_width = width - corner_radius * 2 - elif left_section_width < corner_radius * 2: - left_section_width = corner_radius * 2 - - if self.preferred_drawing_method == "polygon_shapes" or self.preferred_drawing_method == "circle_shapes": - return self.__draw_rounded_rect_with_border_vertical_split_polygon_shapes(width, height, corner_radius, border_width, inner_corner_radius, left_section_width) - elif self.preferred_drawing_method == "font_shapes": - return self.__draw_rounded_rect_with_border_vertical_split_font_shapes(width, height, corner_radius, border_width, inner_corner_radius, left_section_width, ()) - - def __draw_rounded_rect_with_border_vertical_split_polygon_shapes(self, width: int, height: int, corner_radius: int, border_width: int, inner_corner_radius: int, - left_section_width: int) -> bool: - requires_recoloring = False - - # create border button parts (only if border exists) - if border_width > 0: - if not self._canvas.find_withtag("border_parts"): - self._canvas.create_polygon((0, 0, 0, 0), tags=("border_line_left_1", "border_parts_left", "border_parts", "left_parts")) - self._canvas.create_polygon((0, 0, 0, 0), tags=("border_line_right_1", "border_parts_right", "border_parts", "right_parts")) - self._canvas.create_rectangle((0, 0, 0, 0), tags=("border_rect_left_1", "border_parts_left", "border_parts", "left_parts"), width=0) - self._canvas.create_rectangle((0, 0, 0, 0), tags=("border_rect_right_1", "border_parts_right", "border_parts", "right_parts"), width=0) - requires_recoloring = True - - self._canvas.coords("border_line_left_1", - (corner_radius, - corner_radius, - left_section_width - corner_radius, - corner_radius, - left_section_width - corner_radius, - height - corner_radius, - corner_radius, - height - corner_radius)) - self._canvas.coords("border_line_right_1", - (left_section_width + corner_radius, - corner_radius, - width - corner_radius, - corner_radius, - width - corner_radius, - height - corner_radius, - left_section_width + corner_radius, - height - corner_radius)) - self._canvas.coords("border_rect_left_1", - (left_section_width - corner_radius, - 0, - left_section_width, - height)) - self._canvas.coords("border_rect_right_1", - (left_section_width, - 0, - left_section_width + corner_radius, - height)) - self._canvas.itemconfig("border_line_left_1", joinstyle=tkinter.ROUND, width=corner_radius * 2) - self._canvas.itemconfig("border_line_right_1", joinstyle=tkinter.ROUND, width=corner_radius * 2) - - else: - self._canvas.delete("border_parts") - - # create inner button parts - if not self._canvas.find_withtag("inner_parts"): - self._canvas.create_polygon((0, 0, 0, 0), tags=("inner_line_left_1", "inner_parts_left", "inner_parts", "left_parts"), joinstyle=tkinter.ROUND) - self._canvas.create_polygon((0, 0, 0, 0), tags=("inner_line_right_1", "inner_parts_right", "inner_parts", "right_parts"), joinstyle=tkinter.ROUND) - self._canvas.create_rectangle((0, 0, 0, 0), tags=("inner_rect_left_1", "inner_parts_left", "inner_parts", "left_parts"), width=0) - self._canvas.create_rectangle((0, 0, 0, 0), tags=("inner_rect_right_1", "inner_parts_right", "inner_parts", "right_parts"), width=0) - requires_recoloring = True - - self._canvas.coords("inner_line_left_1", - corner_radius, - corner_radius, - left_section_width - inner_corner_radius, - corner_radius, - left_section_width - inner_corner_radius, - height - corner_radius, - corner_radius, - height - corner_radius) - self._canvas.coords("inner_line_right_1", - left_section_width + inner_corner_radius, - corner_radius, - width - corner_radius, - corner_radius, - width - corner_radius, - height - corner_radius, - left_section_width + inner_corner_radius, - height - corner_radius) - self._canvas.coords("inner_rect_left_1", - (left_section_width - inner_corner_radius, - border_width, - left_section_width, - height - border_width)) - self._canvas.coords("inner_rect_right_1", - (left_section_width, - border_width, - left_section_width + inner_corner_radius, - height - border_width)) - self._canvas.itemconfig("inner_line_left_1", width=inner_corner_radius * 2) - self._canvas.itemconfig("inner_line_right_1", width=inner_corner_radius * 2) - - if requires_recoloring: # new parts were added -> manage z-order - self._canvas.tag_lower("inner_parts") - self._canvas.tag_lower("border_parts") - self._canvas.tag_lower("background_parts") - - return requires_recoloring - - def __draw_rounded_rect_with_border_vertical_split_font_shapes(self, width: int, height: int, corner_radius: int, border_width: int, inner_corner_radius: int, - left_section_width: int, exclude_parts: tuple) -> bool: - requires_recoloring = False - - # create border button parts - if border_width > 0: - if corner_radius > 0: - # create canvas border corner parts if not already created, but only if needed, and delete if not needed - if not self._canvas.find_withtag("border_oval_1_a") and "border_oval_1" not in exclude_parts: - self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_1_a", "border_corner_part", "border_parts_left", "border_parts", "left_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_1_b", "border_corner_part", "border_parts_left", "border_parts", "left_parts"), anchor=tkinter.CENTER, - angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("border_oval_1_a") and "border_oval_1" in exclude_parts: - self._canvas.delete("border_oval_1_a", "border_oval_1_b") - - if not self._canvas.find_withtag("border_oval_2_a") and width > 2 * corner_radius and "border_oval_2" not in exclude_parts: - self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_2_a", "border_corner_part", "border_parts_right", "border_parts", "right_parts"), - anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_2_b", "border_corner_part", "border_parts_right", "border_parts", "right_parts"), - anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("border_oval_2_a") and (not width > 2 * corner_radius or "border_oval_2" in exclude_parts): - self._canvas.delete("border_oval_2_a", "border_oval_2_b") - - if not self._canvas.find_withtag("border_oval_3_a") and height > 2 * corner_radius \ - and width > 2 * corner_radius and "border_oval_3" not in exclude_parts: - self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_3_a", "border_corner_part", "border_parts_right", "border_parts", "right_parts"), - anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_3_b", "border_corner_part", "border_parts_right", "border_parts", "right_parts"), - anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("border_oval_3_a") and (not (height > 2 * corner_radius - and width > 2 * corner_radius) or "border_oval_3" in exclude_parts): - self._canvas.delete("border_oval_3_a", "border_oval_3_b") - - if not self._canvas.find_withtag("border_oval_4_a") and height > 2 * corner_radius and "border_oval_4" not in exclude_parts: - self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_4_a", "border_corner_part", "border_parts_left", "border_parts", "left_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("border_oval_4_b", "border_corner_part", "border_parts_left", "border_parts", "left_parts"), anchor=tkinter.CENTER, - angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("border_oval_4_a") and (not height > 2 * corner_radius or "border_oval_4" in exclude_parts): - self._canvas.delete("border_oval_4_a", "border_oval_4_b") - - # change position of border corner parts - self._canvas.coords("border_oval_1_a", corner_radius, corner_radius, corner_radius) - self._canvas.coords("border_oval_1_b", corner_radius, corner_radius, corner_radius) - self._canvas.coords("border_oval_2_a", width - corner_radius, corner_radius, corner_radius) - self._canvas.coords("border_oval_2_b", width - corner_radius, corner_radius, corner_radius) - self._canvas.coords("border_oval_3_a", width - corner_radius, height - corner_radius, corner_radius) - self._canvas.coords("border_oval_3_b", width - corner_radius, height - corner_radius, corner_radius) - self._canvas.coords("border_oval_4_a", corner_radius, height - corner_radius, corner_radius) - self._canvas.coords("border_oval_4_b", corner_radius, height - corner_radius, corner_radius) - - else: - self._canvas.delete("border_corner_part") # delete border corner parts if not needed - - # create canvas border rectangle parts if not already created - if not self._canvas.find_withtag("border_rectangle_1"): - self._canvas.create_rectangle(0, 0, 0, 0, tags=("border_rectangle_left_1", "border_rectangle_part", "border_parts_left", "border_parts", "left_parts"), width=0) - self._canvas.create_rectangle(0, 0, 0, 0, tags=("border_rectangle_left_2", "border_rectangle_part", "border_parts_left", "border_parts", "left_parts"), width=0) - self._canvas.create_rectangle(0, 0, 0, 0, tags=("border_rectangle_right_1", "border_rectangle_part", "border_parts_right", "border_parts", "right_parts"), width=0) - self._canvas.create_rectangle(0, 0, 0, 0, tags=("border_rectangle_right_2", "border_rectangle_part", "border_parts_right", "border_parts", "right_parts"), width=0) - requires_recoloring = True - - # change position of border rectangle parts - self._canvas.coords("border_rectangle_left_1", (0, corner_radius, left_section_width, height - corner_radius)) - self._canvas.coords("border_rectangle_left_2", (corner_radius, 0, left_section_width, height)) - self._canvas.coords("border_rectangle_right_1", (left_section_width, corner_radius, width, height - corner_radius)) - self._canvas.coords("border_rectangle_right_2", (left_section_width, 0, width - corner_radius, height)) - - else: - self._canvas.delete("border_parts") - - # create inner button parts - if inner_corner_radius > 0: - - # create canvas border corner parts if not already created, but only if they're needed and delete if not needed - if not self._canvas.find_withtag("inner_oval_1_a") and "inner_oval_1" not in exclude_parts: - self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_1_a", "inner_corner_part", "inner_parts_left", "inner_parts", "left_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_1_b", "inner_corner_part", "inner_parts_left", "inner_parts", "left_parts"), anchor=tkinter.CENTER, - angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("inner_oval_1_a") and "inner_oval_1" in exclude_parts: - self._canvas.delete("inner_oval_1_a", "inner_oval_1_b") - - if not self._canvas.find_withtag("inner_oval_2_a") and width - (2 * border_width) > 2 * inner_corner_radius and "inner_oval_2" not in exclude_parts: - self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_2_a", "inner_corner_part", "inner_parts_right", "inner_parts", "right_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_2_b", "inner_corner_part", "inner_parts_right", "inner_parts", "right_parts"), anchor=tkinter.CENTER, - angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("inner_oval_2_a") and (not width - (2 * border_width) > 2 * inner_corner_radius or "inner_oval_2" in exclude_parts): - self._canvas.delete("inner_oval_2_a", "inner_oval_2_b") - - if not self._canvas.find_withtag("inner_oval_3_a") and height - (2 * border_width) > 2 * inner_corner_radius \ - and width - (2 * border_width) > 2 * inner_corner_radius and "inner_oval_3" not in exclude_parts: - self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_3_a", "inner_corner_part", "inner_parts_right", "inner_parts", "right_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_3_b", "inner_corner_part", "inner_parts_right", "inner_parts", "right_parts"), anchor=tkinter.CENTER, - angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("inner_oval_3_a") and (not (height - (2 * border_width) > 2 * inner_corner_radius - and width - (2 * border_width) > 2 * inner_corner_radius) or "inner_oval_3" in exclude_parts): - self._canvas.delete("inner_oval_3_a", "inner_oval_3_b") - - if not self._canvas.find_withtag("inner_oval_4_a") and height - (2 * border_width) > 2 * inner_corner_radius and "inner_oval_4" not in exclude_parts: - self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_4_a", "inner_corner_part", "inner_parts_left", "inner_parts", "left_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("inner_oval_4_b", "inner_corner_part", "inner_parts_left", "inner_parts", "left_parts"), anchor=tkinter.CENTER, - angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("inner_oval_4_a") and (not height - (2 * border_width) > 2 * inner_corner_radius or "inner_oval_4" in exclude_parts): - self._canvas.delete("inner_oval_4_a", "inner_oval_4_b") - - # change position of border corner parts - self._canvas.coords("inner_oval_1_a", border_width + inner_corner_radius, border_width + inner_corner_radius, inner_corner_radius) - self._canvas.coords("inner_oval_1_b", border_width + inner_corner_radius, border_width + inner_corner_radius, inner_corner_radius) - self._canvas.coords("inner_oval_2_a", width - border_width - inner_corner_radius, border_width + inner_corner_radius, inner_corner_radius) - self._canvas.coords("inner_oval_2_b", width - border_width - inner_corner_radius, border_width + inner_corner_radius, inner_corner_radius) - self._canvas.coords("inner_oval_3_a", width - border_width - inner_corner_radius, height - border_width - inner_corner_radius, inner_corner_radius) - self._canvas.coords("inner_oval_3_b", width - border_width - inner_corner_radius, height - border_width - inner_corner_radius, inner_corner_radius) - self._canvas.coords("inner_oval_4_a", border_width + inner_corner_radius, height - border_width - inner_corner_radius, inner_corner_radius) - self._canvas.coords("inner_oval_4_b", border_width + inner_corner_radius, height - border_width - inner_corner_radius, inner_corner_radius) - else: - self._canvas.delete("inner_corner_part") # delete inner corner parts if not needed - - # create canvas inner rectangle parts if not already created - if not self._canvas.find_withtag("inner_rectangle_1"): - self._canvas.create_rectangle(0, 0, 0, 0, tags=("inner_rectangle_left_1", "inner_rectangle_part", "inner_parts_left", "inner_parts", "left_parts"), width=0) - self._canvas.create_rectangle(0, 0, 0, 0, tags=("inner_rectangle_right_1", "inner_rectangle_part", "inner_parts_right", "inner_parts", "right_parts"), width=0) - requires_recoloring = True - - if not self._canvas.find_withtag("inner_rectangle_2") and inner_corner_radius * 2 < height - (border_width * 2): - self._canvas.create_rectangle(0, 0, 0, 0, tags=("inner_rectangle_left_2", "inner_rectangle_part", "inner_parts_left", "inner_parts", "left_parts"), width=0) - self._canvas.create_rectangle(0, 0, 0, 0, tags=("inner_rectangle_right_2", "inner_rectangle_part", "inner_parts_right", "inner_parts", "right_parts"), width=0) - requires_recoloring = True - - elif self._canvas.find_withtag("inner_rectangle_2") and not inner_corner_radius * 2 < height - (border_width * 2): - self._canvas.delete("inner_rectangle_left_2") - self._canvas.delete("inner_rectangle_right_2") - - # change position of inner rectangle parts - self._canvas.coords("inner_rectangle_left_1", (border_width + inner_corner_radius, - border_width, - left_section_width, - height - border_width)) - self._canvas.coords("inner_rectangle_left_2", (border_width, - border_width + inner_corner_radius, - left_section_width, - height - inner_corner_radius - border_width)) - self._canvas.coords("inner_rectangle_right_1", (left_section_width, - border_width, - width - border_width - inner_corner_radius, - height - border_width)) - self._canvas.coords("inner_rectangle_right_2", (left_section_width, - border_width + inner_corner_radius, - width - border_width, - height - inner_corner_radius - border_width)) - - if requires_recoloring: # new parts were added -> manage z-order - self._canvas.tag_lower("inner_parts") - self._canvas.tag_lower("border_parts") - self._canvas.tag_lower("background_parts") - - return requires_recoloring - - def draw_rounded_progress_bar_with_border(self, width: Union[float, int], height: Union[float, int], corner_radius: Union[float, int], - border_width: Union[float, int], progress_value_1: float, progress_value_2: float, orientation: str) -> bool: - """ Draws a rounded bar on the canvas, and onntop sits a progress bar from value 1 to value 2 (range 0-1, left to right, bottom to top). - The border elements get the 'border_parts' tag", the main elements get the 'inner_parts' tag and - the progress elements get the 'progress_parts' tag. The 'orientation' argument defines from which direction the progress starts (n, w, s, e). - - returns bool if recoloring is necessary """ - - if self._round_width_to_even_numbers: - width = math.floor(width / 2) * 2 # round _current_width and _current_height and restrict them to even values only - if self._round_height_to_even_numbers: - height = math.floor(height / 2) * 2 - - if corner_radius > width / 2 or corner_radius > height / 2: # restrict corner_radius if it's too larger - corner_radius = min(width / 2, height / 2) - - border_width = round(border_width) - corner_radius = self.__calc_optimal_corner_radius(corner_radius) # optimize corner_radius for different drawing methods (different rounding) - - if corner_radius >= border_width: - inner_corner_radius = corner_radius - border_width - else: - inner_corner_radius = 0 - - if self.preferred_drawing_method == "polygon_shapes" or self.preferred_drawing_method == "circle_shapes": - return self.__draw_rounded_progress_bar_with_border_polygon_shapes(width, height, corner_radius, border_width, inner_corner_radius, - progress_value_1, progress_value_2, orientation) - elif self.preferred_drawing_method == "font_shapes": - return self.__draw_rounded_progress_bar_with_border_font_shapes(width, height, corner_radius, border_width, inner_corner_radius, - progress_value_1, progress_value_2, orientation) - - def __draw_rounded_progress_bar_with_border_polygon_shapes(self, width: int, height: int, corner_radius: int, border_width: int, inner_corner_radius: int, - progress_value_1: float, progress_value_2: float, orientation: str) -> bool: - - requires_recoloring = self.__draw_rounded_rect_with_border_polygon_shapes(width, height, corner_radius, border_width, inner_corner_radius) - - if corner_radius <= border_width: - bottom_right_shift = 0 # weird canvas rendering inaccuracy that has to be corrected in some cases - else: - bottom_right_shift = 0 - - # create progress parts - if not self._canvas.find_withtag("progress_parts"): - self._canvas.create_polygon((0, 0, 0, 0), tags=("progress_line_1", "progress_parts"), joinstyle=tkinter.ROUND) - self._canvas.tag_raise("progress_parts", "inner_parts") - requires_recoloring = True - - if orientation == "w": - self._canvas.coords("progress_line_1", - border_width + inner_corner_radius + (width - 2 * border_width - 2 * inner_corner_radius) * progress_value_1, - border_width + inner_corner_radius, - border_width + inner_corner_radius + (width - 2 * border_width - 2 * inner_corner_radius) * progress_value_2, - border_width + inner_corner_radius, - border_width + inner_corner_radius + (width - 2 * border_width - 2 * inner_corner_radius) * progress_value_2, - height - (border_width + inner_corner_radius) + bottom_right_shift, - border_width + inner_corner_radius + (width - 2 * border_width - 2 * inner_corner_radius) * progress_value_1, - height - (border_width + inner_corner_radius) + bottom_right_shift) - - elif orientation == "s": - self._canvas.coords("progress_line_1", - border_width + inner_corner_radius, - border_width + inner_corner_radius + (height - 2 * border_width - 2 * inner_corner_radius) * (1 - progress_value_2), - width - (border_width + inner_corner_radius), - border_width + inner_corner_radius + (height - 2 * border_width - 2 * inner_corner_radius) * (1 - progress_value_2), - width - (border_width + inner_corner_radius), - border_width + inner_corner_radius + (height - 2 * border_width - 2 * inner_corner_radius) * (1 - progress_value_1), - border_width + inner_corner_radius, - border_width + inner_corner_radius + (height - 2 * border_width - 2 * inner_corner_radius) * (1 - progress_value_1)) - - self._canvas.itemconfig("progress_line_1", width=inner_corner_radius * 2) - - return requires_recoloring - - def __draw_rounded_progress_bar_with_border_font_shapes(self, width: int, height: int, corner_radius: int, border_width: int, inner_corner_radius: int, - progress_value_1: float, progress_value_2: float, orientation: str) -> bool: - - requires_recoloring, requires_recoloring_2 = False, False - - if inner_corner_radius > 0: - # create canvas border corner parts if not already created - if not self._canvas.find_withtag("progress_oval_1_a"): - self._canvas.create_aa_circle(0, 0, 0, tags=("progress_oval_1_a", "progress_corner_part", "progress_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("progress_oval_1_b", "progress_corner_part", "progress_parts"), anchor=tkinter.CENTER, angle=180) - self._canvas.create_aa_circle(0, 0, 0, tags=("progress_oval_2_a", "progress_corner_part", "progress_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("progress_oval_2_b", "progress_corner_part", "progress_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - - if not self._canvas.find_withtag("progress_oval_3_a") and round(inner_corner_radius) * 2 < height - 2 * border_width: - self._canvas.create_aa_circle(0, 0, 0, tags=("progress_oval_3_a", "progress_corner_part", "progress_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("progress_oval_3_b", "progress_corner_part", "progress_parts"), anchor=tkinter.CENTER, angle=180) - self._canvas.create_aa_circle(0, 0, 0, tags=("progress_oval_4_a", "progress_corner_part", "progress_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("progress_oval_4_b", "progress_corner_part", "progress_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("progress_oval_3_a") and not round(inner_corner_radius) * 2 < height - 2 * border_width: - self._canvas.delete("progress_oval_3_a", "progress_oval_3_b", "progress_oval_4_a", "progress_oval_4_b") - - if not self._canvas.find_withtag("progress_rectangle_1"): - self._canvas.create_rectangle(0, 0, 0, 0, tags=("progress_rectangle_1", "progress_rectangle_part", "progress_parts"), width=0) - requires_recoloring = True - - if not self._canvas.find_withtag("progress_rectangle_2") and inner_corner_radius * 2 < height - (border_width * 2): - self._canvas.create_rectangle(0, 0, 0, 0, tags=("progress_rectangle_2", "progress_rectangle_part", "progress_parts"), width=0) - requires_recoloring = True - elif self._canvas.find_withtag("progress_rectangle_2") and not inner_corner_radius * 2 < height - (border_width * 2): - self._canvas.delete("progress_rectangle_2") - - # horizontal orientation from the bottom - if orientation == "w": - requires_recoloring_2 = self.__draw_rounded_rect_with_border_font_shapes(width, height, corner_radius, border_width, inner_corner_radius, - ()) - - # set positions of progress corner parts - self._canvas.coords("progress_oval_1_a", border_width + inner_corner_radius + (width - 2 * border_width - 2 * inner_corner_radius) * progress_value_1, - border_width + inner_corner_radius, inner_corner_radius) - self._canvas.coords("progress_oval_1_b", border_width + inner_corner_radius + (width - 2 * border_width - 2 * inner_corner_radius) * progress_value_1, - border_width + inner_corner_radius, inner_corner_radius) - self._canvas.coords("progress_oval_2_a", border_width + inner_corner_radius + (width - 2 * border_width - 2 * inner_corner_radius) * progress_value_2, - border_width + inner_corner_radius, inner_corner_radius) - self._canvas.coords("progress_oval_2_b", border_width + inner_corner_radius + (width - 2 * border_width - 2 * inner_corner_radius) * progress_value_2, - border_width + inner_corner_radius, inner_corner_radius) - self._canvas.coords("progress_oval_3_a", border_width + inner_corner_radius + (width - 2 * border_width - 2 * inner_corner_radius) * progress_value_2, - height - border_width - inner_corner_radius, inner_corner_radius) - self._canvas.coords("progress_oval_3_b", border_width + inner_corner_radius + (width - 2 * border_width - 2 * inner_corner_radius) * progress_value_2, - height - border_width - inner_corner_radius, inner_corner_radius) - self._canvas.coords("progress_oval_4_a", border_width + inner_corner_radius + (width - 2 * border_width - 2 * inner_corner_radius) * progress_value_1, - height - border_width - inner_corner_radius, inner_corner_radius) - self._canvas.coords("progress_oval_4_b", border_width + inner_corner_radius + (width - 2 * border_width - 2 * inner_corner_radius) * progress_value_1, - height - border_width - inner_corner_radius, inner_corner_radius) - - # set positions of progress rect parts - self._canvas.coords("progress_rectangle_1", - border_width + inner_corner_radius + (width - 2 * border_width - 2 * inner_corner_radius) * progress_value_1, - border_width, - border_width + inner_corner_radius + (width - 2 * border_width - 2 * inner_corner_radius) * progress_value_2, - height - border_width) - self._canvas.coords("progress_rectangle_2", - border_width + 2 * inner_corner_radius + (width - 2 * inner_corner_radius - 2 * border_width) * progress_value_1, - border_width + inner_corner_radius, - border_width + 2 * inner_corner_radius + (width - 2 * inner_corner_radius - 2 * border_width) * progress_value_2, - height - inner_corner_radius - border_width) - - # vertical orientation from the bottom - if orientation == "s": - requires_recoloring_2 = self.__draw_rounded_rect_with_border_font_shapes(width, height, corner_radius, border_width, inner_corner_radius, - ()) - - # set positions of progress corner parts - self._canvas.coords("progress_oval_1_a", border_width + inner_corner_radius, - border_width + inner_corner_radius + (height - 2 * border_width - 2 * inner_corner_radius) * (1 - progress_value_2), inner_corner_radius) - self._canvas.coords("progress_oval_1_b", border_width + inner_corner_radius, - border_width + inner_corner_radius + (height - 2 * border_width - 2 * inner_corner_radius) * (1 - progress_value_2), inner_corner_radius) - self._canvas.coords("progress_oval_2_a", width - border_width - inner_corner_radius, - border_width + inner_corner_radius + (height - 2 * border_width - 2 * inner_corner_radius) * (1 - progress_value_2), inner_corner_radius) - self._canvas.coords("progress_oval_2_b", width - border_width - inner_corner_radius, - border_width + inner_corner_radius + (height - 2 * border_width - 2 * inner_corner_radius) * (1 - progress_value_2), inner_corner_radius) - self._canvas.coords("progress_oval_3_a", width - border_width - inner_corner_radius, - border_width + inner_corner_radius + (height - 2 * border_width - 2 * inner_corner_radius) * (1 - progress_value_1), inner_corner_radius) - self._canvas.coords("progress_oval_3_b", width - border_width - inner_corner_radius, - border_width + inner_corner_radius + (height - 2 * border_width - 2 * inner_corner_radius) * (1 - progress_value_1), inner_corner_radius) - self._canvas.coords("progress_oval_4_a", border_width + inner_corner_radius, - border_width + inner_corner_radius + (height - 2 * border_width - 2 * inner_corner_radius) * (1 - progress_value_1), inner_corner_radius) - self._canvas.coords("progress_oval_4_b", border_width + inner_corner_radius, - border_width + inner_corner_radius + (height - 2 * border_width - 2 * inner_corner_radius) * (1 - progress_value_1), inner_corner_radius) - - # set positions of progress rect parts - self._canvas.coords("progress_rectangle_1", - border_width + inner_corner_radius, - border_width + (height - 2 * border_width - 2 * inner_corner_radius) * (1 - progress_value_2), - width - border_width - inner_corner_radius, - border_width + (height - 2 * border_width - 2 * inner_corner_radius) * (1 - progress_value_1)) - self._canvas.coords("progress_rectangle_2", - border_width, - border_width + inner_corner_radius + (height - 2 * border_width - 2 * inner_corner_radius) * (1 - progress_value_2), - width - border_width, - border_width + inner_corner_radius + (height - 2 * border_width - 2 * inner_corner_radius) * (1 - progress_value_1)) - - return requires_recoloring or requires_recoloring_2 - - def draw_rounded_slider_with_border_and_button(self, width: Union[float, int], height: Union[float, int], corner_radius: Union[float, int], - border_width: Union[float, int], button_length: Union[float, int], button_corner_radius: Union[float, int], - slider_value: float, orientation: str) -> bool: - - if self._round_width_to_even_numbers: - width = math.floor(width / 2) * 2 # round _current_width and _current_height and restrict them to even values only - if self._round_height_to_even_numbers: - height = math.floor(height / 2) * 2 - - if corner_radius > width / 2 or corner_radius > height / 2: # restrict corner_radius if it's too larger - corner_radius = min(width / 2, height / 2) - - if button_corner_radius > width / 2 or button_corner_radius > height / 2: # restrict button_corner_radius if it's too larger - button_corner_radius = min(width / 2, height / 2) - - button_length = round(button_length) - border_width = round(border_width) - button_corner_radius = round(button_corner_radius) - corner_radius = self.__calc_optimal_corner_radius(corner_radius) # optimize corner_radius for different drawing methods (different rounding) - - if corner_radius >= border_width: - inner_corner_radius = corner_radius - border_width - else: - inner_corner_radius = 0 - - if self.preferred_drawing_method == "polygon_shapes" or self.preferred_drawing_method == "circle_shapes": - return self.__draw_rounded_slider_with_border_and_button_polygon_shapes(width, height, corner_radius, border_width, inner_corner_radius, - button_length, button_corner_radius, slider_value, orientation) - elif self.preferred_drawing_method == "font_shapes": - return self.__draw_rounded_slider_with_border_and_button_font_shapes(width, height, corner_radius, border_width, inner_corner_radius, - button_length, button_corner_radius, slider_value, orientation) - - def __draw_rounded_slider_with_border_and_button_polygon_shapes(self, width: int, height: int, corner_radius: int, border_width: int, inner_corner_radius: int, - button_length: int, button_corner_radius: int, slider_value: float, orientation: str) -> bool: - - # draw normal progressbar - requires_recoloring = self.__draw_rounded_progress_bar_with_border_polygon_shapes(width, height, corner_radius, border_width, inner_corner_radius, - 0, slider_value, orientation) - - # create slider button part - if not self._canvas.find_withtag("slider_parts"): - self._canvas.create_polygon((0, 0, 0, 0), tags=("slider_line_1", "slider_parts"), joinstyle=tkinter.ROUND) - self._canvas.tag_raise("slider_parts") # manage z-order - requires_recoloring = True - - if corner_radius <= border_width: - bottom_right_shift = -1 # weird canvas rendering inaccuracy that has to be corrected in some cases - else: - bottom_right_shift = 0 - - if orientation == "w": - slider_x_position = corner_radius + (button_length / 2) + (width - 2 * corner_radius - button_length) * slider_value - self._canvas.coords("slider_line_1", - slider_x_position - (button_length / 2), button_corner_radius, - slider_x_position + (button_length / 2), button_corner_radius, - slider_x_position + (button_length / 2), height - button_corner_radius, - slider_x_position - (button_length / 2), height - button_corner_radius) - self._canvas.itemconfig("slider_line_1", - width=button_corner_radius * 2) - elif orientation == "s": - slider_y_position = corner_radius + (button_length / 2) + (height - 2 * corner_radius - button_length) * (1 - slider_value) - self._canvas.coords("slider_line_1", - button_corner_radius, slider_y_position - (button_length / 2), - button_corner_radius, slider_y_position + (button_length / 2), - width - button_corner_radius, slider_y_position + (button_length / 2), - width - button_corner_radius, slider_y_position - (button_length / 2)) - self._canvas.itemconfig("slider_line_1", - width=button_corner_radius * 2) - - return requires_recoloring - - def __draw_rounded_slider_with_border_and_button_font_shapes(self, width: int, height: int, corner_radius: int, border_width: int, inner_corner_radius: int, - button_length: int, button_corner_radius: int, slider_value: float, orientation: str) -> bool: - - # draw normal progressbar - requires_recoloring = self.__draw_rounded_progress_bar_with_border_font_shapes(width, height, corner_radius, border_width, inner_corner_radius, - 0, slider_value, orientation) - - # create 4 circles (if not needed, then less) - if not self._canvas.find_withtag("slider_oval_1_a"): - self._canvas.create_aa_circle(0, 0, 0, tags=("slider_oval_1_a", "slider_corner_part", "slider_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("slider_oval_1_b", "slider_corner_part", "slider_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - - if not self._canvas.find_withtag("slider_oval_2_a") and button_length > 0: - self._canvas.create_aa_circle(0, 0, 0, tags=("slider_oval_2_a", "slider_corner_part", "slider_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("slider_oval_2_b", "slider_corner_part", "slider_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("slider_oval_2_a") and not button_length > 0: - self._canvas.delete("slider_oval_2_a", "slider_oval_2_b") - - if not self._canvas.find_withtag("slider_oval_4_a") and height > 2 * button_corner_radius: - self._canvas.create_aa_circle(0, 0, 0, tags=("slider_oval_4_a", "slider_corner_part", "slider_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("slider_oval_4_b", "slider_corner_part", "slider_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("slider_oval_4_a") and not height > 2 * button_corner_radius: - self._canvas.delete("slider_oval_4_a", "slider_oval_4_b") - - if not self._canvas.find_withtag("slider_oval_3_a") and button_length > 0 and height > 2 * button_corner_radius: - self._canvas.create_aa_circle(0, 0, 0, tags=("slider_oval_3_a", "slider_corner_part", "slider_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("slider_oval_3_b", "slider_corner_part", "slider_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("border_oval_3_a") and not (button_length > 0 and height > 2 * button_corner_radius): - self._canvas.delete("slider_oval_3_a", "slider_oval_3_b") - - # create the 2 rectangles (if needed) - if not self._canvas.find_withtag("slider_rectangle_1") and button_length > 0: - self._canvas.create_rectangle(0, 0, 0, 0, tags=("slider_rectangle_1", "slider_rectangle_part", "slider_parts"), width=0) - requires_recoloring = True - elif self._canvas.find_withtag("slider_rectangle_1") and not button_length > 0: - self._canvas.delete("slider_rectangle_1") - - if not self._canvas.find_withtag("slider_rectangle_2") and height > 2 * button_corner_radius: - self._canvas.create_rectangle(0, 0, 0, 0, tags=("slider_rectangle_2", "slider_rectangle_part", "slider_parts"), width=0) - requires_recoloring = True - elif self._canvas.find_withtag("slider_rectangle_2") and not height > 2 * button_corner_radius: - self._canvas.delete("slider_rectangle_2") - - # set positions of circles and rectangles - if orientation == "w": - slider_x_position = corner_radius + (button_length / 2) + (width - 2 * corner_radius - button_length) * slider_value - self._canvas.coords("slider_oval_1_a", slider_x_position - (button_length / 2), button_corner_radius, button_corner_radius) - self._canvas.coords("slider_oval_1_b", slider_x_position - (button_length / 2), button_corner_radius, button_corner_radius) - self._canvas.coords("slider_oval_2_a", slider_x_position + (button_length / 2), button_corner_radius, button_corner_radius) - self._canvas.coords("slider_oval_2_b", slider_x_position + (button_length / 2), button_corner_radius, button_corner_radius) - self._canvas.coords("slider_oval_3_a", slider_x_position + (button_length / 2), height - button_corner_radius, button_corner_radius) - self._canvas.coords("slider_oval_3_b", slider_x_position + (button_length / 2), height - button_corner_radius, button_corner_radius) - self._canvas.coords("slider_oval_4_a", slider_x_position - (button_length / 2), height - button_corner_radius, button_corner_radius) - self._canvas.coords("slider_oval_4_b", slider_x_position - (button_length / 2), height - button_corner_radius, button_corner_radius) - - self._canvas.coords("slider_rectangle_1", - slider_x_position - (button_length / 2), 0, - slider_x_position + (button_length / 2), height) - self._canvas.coords("slider_rectangle_2", - slider_x_position - (button_length / 2) - button_corner_radius, button_corner_radius, - slider_x_position + (button_length / 2) + button_corner_radius, height - button_corner_radius) - - elif orientation == "s": - slider_y_position = corner_radius + (button_length / 2) + (height - 2 * corner_radius - button_length) * (1 - slider_value) - self._canvas.coords("slider_oval_1_a", button_corner_radius, slider_y_position - (button_length / 2), button_corner_radius) - self._canvas.coords("slider_oval_1_b", button_corner_radius, slider_y_position - (button_length / 2), button_corner_radius) - self._canvas.coords("slider_oval_2_a", button_corner_radius, slider_y_position + (button_length / 2), button_corner_radius) - self._canvas.coords("slider_oval_2_b", button_corner_radius, slider_y_position + (button_length / 2), button_corner_radius) - self._canvas.coords("slider_oval_3_a", width - button_corner_radius, slider_y_position + (button_length / 2), button_corner_radius) - self._canvas.coords("slider_oval_3_b", width - button_corner_radius, slider_y_position + (button_length / 2), button_corner_radius) - self._canvas.coords("slider_oval_4_a", width - button_corner_radius, slider_y_position - (button_length / 2), button_corner_radius) - self._canvas.coords("slider_oval_4_b", width - button_corner_radius, slider_y_position - (button_length / 2), button_corner_radius) - - self._canvas.coords("slider_rectangle_1", - 0, slider_y_position - (button_length / 2), - width, slider_y_position + (button_length / 2)) - self._canvas.coords("slider_rectangle_2", - button_corner_radius, slider_y_position - (button_length / 2) - button_corner_radius, - width - button_corner_radius, slider_y_position + (button_length / 2) + button_corner_radius) - - if requires_recoloring: # new parts were added -> manage z-order - self._canvas.tag_raise("slider_parts") - - return requires_recoloring - - def draw_rounded_scrollbar(self, width: Union[float, int], height: Union[float, int], corner_radius: Union[float, int], - border_spacing: Union[float, int], start_value: float, end_value: float, orientation: str) -> bool: - - if self._round_width_to_even_numbers: - width = math.floor(width / 2) * 2 # round _current_width and _current_height and restrict them to even values only - if self._round_height_to_even_numbers: - height = math.floor(height / 2) * 2 - - if corner_radius > width / 2 or corner_radius > height / 2: # restrict corner_radius if it's too larger - corner_radius = min(width / 2, height / 2) - - border_spacing = round(border_spacing) - corner_radius = self.__calc_optimal_corner_radius(corner_radius) # optimize corner_radius for different drawing methods (different rounding) - - if corner_radius >= border_spacing: - inner_corner_radius = corner_radius - border_spacing - else: - inner_corner_radius = 0 - - if self.preferred_drawing_method == "polygon_shapes" or self.preferred_drawing_method == "circle_shapes": - return self.__draw_rounded_scrollbar_polygon_shapes(width, height, corner_radius, inner_corner_radius, - start_value, end_value, orientation) - elif self.preferred_drawing_method == "font_shapes": - return self.__draw_rounded_scrollbar_font_shapes(width, height, corner_radius, inner_corner_radius, - start_value, end_value, orientation) - - def __draw_rounded_scrollbar_polygon_shapes(self, width: int, height: int, corner_radius: int, inner_corner_radius: int, - start_value: float, end_value: float, orientation: str) -> bool: - requires_recoloring = False - - if not self._canvas.find_withtag("border_parts"): - self._canvas.create_rectangle(0, 0, 0, 0, tags=("border_rectangle_1", "border_parts"), width=0) - requires_recoloring = True - self._canvas.coords("border_rectangle_1", 0, 0, width, height) - - if not self._canvas.find_withtag("scrollbar_parts"): - self._canvas.create_polygon((0, 0, 0, 0), tags=("scrollbar_polygon_1", "scrollbar_parts"), joinstyle=tkinter.ROUND) - self._canvas.tag_raise("scrollbar_parts", "border_parts") - requires_recoloring = True - - if orientation == "vertical": - self._canvas.coords("scrollbar_polygon_1", - corner_radius, corner_radius + (height - 2 * corner_radius) * start_value, - width - corner_radius, corner_radius + (height - 2 * corner_radius) * start_value, - width - corner_radius, corner_radius + (height - 2 * corner_radius) * end_value, - corner_radius, corner_radius + (height - 2 * corner_radius) * end_value) - elif orientation == "horizontal": - self._canvas.coords("scrollbar_polygon_1", - corner_radius + (width - 2 * corner_radius) * start_value, corner_radius, - corner_radius + (width - 2 * corner_radius) * end_value, corner_radius, - corner_radius + (width - 2 * corner_radius) * end_value, height - corner_radius, - corner_radius + (width - 2 * corner_radius) * start_value, height - corner_radius,) - - self._canvas.itemconfig("scrollbar_polygon_1", width=inner_corner_radius * 2) - - return requires_recoloring - - def __draw_rounded_scrollbar_font_shapes(self, width: int, height: int, corner_radius: int, inner_corner_radius: int, - start_value: float, end_value: float, orientation: str) -> bool: - requires_recoloring = False - - if not self._canvas.find_withtag("border_parts"): - self._canvas.create_rectangle(0, 0, 0, 0, tags=("border_rectangle_1", "border_parts"), width=0) - requires_recoloring = True - self._canvas.coords("border_rectangle_1", 0, 0, width, height) - - if inner_corner_radius > 0: - if not self._canvas.find_withtag("scrollbar_oval_1_a"): - self._canvas.create_aa_circle(0, 0, 0, tags=("scrollbar_oval_1_a", "scrollbar_corner_part", "scrollbar_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("scrollbar_oval_1_b", "scrollbar_corner_part", "scrollbar_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - - if not self._canvas.find_withtag("scrollbar_oval_2_a") and width > 2 * corner_radius: - self._canvas.create_aa_circle(0, 0, 0, tags=("scrollbar_oval_2_a", "scrollbar_corner_part", "scrollbar_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("scrollbar_oval_2_b", "scrollbar_corner_part", "scrollbar_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("scrollbar_oval_2_a") and not width > 2 * corner_radius: - self._canvas.delete("scrollbar_oval_2_a", "scrollbar_oval_2_b") - - if not self._canvas.find_withtag("scrollbar_oval_3_a") and height > 2 * corner_radius and width > 2 * corner_radius: - self._canvas.create_aa_circle(0, 0, 0, tags=("scrollbar_oval_3_a", "scrollbar_corner_part", "scrollbar_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("scrollbar_oval_3_b", "scrollbar_corner_part", "scrollbar_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("scrollbar_oval_3_a") and not (height > 2 * corner_radius and width > 2 * corner_radius): - self._canvas.delete("scrollbar_oval_3_a", "scrollbar_oval_3_b") - - if not self._canvas.find_withtag("scrollbar_oval_4_a") and height > 2 * corner_radius: - self._canvas.create_aa_circle(0, 0, 0, tags=("scrollbar_oval_4_a", "scrollbar_corner_part", "scrollbar_parts"), anchor=tkinter.CENTER) - self._canvas.create_aa_circle(0, 0, 0, tags=("scrollbar_oval_4_b", "scrollbar_corner_part", "scrollbar_parts"), anchor=tkinter.CENTER, angle=180) - requires_recoloring = True - elif self._canvas.find_withtag("scrollbar_oval_4_a") and not height > 2 * corner_radius: - self._canvas.delete("scrollbar_oval_4_a", "scrollbar_oval_4_b") - else: - self._canvas.delete("scrollbar_corner_part") - - if not self._canvas.find_withtag("scrollbar_rectangle_1") and height > 2 * corner_radius: - self._canvas.create_rectangle(0, 0, 0, 0, tags=("scrollbar_rectangle_1", "scrollbar_rectangle_part", "scrollbar_parts"), width=0) - requires_recoloring = True - elif self._canvas.find_withtag("scrollbar_rectangle_1") and not height > 2 * corner_radius: - self._canvas.delete("scrollbar_rectangle_1") - - if not self._canvas.find_withtag("scrollbar_rectangle_2") and width > 2 * corner_radius: - self._canvas.create_rectangle(0, 0, 0, 0, tags=("scrollbar_rectangle_2", "scrollbar_rectangle_part", "scrollbar_parts"), width=0) - requires_recoloring = True - elif self._canvas.find_withtag("scrollbar_rectangle_2") and not width > 2 * corner_radius: - self._canvas.delete("scrollbar_rectangle_2") - - if orientation == "vertical": - self._canvas.coords("scrollbar_rectangle_1", - corner_radius - inner_corner_radius, corner_radius + (height - 2 * corner_radius) * start_value, - width - (corner_radius - inner_corner_radius), corner_radius + (height - 2 * corner_radius) * end_value) - self._canvas.coords("scrollbar_rectangle_2", - corner_radius, corner_radius - inner_corner_radius + (height - 2 * corner_radius) * start_value, - width - (corner_radius), corner_radius + inner_corner_radius + (height - 2 * corner_radius) * end_value) - - self._canvas.coords("scrollbar_oval_1_a", corner_radius, corner_radius + (height - 2 * corner_radius) * start_value, inner_corner_radius) - self._canvas.coords("scrollbar_oval_1_b", corner_radius, corner_radius + (height - 2 * corner_radius) * start_value, inner_corner_radius) - self._canvas.coords("scrollbar_oval_2_a", width - corner_radius, corner_radius + (height - 2 * corner_radius) * start_value, inner_corner_radius) - self._canvas.coords("scrollbar_oval_2_b", width - corner_radius, corner_radius + (height - 2 * corner_radius) * start_value, inner_corner_radius) - self._canvas.coords("scrollbar_oval_3_a", width - corner_radius, corner_radius + (height - 2 * corner_radius) * end_value, inner_corner_radius) - self._canvas.coords("scrollbar_oval_3_b", width - corner_radius, corner_radius + (height - 2 * corner_radius) * end_value, inner_corner_radius) - self._canvas.coords("scrollbar_oval_4_a", corner_radius, corner_radius + (height - 2 * corner_radius) * end_value, inner_corner_radius) - self._canvas.coords("scrollbar_oval_4_b", corner_radius, corner_radius + (height - 2 * corner_radius) * end_value, inner_corner_radius) - - if orientation == "horizontal": - self._canvas.coords("scrollbar_rectangle_1", - corner_radius - inner_corner_radius + (width - 2 * corner_radius) * start_value, corner_radius, - corner_radius + inner_corner_radius + (width - 2 * corner_radius) * end_value, height - corner_radius) - self._canvas.coords("scrollbar_rectangle_2", - corner_radius + (width - 2 * corner_radius) * start_value, corner_radius - inner_corner_radius, - corner_radius + (width - 2 * corner_radius) * end_value, height - (corner_radius - inner_corner_radius)) - - self._canvas.coords("scrollbar_oval_1_a", corner_radius + (width - 2 * corner_radius) * start_value, corner_radius, inner_corner_radius) - self._canvas.coords("scrollbar_oval_1_b", corner_radius + (width - 2 * corner_radius) * start_value, corner_radius, inner_corner_radius) - self._canvas.coords("scrollbar_oval_2_a", corner_radius + (width - 2 * corner_radius) * end_value, corner_radius, inner_corner_radius) - self._canvas.coords("scrollbar_oval_2_b", corner_radius + (width - 2 * corner_radius) * end_value, corner_radius, inner_corner_radius) - self._canvas.coords("scrollbar_oval_3_a", corner_radius + (width - 2 * corner_radius) * end_value, height - corner_radius, inner_corner_radius) - self._canvas.coords("scrollbar_oval_3_b", corner_radius + (width - 2 * corner_radius) * end_value, height - corner_radius, inner_corner_radius) - self._canvas.coords("scrollbar_oval_4_a", corner_radius + (width - 2 * corner_radius) * start_value, height - corner_radius, inner_corner_radius) - self._canvas.coords("scrollbar_oval_4_b", corner_radius + (width - 2 * corner_radius) * start_value, height - corner_radius, inner_corner_radius) - - return requires_recoloring - - def draw_checkmark(self, width: Union[float, int], height: Union[float, int], size: Union[int, float]) -> bool: - """ Draws a rounded rectangle with a corner_radius and border_width on the canvas. The border elements have a 'border_parts' tag, - the main foreground elements have an 'inner_parts' tag to color the elements accordingly. - - returns bool if recoloring is necessary """ - - size = round(size) - requires_recoloring = False - - if self.preferred_drawing_method == "polygon_shapes" or self.preferred_drawing_method == "circle_shapes": - x, y, radius = width / 2, height / 2, size / 2.8 - if not self._canvas.find_withtag("checkmark"): - self._canvas.create_line(0, 0, 0, 0, tags=("checkmark", "create_line"), width=round(height / 8), joinstyle=tkinter.MITER, capstyle=tkinter.ROUND) - self._canvas.tag_raise("checkmark") - requires_recoloring = True - - self._canvas.coords("checkmark", - x + radius, y - radius, - x - radius / 4, y + radius * 0.8, - x - radius, y + radius / 6) - elif self.preferred_drawing_method == "font_shapes": - if not self._canvas.find_withtag("checkmark"): - self._canvas.create_text(0, 0, text="Z", font=("CustomTkinter_shapes_font", -size), tags=("checkmark", "create_text"), anchor=tkinter.CENTER) - self._canvas.tag_raise("checkmark") - requires_recoloring = True - - self._canvas.coords("checkmark", round(width / 2), round(height / 2)) - - return requires_recoloring - - def draw_dropdown_arrow(self, x_position: Union[int, float], y_position: Union[int, float], size: Union[int, float]) -> bool: - """ Draws a dropdown bottom facing arrow at (x_position, y_position) in a given size - - returns bool if recoloring is necessary """ - - x_position, y_position, size = round(x_position), round(y_position), round(size) - requires_recoloring = False - - if self.preferred_drawing_method == "polygon_shapes" or self.preferred_drawing_method == "circle_shapes": - if not self._canvas.find_withtag("dropdown_arrow"): - self._canvas.create_line(0, 0, 0, 0, tags="dropdown_arrow", width=round(size / 3), joinstyle=tkinter.ROUND, capstyle=tkinter.ROUND) - self._canvas.tag_raise("dropdown_arrow") - requires_recoloring = True - - self._canvas.coords("dropdown_arrow", - x_position - (size / 2), - y_position - (size / 5), - x_position, - y_position + (size / 5), - x_position + (size / 2), - y_position - (size / 5)) - - elif self.preferred_drawing_method == "font_shapes": - if not self._canvas.find_withtag("dropdown_arrow"): - self._canvas.create_text(0, 0, text="Y", font=("CustomTkinter_shapes_font", -size), tags="dropdown_arrow", anchor=tkinter.CENTER) - self._canvas.tag_raise("dropdown_arrow") - requires_recoloring = True - - self._canvas.itemconfigure("dropdown_arrow", font=("CustomTkinter_shapes_font", -size)) - self._canvas.coords("dropdown_arrow", x_position, y_position) - - return requires_recoloring diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/__init__.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/__init__.py deleted file mode 100644 index 75e2d84..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .dropdown_menu import DropdownMenu -from .ctk_base_class import CTkBaseClass diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 7845b7af642026823abcda3b66fd3ba802a5c851..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 414 zcmZuty=nqM5Z?7HB*Z*Iurn6%&XggfP$3BM@5uj?y+jz`+@a&RId%?Oo^*G4^>pL%`SFC&6eqw`* zD2iCCRqN}CTf_!f)T-SK@0cqJeCj1@&LN+(dpTxSIyj%jNg7YVvcy}bl}jZKHQ_?$ z_#KN`Ou^YO(FXXQ?6(CQaxQb}IB(8gc9kooh0oyH6qhZoVnYny0i|?J>Z`xLCTFYv I+*GjV2iy34egFUf diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/__pycache__/ctk_base_class.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/__pycache__/ctk_base_class.cpython-311.pyc deleted file mode 100644 index 1649c0fb4eb2ea0b8f6b8958f213a63ec5598253..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21387 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 diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/__pycache__/dropdown_menu.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/__pycache__/dropdown_menu.cpython-311.pyc deleted file mode 100644 index 9a80361688c5c0819845b4a4ef977ac05615305e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13723 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', self._update_dimensions_event) - - # overwrite configure methods of master when master is tkinter widget, so that bg changes get applied on child CTk widget as well - if isinstance(self.master, (tkinter.Tk, tkinter.Toplevel, tkinter.Frame, tkinter.LabelFrame, ttk.Frame, ttk.LabelFrame, ttk.Notebook)) and not isinstance(self.master, (CTkBaseClass, CTkAppearanceModeBaseClass)): - master_old_configure = self.master.config - - def new_configure(*args, **kwargs): - if "bg" in kwargs: - self.configure(bg_color=kwargs["bg"]) - elif "background" in kwargs: - self.configure(bg_color=kwargs["background"]) - - # args[0] is dict when attribute gets changed by widget[] syntax - elif len(args) > 0 and type(args[0]) == dict: - if "bg" in args[0]: - self.configure(bg_color=args[0]["bg"]) - elif "background" in args[0]: - self.configure(bg_color=args[0]["background"]) - master_old_configure(*args, **kwargs) - - self.master.config = new_configure - self.master.configure = new_configure - - def destroy(self): - """ Destroy this and all descendants widgets. """ - - # call destroy methods of super classes - tkinter.Frame.destroy(self) - CTkAppearanceModeBaseClass.destroy(self) - CTkScalingBaseClass.destroy(self) - - def _draw(self, no_color_updates: bool = False): - """ can be overridden but super method must be called """ - if no_color_updates is False: - # Configuring color of tkinter.Frame not necessary at the moment? - # Causes flickering on Windows and Linux for segmented button for some reason! - # super().configure(bg=self._apply_appearance_mode(self._bg_color)) - pass - - def config(self, *args, **kwargs): - raise AttributeError("'config' is not implemented for CTk widgets. For consistency, always use 'configure' instead.") - - def configure(self, require_redraw=False, **kwargs): - """ basic configure with bg_color, width, height support, calls configure of tkinter.Frame, updates in the end """ - - if "width" in kwargs: - self._set_dimensions(width=kwargs.pop("width")) - - if "height" in kwargs: - self._set_dimensions(height=kwargs.pop("height")) - - if "bg_color" in kwargs: - new_bg_color = self._check_color_type(kwargs.pop("bg_color"), transparency=True) - if new_bg_color == "transparent": - self._bg_color = self._detect_color_of_master() - else: - self._bg_color = self._check_color_type(new_bg_color) - require_redraw = True - - super().configure(**pop_from_dict_by_set(kwargs, self._valid_tk_frame_attributes)) # configure tkinter.Frame - - # if there are still items in the kwargs dict, raise ValueError - check_kwargs_empty(kwargs, raise_error=True) - - if require_redraw: - self._draw() - - def cget(self, attribute_name: str): - """ basic cget with bg_color, width, height support, calls cget of tkinter.Frame """ - - if attribute_name == "bg_color": - return self._bg_color - elif attribute_name == "width": - return self._desired_width - elif attribute_name == "height": - return self._desired_height - - elif attribute_name in self._valid_tk_frame_attributes: - return super().cget(attribute_name) # cget of tkinter.Frame - else: - raise ValueError(f"'{attribute_name}' is not a supported argument. Look at the documentation for supported arguments.") - - def _check_font_type(self, font: any): - """ check font type when passed to widget """ - if isinstance(font, CTkFont): - return font - - elif type(font) == tuple and len(font) == 1: - warnings.warn(f"{type(self).__name__} Warning: font {font} given without size, will be extended with default text size of current theme\n") - return font[0], ThemeManager.theme["text"]["size"] - - elif type(font) == tuple and 2 <= len(font) <= 6: - return font - - else: - raise ValueError(f"Wrong font type {type(font)}\n" + - f"For consistency, Customtkinter requires the font argument to be a tuple of len 2 to 6 or an instance of CTkFont.\n" + - f"\nUsage example:\n" + - f"font=customtkinter.CTkFont(family='', size=)\n" + - f"font=('', )\n") - - def _check_image_type(self, image: any): - """ check image type when passed to widget """ - if image is None: - return image - elif isinstance(image, CTkImage): - return image - else: - warnings.warn(f"{type(self).__name__} Warning: Given image is not CTkImage but {type(image)}. Image can not be scaled on HighDPI displays, use CTkImage instead.\n") - return image - - def _update_dimensions_event(self, event): - # only redraw if dimensions changed (for performance), independent of scaling - if round(self._current_width) != round(self._reverse_widget_scaling(event.width)) or round(self._current_height) != round(self._reverse_widget_scaling(event.height)): - self._current_width = self._reverse_widget_scaling(event.width) # adjust current size according to new size given by event - self._current_height = self._reverse_widget_scaling(event.height) # _current_width and _current_height are independent of the scale - - self._draw(no_color_updates=True) # faster drawing without color changes - - def _detect_color_of_master(self, master_widget=None) -> Union[str, Tuple[str, str]]: - """ detect foreground color of master widget for bg_color and transparent color """ - - if master_widget is None: - master_widget = self.master - - if isinstance(master_widget, (windows.widgets.core_widget_classes.CTkBaseClass, windows.CTk, windows.CTkToplevel, windows.widgets.ctk_scrollable_frame.CTkScrollableFrame)): - if master_widget.cget("fg_color") is not None and master_widget.cget("fg_color") != "transparent": - return master_widget.cget("fg_color") - - elif isinstance(master_widget, windows.widgets.ctk_scrollable_frame.CTkScrollableFrame): - return self._detect_color_of_master(master_widget.master.master.master) - - # if fg_color of master is None, try to retrieve fg_color from master of master - elif hasattr(master_widget, "master"): - return self._detect_color_of_master(master_widget.master) - - elif isinstance(master_widget, (ttk.Frame, ttk.LabelFrame, ttk.Notebook, ttk.Label)): # master is ttk widget - try: - ttk_style = ttk.Style() - return ttk_style.lookup(master_widget.winfo_class(), 'background') - except Exception: - return "#FFFFFF", "#000000" - - else: # master is normal tkinter widget - try: - return master_widget.cget("bg") # try to get bg color by .cget() method - except Exception: - return "#FFFFFF", "#000000" - - def _set_appearance_mode(self, mode_string): - super()._set_appearance_mode(mode_string) - self._draw() - super().update_idletasks() - - def _set_scaling(self, new_widget_scaling, new_window_scaling): - super()._set_scaling(new_widget_scaling, new_window_scaling) - - super().configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - - if self._last_geometry_manager_call is not None: - self._last_geometry_manager_call["function"](**self._apply_argument_scaling(self._last_geometry_manager_call["kwargs"])) - - def _set_dimensions(self, width=None, height=None): - if width is not None: - self._desired_width = width - if height is not None: - self._desired_height = height - - super().configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - - def bind(self, sequence=None, command=None, add=None): - raise NotImplementedError - - def unbind(self, sequence=None, funcid=None): - raise NotImplementedError - - def unbind_all(self, sequence): - raise AttributeError("'unbind_all' is not allowed, because it would delete necessary internal callbacks for all widgets") - - def bind_all(self, sequence=None, func=None, add=None): - raise AttributeError("'bind_all' is not allowed, could result in undefined behavior") - - def place(self, **kwargs): - """ - Place a widget in the parent widget. Use as options: - in=master - master relative to which the widget is placed - in_=master - see 'in' option description - x=amount - locate anchor of this widget at position x of master - y=amount - locate anchor of this widget at position y of master - relx=amount - locate anchor of this widget between 0.0 and 1.0 relative to width of master (1.0 is right edge) - rely=amount - locate anchor of this widget between 0.0 and 1.0 relative to height of master (1.0 is bottom edge) - anchor=NSEW (or subset) - position anchor according to given direction - width=amount - width of this widget in pixel - height=amount - height of this widget in pixel - relwidth=amount - width of this widget between 0.0 and 1.0 relative to width of master (1.0 is the same width as the master) - relheight=amount - height of this widget between 0.0 and 1.0 relative to height of master (1.0 is the same height as the master) - bordermode="inside" or "outside" - whether to take border width of master widget into account - """ - if "width" in kwargs or "height" in kwargs: - raise ValueError("'width' and 'height' arguments must be passed to the constructor of the widget, not the place method") - self._last_geometry_manager_call = {"function": super().place, "kwargs": kwargs} - return super().place(**self._apply_argument_scaling(kwargs)) - - def place_forget(self): - """ Unmap this widget. """ - self._last_geometry_manager_call = None - return super().place_forget() - - def pack(self, **kwargs): - """ - Pack a widget in the parent widget. Use as options: - after=widget - pack it after you have packed widget - anchor=NSEW (or subset) - position widget according to given direction - before=widget - pack it before you will pack widget - expand=bool - expand widget if parent size grows - fill=NONE or X or Y or BOTH - fill widget if widget grows - in=master - use master to contain this widget - in_=master - see 'in' option description - ipadx=amount - add internal padding in x direction - ipady=amount - add internal padding in y direction - padx=amount - add padding in x direction - pady=amount - add padding in y direction - side=TOP or BOTTOM or LEFT or RIGHT - where to add this widget. - """ - self._last_geometry_manager_call = {"function": super().pack, "kwargs": kwargs} - return super().pack(**self._apply_argument_scaling(kwargs)) - - def pack_forget(self): - """ Unmap this widget and do not use it for the packing order. """ - self._last_geometry_manager_call = None - return super().pack_forget() - - def grid(self, **kwargs): - """ - Position a widget in the parent widget in a grid. Use as options: - column=number - use cell identified with given column (starting with 0) - columnspan=number - this widget will span several columns - in=master - use master to contain this widget - in_=master - see 'in' option description - ipadx=amount - add internal padding in x direction - ipady=amount - add internal padding in y direction - padx=amount - add padding in x direction - pady=amount - add padding in y direction - row=number - use cell identified with given row (starting with 0) - rowspan=number - this widget will span several rows - sticky=NSEW - if cell is larger on which sides will this widget stick to the cell boundary - """ - self._last_geometry_manager_call = {"function": super().grid, "kwargs": kwargs} - return super().grid(**self._apply_argument_scaling(kwargs)) - - def grid_forget(self): - """ Unmap this widget. """ - self._last_geometry_manager_call = None - return super().grid_forget() diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/dropdown_menu.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/dropdown_menu.py deleted file mode 100644 index a6b8186..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/core_widget_classes/dropdown_menu.py +++ /dev/null @@ -1,198 +0,0 @@ -import tkinter -import sys -from typing import Union, Tuple, Callable, List, Optional - -from ..theme import ThemeManager -from ..font import CTkFont -from ..appearance_mode import CTkAppearanceModeBaseClass -from ..scaling import CTkScalingBaseClass - - -class DropdownMenu(tkinter.Menu, CTkAppearanceModeBaseClass, CTkScalingBaseClass): - def __init__(self, *args, - min_character_width: int = 18, - - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - hover_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color: Optional[Union[str, Tuple[str, str]]] = None, - - font: Optional[Union[tuple, CTkFont]] = None, - command: Union[Callable, None] = None, - values: Optional[List[str]] = None, - **kwargs): - - # call init methods of super classes - tkinter.Menu.__init__(self, *args, **kwargs) - CTkAppearanceModeBaseClass.__init__(self) - CTkScalingBaseClass.__init__(self, scaling_type="widget") - - self._min_character_width = min_character_width - self._fg_color = ThemeManager.theme["DropdownMenu"]["fg_color"] if fg_color is None else self._check_color_type(fg_color) - self._hover_color = ThemeManager.theme["DropdownMenu"]["hover_color"] if hover_color is None else self._check_color_type(hover_color) - self._text_color = ThemeManager.theme["DropdownMenu"]["text_color"] if text_color is None else self._check_color_type(text_color) - - # font - self._font = CTkFont() if font is None else self._check_font_type(font) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - self._configure_menu_for_platforms() - - self._values = values - self._command = command - - self._add_menu_commands() - - def destroy(self): - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - - # call destroy methods of super classes - tkinter.Menu.destroy(self) - CTkAppearanceModeBaseClass.destroy(self) - - def _update_font(self): - """ pass font to tkinter widgets with applied font scaling """ - super().configure(font=self._apply_font_scaling(self._font)) - - def _configure_menu_for_platforms(self): - """ apply platform specific appearance attributes, configure all colors """ - - if sys.platform == "darwin": - super().configure(tearoff=False, - font=self._apply_font_scaling(self._font)) - - elif sys.platform.startswith("win"): - super().configure(tearoff=False, - relief="flat", - activebackground=self._apply_appearance_mode(self._hover_color), - borderwidth=self._apply_widget_scaling(4), - activeborderwidth=self._apply_widget_scaling(4), - bg=self._apply_appearance_mode(self._fg_color), - fg=self._apply_appearance_mode(self._text_color), - activeforeground=self._apply_appearance_mode(self._text_color), - font=self._apply_font_scaling(self._font), - cursor="hand2") - - else: - super().configure(tearoff=False, - relief="flat", - activebackground=self._apply_appearance_mode(self._hover_color), - borderwidth=0, - activeborderwidth=0, - bg=self._apply_appearance_mode(self._fg_color), - fg=self._apply_appearance_mode(self._text_color), - activeforeground=self._apply_appearance_mode(self._text_color), - font=self._apply_font_scaling(self._font)) - - def _add_menu_commands(self): - """ delete existing menu labels and createe new labels with command according to values list """ - - self.delete(0, "end") # delete all old commands - - if sys.platform.startswith("linux"): - for value in self._values: - self.add_command(label=" " + value.ljust(self._min_character_width) + " ", - command=lambda v=value: self._button_callback(v), - compound="left") - else: - for value in self._values: - self.add_command(label=value.ljust(self._min_character_width), - command=lambda v=value: self._button_callback(v), - compound="left") - - def _button_callback(self, value): - if self._command is not None: - self._command(value) - - def open(self, x: Union[int, float], y: Union[int, float]): - - if sys.platform == "darwin": - y += self._apply_widget_scaling(8) - else: - y += self._apply_widget_scaling(3) - - if sys.platform == "darwin" or sys.platform.startswith("win"): - self.post(int(x), int(y)) - else: # Linux - self.tk_popup(int(x), int(y)) - - def configure(self, **kwargs): - if "fg_color" in kwargs: - self._fg_color = self._check_color_type(kwargs.pop("fg_color")) - super().configure(bg=self._apply_appearance_mode(self._fg_color)) - - if "hover_color" in kwargs: - self._hover_color = self._check_color_type(kwargs.pop("hover_color")) - super().configure(activebackground=self._apply_appearance_mode(self._hover_color)) - - if "text_color" in kwargs: - self._text_color = self._check_color_type(kwargs.pop("text_color")) - super().configure(fg=self._apply_appearance_mode(self._text_color)) - - if "font" in kwargs: - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - self._font = self._check_font_type(kwargs.pop("font")) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - self._update_font() - - if "command" in kwargs: - self._command = kwargs.pop("command") - - if "values" in kwargs: - self._values = kwargs.pop("values") - self._add_menu_commands() - - super().configure(**kwargs) - - def cget(self, attribute_name: str) -> any: - if attribute_name == "min_character_width": - return self._min_character_width - - elif attribute_name == "fg_color": - return self._fg_color - elif attribute_name == "hover_color": - return self._hover_color - elif attribute_name == "text_color": - return self._text_color - - elif attribute_name == "font": - return self._font - elif attribute_name == "command": - return self._command - elif attribute_name == "values": - return self._values - - else: - return super().cget(attribute_name) - - @staticmethod - def _check_font_type(font: any): - if isinstance(font, CTkFont): - return font - - elif type(font) == tuple and len(font) == 1: - sys.stderr.write(f"Warning: font {font} given without size, will be extended with default text size of current theme\n") - return font[0], ThemeManager.theme["text"]["size"] - - elif type(font) == tuple and 2 <= len(font) <= 3: - return font - - else: - raise ValueError(f"Wrong font type {type(font)} for font '{font}'\n" + - f"For consistency, Customtkinter requires the font argument to be a tuple of len 2 or 3 or an instance of CTkFont.\n" + - f"\nUsage example:\n" + - f"font=customtkinter.CTkFont(family='', size=)\n" + - f"font=('', )\n") - - def _set_scaling(self, new_widget_scaling, new_window_scaling): - super()._set_scaling(new_widget_scaling, new_window_scaling) - self._configure_menu_for_platforms() - - def _set_appearance_mode(self, mode_string): - """ colors won't update on appearance mode change when dropdown is open, because it's not necessary """ - super()._set_appearance_mode(mode_string) - self._configure_menu_for_platforms() diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_button.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_button.py deleted file mode 100644 index e9f7839..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_button.py +++ /dev/null @@ -1,594 +0,0 @@ -import tkinter -import sys -from typing import Union, Tuple, Callable, Optional, Any - -from .core_rendering import CTkCanvas -from .theme import ThemeManager -from .core_rendering import DrawEngine -from .core_widget_classes import CTkBaseClass -from .font import CTkFont -from .image import CTkImage - - -class CTkButton(CTkBaseClass): - """ - Button with rounded corners, border, hover effect, image support, click command and textvariable. - For detailed information check out the documentation. - """ - - _image_label_spacing: int = 6 - - def __init__(self, - master: Any, - width: int = 140, - height: int = 28, - corner_radius: Optional[int] = None, - border_width: Optional[int] = None, - border_spacing: int = 2, - - bg_color: Union[str, Tuple[str, str]] = "transparent", - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - hover_color: Optional[Union[str, Tuple[str, str]]] = None, - border_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color_disabled: Optional[Union[str, Tuple[str, str]]] = None, - - background_corner_colors: Union[Tuple[Union[str, Tuple[str, str]]], None] = None, - round_width_to_even_numbers: bool = True, - round_height_to_even_numbers: bool = True, - - text: str = "CTkButton", - font: Optional[Union[tuple, CTkFont]] = None, - textvariable: Union[tkinter.Variable, None] = None, - image: Union[CTkImage, "ImageTk.PhotoImage", None] = None, - state: str = "normal", - hover: bool = True, - command: Union[Callable[[], Any], None] = None, - compound: str = "left", - anchor: str = "center", - **kwargs): - - # transfer basic functionality (bg_color, size, appearance_mode, scaling) to CTkBaseClass - super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) - - # shape - self._corner_radius: int = ThemeManager.theme["CTkButton"]["corner_radius"] if corner_radius is None else corner_radius - self._corner_radius = min(self._corner_radius, round(self._current_height / 2)) - self._border_width: int = ThemeManager.theme["CTkButton"]["border_width"] if border_width is None else border_width - self._border_spacing: int = border_spacing - - # color - self._fg_color: Union[str, Tuple[str, str]] = ThemeManager.theme["CTkButton"]["fg_color"] if fg_color is None else self._check_color_type(fg_color, transparency=True) - self._hover_color: Union[str, Tuple[str, str]] = ThemeManager.theme["CTkButton"]["hover_color"] if hover_color is None else self._check_color_type(hover_color) - self._border_color: Union[str, Tuple[str, str]] = ThemeManager.theme["CTkButton"]["border_color"] if border_color is None else self._check_color_type(border_color) - self._text_color: Union[str, Tuple[str, str]] = ThemeManager.theme["CTkButton"]["text_color"] if text_color is None else self._check_color_type(text_color) - self._text_color_disabled: Union[str, Tuple[str, str]] = ThemeManager.theme["CTkButton"]["text_color_disabled"] if text_color_disabled is None else self._check_color_type(text_color_disabled) - - # rendering options - self._background_corner_colors: Union[Tuple[Union[str, Tuple[str, str]]], None] = background_corner_colors # rendering options for DrawEngine - self._round_width_to_even_numbers: bool = round_width_to_even_numbers # rendering options for DrawEngine - self._round_height_to_even_numbers: bool = round_height_to_even_numbers # rendering options for DrawEngine - - # text, font - self._text = text - self._text_label: Union[tkinter.Label, None] = None - self._textvariable: tkinter.Variable = textvariable - self._font: Union[tuple, CTkFont] = CTkFont() if font is None else self._check_font_type(font) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - # image - self._image = self._check_image_type(image) - self._image_label: Union[tkinter.Label, None] = None - if isinstance(self._image, CTkImage): - self._image.add_configure_callback(self._update_image) - - # other - self._state: str = state - self._hover: bool = hover - self._command: Callable = command - self._compound: str = compound - self._anchor: str = anchor - self._click_animation_running: bool = False - - # canvas and draw engine - self._canvas = CTkCanvas(master=self, - highlightthickness=0, - width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._canvas.grid(row=0, column=0, rowspan=5, columnspan=5, sticky="nsew") - self._draw_engine = DrawEngine(self._canvas) - self._draw_engine.set_round_to_even_numbers(self._round_width_to_even_numbers, self._round_height_to_even_numbers) # rendering options - - # configure cursor and initial draw - self._create_bindings() - self._set_cursor() - self._draw() - - def _create_bindings(self, sequence: Optional[str] = None): - """ set necessary bindings for functionality of widget, will overwrite other bindings """ - - if sequence is None or sequence == "": - self._canvas.bind("", self._on_enter) - - if self._text_label is not None: - self._text_label.bind("", self._on_enter) - if self._image_label is not None: - self._image_label.bind("", self._on_enter) - - if sequence is None or sequence == "": - self._canvas.bind("", self._on_leave) - - if self._text_label is not None: - self._text_label.bind("", self._on_leave) - if self._image_label is not None: - self._image_label.bind("", self._on_leave) - - if sequence is None or sequence == "": - self._canvas.bind("", self._clicked) - - if self._text_label is not None: - self._text_label.bind("", self._clicked) - if self._image_label is not None: - self._image_label.bind("", self._clicked) - - def _set_scaling(self, *args, **kwargs): - super()._set_scaling(*args, **kwargs) - - self._create_grid() - - if self._text_label is not None: - self._text_label.configure(font=self._apply_font_scaling(self._font)) - - self._update_image() - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._draw(no_color_updates=True) - - def _set_appearance_mode(self, mode_string): - super()._set_appearance_mode(mode_string) - self._update_image() - - def _set_dimensions(self, width: int = None, height: int = None): - super()._set_dimensions(width, height) - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._draw() - - def _update_font(self): - """ pass font to tkinter widgets with applied font scaling and update grid with workaround """ - if self._text_label is not None: - self._text_label.configure(font=self._apply_font_scaling(self._font)) - - # Workaround to force grid to be resized when text changes size. - # Otherwise grid will lag and only resizes if other mouse action occurs. - self._canvas.grid_forget() - self._canvas.grid(row=0, column=0, rowspan=5, columnspan=5, sticky="nsew") - - def _update_image(self): - if self._image_label is not None: - if isinstance(self._image, CTkImage): - self._image_label.configure(image=self._image.create_scaled_photo_image(self._get_widget_scaling(), - self._get_appearance_mode())) - elif self._image is not None: - self._image_label.configure(image=self._image) - - def destroy(self): - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - super().destroy() - - def _draw(self, no_color_updates=False): - super()._draw(no_color_updates) - - if self._background_corner_colors is not None: - self._draw_engine.draw_background_corners(self._apply_widget_scaling(self._current_width), - self._apply_widget_scaling(self._current_height)) - self._canvas.itemconfig("background_corner_top_left", fill=self._apply_appearance_mode(self._background_corner_colors[0])) - self._canvas.itemconfig("background_corner_top_right", fill=self._apply_appearance_mode(self._background_corner_colors[1])) - self._canvas.itemconfig("background_corner_bottom_right", fill=self._apply_appearance_mode(self._background_corner_colors[2])) - self._canvas.itemconfig("background_corner_bottom_left", fill=self._apply_appearance_mode(self._background_corner_colors[3])) - else: - self._canvas.delete("background_parts") - - requires_recoloring = self._draw_engine.draw_rounded_rect_with_border(self._apply_widget_scaling(self._current_width), - self._apply_widget_scaling(self._current_height), - self._apply_widget_scaling(self._corner_radius), - self._apply_widget_scaling(self._border_width)) - - if no_color_updates is False or requires_recoloring: - - self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - - # set color for the button border parts (outline) - self._canvas.itemconfig("border_parts", - outline=self._apply_appearance_mode(self._border_color), - fill=self._apply_appearance_mode(self._border_color)) - - # set color for inner button parts - if self._fg_color == "transparent": - self._canvas.itemconfig("inner_parts", - outline=self._apply_appearance_mode(self._bg_color), - fill=self._apply_appearance_mode(self._bg_color)) - else: - self._canvas.itemconfig("inner_parts", - outline=self._apply_appearance_mode(self._fg_color), - fill=self._apply_appearance_mode(self._fg_color)) - - # create text label if text given - if self._text is not None and self._text != "": - - if self._text_label is None: - self._text_label = tkinter.Label(master=self, - font=self._apply_font_scaling(self._font), - text=self._text, - padx=0, - pady=0, - borderwidth=1, - textvariable=self._textvariable) - self._create_grid() - - self._text_label.bind("", self._on_enter) - self._text_label.bind("", self._on_leave) - self._text_label.bind("", self._clicked) - self._text_label.bind("", self._clicked) - - if no_color_updates is False: - # set text_label fg color (text color) - self._text_label.configure(fg=self._apply_appearance_mode(self._text_color)) - - if self._state == tkinter.DISABLED: - self._text_label.configure(fg=(self._apply_appearance_mode(self._text_color_disabled))) - else: - self._text_label.configure(fg=self._apply_appearance_mode(self._text_color)) - - if self._apply_appearance_mode(self._fg_color) == "transparent": - self._text_label.configure(bg=self._apply_appearance_mode(self._bg_color)) - else: - self._text_label.configure(bg=self._apply_appearance_mode(self._fg_color)) - - else: - # delete text_label if no text given - if self._text_label is not None: - self._text_label.destroy() - self._text_label = None - self._create_grid() - - # create image label if image given - if self._image is not None: - - if self._image_label is None: - self._image_label = tkinter.Label(master=self) - self._update_image() # set image - self._create_grid() - - self._image_label.bind("", self._on_enter) - self._image_label.bind("", self._on_leave) - self._image_label.bind("", self._clicked) - self._image_label.bind("", self._clicked) - - if no_color_updates is False: - # set image_label bg color (background color of label) - if self._apply_appearance_mode(self._fg_color) == "transparent": - self._image_label.configure(bg=self._apply_appearance_mode(self._bg_color)) - else: - self._image_label.configure(bg=self._apply_appearance_mode(self._fg_color)) - - else: - # delete text_label if no text given - if self._image_label is not None: - self._image_label.destroy() - self._image_label = None - self._create_grid() - - def _create_grid(self): - """ configure grid system (5x5) """ - - # Outer rows and columns have weight of 1000 to overpower the rows and columns of the label and image with weight 1. - # Rows and columns of image and label need weight of 1 to collapse in case of missing space on the button, - # so image and label need sticky option to stick together in the center, and therefore outer rows and columns - # need weight of 100 in case of other anchor than center. - n_padding_weight, s_padding_weight, e_padding_weight, w_padding_weight = 1000, 1000, 1000, 1000 - if self._anchor != "center": - if "n" in self._anchor: - n_padding_weight, s_padding_weight = 0, 1000 - if "s" in self._anchor: - n_padding_weight, s_padding_weight = 1000, 0 - if "e" in self._anchor: - e_padding_weight, w_padding_weight = 1000, 0 - if "w" in self._anchor: - e_padding_weight, w_padding_weight = 0, 1000 - - scaled_minsize_rows = self._apply_widget_scaling(max(self._border_width + 1, self._border_spacing)) - scaled_minsize_columns = self._apply_widget_scaling(max(self._corner_radius, self._border_width + 1, self._border_spacing)) - - self.grid_rowconfigure(0, weight=n_padding_weight, minsize=scaled_minsize_rows) - self.grid_rowconfigure(4, weight=s_padding_weight, minsize=scaled_minsize_rows) - self.grid_columnconfigure(0, weight=e_padding_weight, minsize=scaled_minsize_columns) - self.grid_columnconfigure(4, weight=w_padding_weight, minsize=scaled_minsize_columns) - - if self._compound in ("right", "left"): - self.grid_rowconfigure(2, weight=1) - if self._image_label is not None and self._text_label is not None: - self.grid_columnconfigure(2, weight=0, minsize=self._apply_widget_scaling(self._image_label_spacing)) - else: - self.grid_columnconfigure(2, weight=0) - - self.grid_rowconfigure((1, 3), weight=0) - self.grid_columnconfigure((1, 3), weight=1) - else: - self.grid_columnconfigure(2, weight=1) - if self._image_label is not None and self._text_label is not None: - self.grid_rowconfigure(2, weight=0, minsize=self._apply_widget_scaling(self._image_label_spacing)) - else: - self.grid_rowconfigure(2, weight=0) - - self.grid_columnconfigure((1, 3), weight=0) - self.grid_rowconfigure((1, 3), weight=1) - - if self._compound == "right": - if self._image_label is not None: - self._image_label.grid(row=2, column=3, sticky="w") - if self._text_label is not None: - self._text_label.grid(row=2, column=1, sticky="e") - elif self._compound == "left": - if self._image_label is not None: - self._image_label.grid(row=2, column=1, sticky="e") - if self._text_label is not None: - self._text_label.grid(row=2, column=3, sticky="w") - elif self._compound == "top": - if self._image_label is not None: - self._image_label.grid(row=1, column=2, sticky="s") - if self._text_label is not None: - self._text_label.grid(row=3, column=2, sticky="n") - elif self._compound == "bottom": - if self._image_label is not None: - self._image_label.grid(row=3, column=2, sticky="n") - if self._text_label is not None: - self._text_label.grid(row=1, column=2, sticky="s") - - def configure(self, require_redraw=False, **kwargs): - if "corner_radius" in kwargs: - self._corner_radius = kwargs.pop("corner_radius") - self._create_grid() - require_redraw = True - - if "border_width" in kwargs: - self._border_width = kwargs.pop("border_width") - self._create_grid() - require_redraw = True - - if "border_spacing" in kwargs: - self._border_spacing = kwargs.pop("border_spacing") - self._create_grid() - require_redraw = True - - if "fg_color" in kwargs: - self._fg_color = self._check_color_type(kwargs.pop("fg_color"), transparency=True) - require_redraw = True - - if "hover_color" in kwargs: - self._hover_color = self._check_color_type(kwargs.pop("hover_color")) - require_redraw = True - - if "border_color" in kwargs: - self._border_color = self._check_color_type(kwargs.pop("border_color")) - require_redraw = True - - if "text_color" in kwargs: - self._text_color = self._check_color_type(kwargs.pop("text_color")) - require_redraw = True - - if "text_color_disabled" in kwargs: - self._text_color_disabled = self._check_color_type(kwargs.pop("text_color_disabled")) - require_redraw = True - - if "background_corner_colors" in kwargs: - self._background_corner_colors = kwargs.pop("background_corner_colors") - require_redraw = True - - if "text" in kwargs: - self._text = kwargs.pop("text") - if self._text_label is None: - require_redraw = True # text_label will be created in .draw() - else: - self._text_label.configure(text=self._text) - - if "font" in kwargs: - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - self._font = self._check_font_type(kwargs.pop("font")) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - self._update_font() - - if "textvariable" in kwargs: - self._textvariable = kwargs.pop("textvariable") - if self._text_label is not None: - self._text_label.configure(textvariable=self._textvariable) - - if "image" in kwargs: - if isinstance(self._image, CTkImage): - self._image.remove_configure_callback(self._update_image) - self._image = self._check_image_type(kwargs.pop("image")) - if isinstance(self._image, CTkImage): - self._image.add_configure_callback(self._update_image) - self._update_image() - - if "state" in kwargs: - self._state = kwargs.pop("state") - self._set_cursor() - require_redraw = True - - if "hover" in kwargs: - self._hover = kwargs.pop("hover") - - if "command" in kwargs: - self._command = kwargs.pop("command") - self._set_cursor() - - if "compound" in kwargs: - self._compound = kwargs.pop("compound") - require_redraw = True - - if "anchor" in kwargs: - self._anchor = kwargs.pop("anchor") - self._create_grid() - require_redraw = True - - super().configure(require_redraw=require_redraw, **kwargs) - - def cget(self, attribute_name: str) -> any: - if attribute_name == "corner_radius": - return self._corner_radius - elif attribute_name == "border_width": - return self._border_width - elif attribute_name == "border_spacing": - return self._border_spacing - - elif attribute_name == "fg_color": - return self._fg_color - elif attribute_name == "hover_color": - return self._hover_color - elif attribute_name == "border_color": - return self._border_color - elif attribute_name == "text_color": - return self._text_color - elif attribute_name == "text_color_disabled": - return self._text_color_disabled - elif attribute_name == "background_corner_colors": - return self._background_corner_colors - - elif attribute_name == "text": - return self._text - elif attribute_name == "font": - return self._font - elif attribute_name == "textvariable": - return self._textvariable - elif attribute_name == "image": - return self._image - elif attribute_name == "state": - return self._state - elif attribute_name == "hover": - return self._hover - elif attribute_name == "command": - return self._command - elif attribute_name == "compound": - return self._compound - elif attribute_name == "anchor": - return self._anchor - else: - return super().cget(attribute_name) - - def _set_cursor(self): - if self._cursor_manipulation_enabled: - if self._state == tkinter.DISABLED: - if sys.platform == "darwin" and self._command is not None: - self.configure(cursor="arrow") - elif sys.platform.startswith("win") and self._command is not None: - self.configure(cursor="arrow") - - elif self._state == tkinter.NORMAL: - if sys.platform == "darwin" and self._command is not None: - self.configure(cursor="pointinghand") - elif sys.platform.startswith("win") and self._command is not None: - self.configure(cursor="hand2") - - def _on_enter(self, event=None): - if self._hover is True and self._state == "normal": - if self._hover_color is None: - inner_parts_color = self._fg_color - else: - inner_parts_color = self._hover_color - - # set color of inner button parts to hover color - self._canvas.itemconfig("inner_parts", - outline=self._apply_appearance_mode(inner_parts_color), - fill=self._apply_appearance_mode(inner_parts_color)) - - # set text_label bg color to button hover color - if self._text_label is not None: - self._text_label.configure(bg=self._apply_appearance_mode(inner_parts_color)) - - # set image_label bg color to button hover color - if self._image_label is not None: - self._image_label.configure(bg=self._apply_appearance_mode(inner_parts_color)) - - def _on_leave(self, event=None): - self._click_animation_running = False - - if self._fg_color == "transparent": - inner_parts_color = self._bg_color - else: - inner_parts_color = self._fg_color - - # set color of inner button parts - self._canvas.itemconfig("inner_parts", - outline=self._apply_appearance_mode(inner_parts_color), - fill=self._apply_appearance_mode(inner_parts_color)) - - # set text_label bg color (label color) - if self._text_label is not None: - self._text_label.configure(bg=self._apply_appearance_mode(inner_parts_color)) - - # set image_label bg color (image bg color) - if self._image_label is not None: - self._image_label.configure(bg=self._apply_appearance_mode(inner_parts_color)) - - def _click_animation(self): - if self._click_animation_running: - self._on_enter() - - def _clicked(self, event=None): - if self._state != tkinter.DISABLED: - - # click animation: change color with .on_leave() and back to normal after 100ms with click_animation() - self._on_leave() - self._click_animation_running = True - self.after(100, self._click_animation) - - if self._command is not None: - self._command() - - def invoke(self): - """ calls command function if button is not disabled """ - if self._state != tkinter.DISABLED: - if self._command is not None: - return self._command() - - def bind(self, sequence: str = None, command: Callable = None, add: Union[str, bool] = True): - """ called on the tkinter.Canvas """ - if not (add == "+" or add is True): - raise ValueError("'add' argument can only be '+' or True to preserve internal callbacks") - self._canvas.bind(sequence, command, add=True) - - if self._text_label is not None: - self._text_label.bind(sequence, command, add=True) - if self._image_label is not None: - self._image_label.bind(sequence, command, add=True) - - def unbind(self, sequence: str = None, funcid: str = None): - """ called on the tkinter.Label and tkinter.Canvas """ - if funcid is not None: - raise ValueError("'funcid' argument can only be None, because there is a bug in" + - " tkinter and its not clear whether the internal callbacks will be unbinded or not") - self._canvas.unbind(sequence, None) - - if self._text_label is not None: - self._text_label.unbind(sequence, None) - if self._image_label is not None: - self._image_label.unbind(sequence, None) - - self._create_bindings(sequence=sequence) # restore internal callbacks for sequence - - def focus(self): - return self._text_label.focus() - - def focus_set(self): - return self._text_label.focus_set() - - def focus_force(self): - return self._text_label.focus_force() diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_checkbox.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_checkbox.py deleted file mode 100644 index 42f04f5..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_checkbox.py +++ /dev/null @@ -1,469 +0,0 @@ -import tkinter -import sys -from typing import Union, Tuple, Callable, Optional, Any - -from .core_rendering import CTkCanvas -from .theme import ThemeManager -from .core_rendering import DrawEngine -from .core_widget_classes import CTkBaseClass -from .font import CTkFont - - -class CTkCheckBox(CTkBaseClass): - """ - Checkbox with rounded corners, border, variable support and hover effect. - For detailed information check out the documentation. - """ - - def __init__(self, - master: Any, - width: int = 100, - height: int = 24, - checkbox_width: int = 24, - checkbox_height: int = 24, - corner_radius: Optional[int] = None, - border_width: Optional[int] = None, - - bg_color: Union[str, Tuple[str, str]] = "transparent", - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - hover_color: Optional[Union[str, Tuple[str, str]]] = None, - border_color: Optional[Union[str, Tuple[str, str]]] = None, - checkmark_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color_disabled: Optional[Union[str, Tuple[str, str]]] = None, - - text: str = "CTkCheckBox", - font: Optional[Union[tuple, CTkFont]] = None, - textvariable: Union[tkinter.Variable, None] = None, - state: str = tkinter.NORMAL, - hover: bool = True, - command: Union[Callable[[], Any], None] = None, - onvalue: Union[int, str] = 1, - offvalue: Union[int, str] = 0, - variable: Union[tkinter.Variable, None] = None, - **kwargs): - - # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass - super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) - - # dimensions - self._checkbox_width = checkbox_width - self._checkbox_height = checkbox_height - - # color - self._fg_color = ThemeManager.theme["CTkCheckBox"]["fg_color"] if fg_color is None else self._check_color_type(fg_color) - self._hover_color = ThemeManager.theme["CTkCheckBox"]["hover_color"] if hover_color is None else self._check_color_type(hover_color) - self._border_color = ThemeManager.theme["CTkCheckBox"]["border_color"] if border_color is None else self._check_color_type(border_color) - self._checkmark_color = ThemeManager.theme["CTkCheckBox"]["checkmark_color"] if checkmark_color is None else self._check_color_type(checkmark_color) - - # shape - self._corner_radius = ThemeManager.theme["CTkCheckBox"]["corner_radius"] if corner_radius is None else corner_radius - self._border_width = ThemeManager.theme["CTkCheckBox"]["border_width"] if border_width is None else border_width - - # text - self._text = text - self._text_label: Union[tkinter.Label, None] = None - self._text_color = ThemeManager.theme["CTkCheckBox"]["text_color"] if text_color is None else self._check_color_type(text_color) - self._text_color_disabled = ThemeManager.theme["CTkCheckBox"]["text_color_disabled"] if text_color_disabled is None else self._check_color_type(text_color_disabled) - - # font - self._font = CTkFont() if font is None else self._check_font_type(font) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - # callback and hover functionality - self._command = command - self._state = state - self._hover = hover - self._check_state = False - - self._onvalue = onvalue - self._offvalue = offvalue - self._variable: tkinter.Variable = variable - self._variable_callback_blocked = False - self._textvariable: tkinter.Variable = textvariable - self._variable_callback_name = None - - # configure grid system (1x3) - self.grid_columnconfigure(0, weight=0) - self.grid_columnconfigure(1, weight=0, minsize=self._apply_widget_scaling(6)) - self.grid_columnconfigure(2, weight=1) - self.grid_rowconfigure(0, weight=1) - - self._bg_canvas = CTkCanvas(master=self, - highlightthickness=0, - width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._bg_canvas.grid(row=0, column=0, columnspan=3, sticky="nswe") - - self._canvas = CTkCanvas(master=self, - highlightthickness=0, - width=self._apply_widget_scaling(self._checkbox_width), - height=self._apply_widget_scaling(self._checkbox_height)) - self._canvas.grid(row=0, column=0, sticky="e") - self._draw_engine = DrawEngine(self._canvas) - - self._text_label = tkinter.Label(master=self, - bd=0, - padx=0, - pady=0, - text=self._text, - justify=tkinter.LEFT, - font=self._apply_font_scaling(self._font), - textvariable=self._textvariable) - self._text_label.grid(row=0, column=2, sticky="w") - self._text_label["anchor"] = "w" - - # register variable callback and set state according to variable - if self._variable is not None and self._variable != "": - self._variable_callback_name = self._variable.trace_add("write", self._variable_callback) - self._check_state = True if self._variable.get() == self._onvalue else False - - self._create_bindings() - self._set_cursor() - self._draw() - - def _create_bindings(self, sequence: Optional[str] = None): - """ set necessary bindings for functionality of widget, will overwrite other bindings """ - if sequence is None or sequence == "": - self._canvas.bind("", self._on_enter) - self._text_label.bind("", self._on_enter) - if sequence is None or sequence == "": - self._canvas.bind("", self._on_leave) - self._text_label.bind("", self._on_leave) - if sequence is None or sequence == "": - self._canvas.bind("", self.toggle) - self._text_label.bind("", self.toggle) - - def _set_scaling(self, *args, **kwargs): - super()._set_scaling(*args, **kwargs) - - self.grid_columnconfigure(1, weight=0, minsize=self._apply_widget_scaling(6)) - self._text_label.configure(font=self._apply_font_scaling(self._font)) - - self._canvas.delete("checkmark") - self._bg_canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._canvas.configure(width=self._apply_widget_scaling(self._checkbox_width), - height=self._apply_widget_scaling(self._checkbox_height)) - self._draw(no_color_updates=True) - - def _set_dimensions(self, width: int = None, height: int = None): - super()._set_dimensions(width, height) - - self._bg_canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - - def _update_font(self): - """ pass font to tkinter widgets with applied font scaling and update grid with workaround """ - if self._text_label is not None: - self._text_label.configure(font=self._apply_font_scaling(self._font)) - - # Workaround to force grid to be resized when text changes size. - # Otherwise grid will lag and only resizes if other mouse action occurs. - self._bg_canvas.grid_forget() - self._bg_canvas.grid(row=0, column=0, columnspan=3, sticky="nswe") - - def destroy(self): - if self._variable is not None: - self._variable.trace_remove("write", self._variable_callback_name) - - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - - super().destroy() - - def _draw(self, no_color_updates=False): - super()._draw(no_color_updates) - - requires_recoloring_1 = self._draw_engine.draw_rounded_rect_with_border(self._apply_widget_scaling(self._checkbox_width), - self._apply_widget_scaling(self._checkbox_height), - self._apply_widget_scaling(self._corner_radius), - self._apply_widget_scaling(self._border_width)) - - if self._check_state is True: - requires_recoloring_2 = self._draw_engine.draw_checkmark(self._apply_widget_scaling(self._checkbox_width), - self._apply_widget_scaling(self._checkbox_height), - self._apply_widget_scaling(self._checkbox_height * 0.58)) - else: - requires_recoloring_2 = False - self._canvas.delete("checkmark") - - if no_color_updates is False or requires_recoloring_1 or requires_recoloring_2: - self._bg_canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - - if self._check_state is True: - self._canvas.itemconfig("inner_parts", - outline=self._apply_appearance_mode(self._fg_color), - fill=self._apply_appearance_mode(self._fg_color)) - self._canvas.itemconfig("border_parts", - outline=self._apply_appearance_mode(self._fg_color), - fill=self._apply_appearance_mode(self._fg_color)) - - if "create_line" in self._canvas.gettags("checkmark"): - self._canvas.itemconfig("checkmark", fill=self._apply_appearance_mode(self._checkmark_color)) - else: - self._canvas.itemconfig("checkmark", fill=self._apply_appearance_mode(self._checkmark_color)) - else: - self._canvas.itemconfig("inner_parts", - outline=self._apply_appearance_mode(self._bg_color), - fill=self._apply_appearance_mode(self._bg_color)) - self._canvas.itemconfig("border_parts", - outline=self._apply_appearance_mode(self._border_color), - fill=self._apply_appearance_mode(self._border_color)) - - if self._state == tkinter.DISABLED: - self._text_label.configure(fg=(self._apply_appearance_mode(self._text_color_disabled))) - else: - self._text_label.configure(fg=self._apply_appearance_mode(self._text_color)) - - self._text_label.configure(bg=self._apply_appearance_mode(self._bg_color)) - - def configure(self, require_redraw=False, **kwargs): - if "corner_radius" in kwargs: - self._corner_radius = kwargs.pop("corner_radius") - require_redraw = True - - if "border_width" in kwargs: - self._border_width = kwargs.pop("border_width") - require_redraw = True - - if "checkbox_width" in kwargs: - self._checkbox_width = kwargs.pop("checkbox_width") - self._canvas.configure(width=self._apply_widget_scaling(self._checkbox_width)) - require_redraw = True - - if "checkbox_height" in kwargs: - self._checkbox_height = kwargs.pop("checkbox_height") - self._canvas.configure(height=self._apply_widget_scaling(self._checkbox_height)) - require_redraw = True - - if "text" in kwargs: - self._text = kwargs.pop("text") - self._text_label.configure(text=self._text) - - if "font" in kwargs: - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - self._font = self._check_font_type(kwargs.pop("font")) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - self._update_font() - - if "state" in kwargs: - self._state = kwargs.pop("state") - self._set_cursor() - require_redraw = True - - if "fg_color" in kwargs: - self._fg_color = self._check_color_type(kwargs.pop("fg_color")) - require_redraw = True - - if "hover_color" in kwargs: - self._hover_color = self._check_color_type(kwargs.pop("hover_color")) - require_redraw = True - - if "border_color" in kwargs: - self._border_color = self._check_color_type(kwargs.pop("border_color")) - require_redraw = True - - if "checkmark_color" in kwargs: - self._checkmark_color = self._check_color_type(kwargs.pop("checkmark_color")) - require_redraw = True - - if "text_color" in kwargs: - self._text_color = self._check_color_type(kwargs.pop("text_color")) - require_redraw = True - - if "text_color_disabled" in kwargs: - self._text_color_disabled = self._check_color_type(kwargs.pop("text_color_disabled")) - require_redraw = True - - if "hover" in kwargs: - self._hover = kwargs.pop("hover") - - if "command" in kwargs: - self._command = kwargs.pop("command") - - if "textvariable" in kwargs: - self._textvariable = kwargs.pop("textvariable") - self._text_label.configure(textvariable=self._textvariable) - - if "variable" in kwargs: - if self._variable is not None and self._variable != "": - self._variable.trace_remove("write", self._variable_callback_name) # remove old variable callback - - self._variable = kwargs.pop("variable") - - if self._variable is not None and self._variable != "": - self._variable_callback_name = self._variable.trace_add("write", self._variable_callback) - self._check_state = True if self._variable.get() == self._onvalue else False - require_redraw = True - - super().configure(require_redraw=require_redraw, **kwargs) - - def cget(self, attribute_name: str) -> any: - if attribute_name == "corner_radius": - return self._corner_radius - elif attribute_name == "border_width": - return self._border_width - elif attribute_name == "checkbox_width": - return self._checkbox_width - elif attribute_name == "checkbox_height": - return self._checkbox_height - - elif attribute_name == "fg_color": - return self._fg_color - elif attribute_name == "hover_color": - return self._hover_color - elif attribute_name == "border_color": - return self._border_color - elif attribute_name == "checkmark_color": - return self._checkmark_color - elif attribute_name == "text_color": - return self._text_color - elif attribute_name == "text_color_disabled": - return self._text_color_disabled - - elif attribute_name == "text": - return self._text - elif attribute_name == "font": - return self._font - elif attribute_name == "textvariable": - return self._textvariable - elif attribute_name == "state": - return self._state - elif attribute_name == "hover": - return self._hover - elif attribute_name == "onvalue": - return self._onvalue - elif attribute_name == "offvalue": - return self._offvalue - elif attribute_name == "variable": - return self._variable - else: - return super().cget(attribute_name) - - def _set_cursor(self): - if self._cursor_manipulation_enabled: - if self._state == tkinter.DISABLED: - if sys.platform == "darwin": - self._canvas.configure(cursor="arrow") - if self._text_label is not None: - self._text_label.configure(cursor="arrow") - elif sys.platform.startswith("win"): - self._canvas.configure(cursor="arrow") - if self._text_label is not None: - self._text_label.configure(cursor="arrow") - - elif self._state == tkinter.NORMAL: - if sys.platform == "darwin": - self._canvas.configure(cursor="pointinghand") - if self._text_label is not None: - self._text_label.configure(cursor="pointinghand") - elif sys.platform.startswith("win"): - self._canvas.configure(cursor="hand2") - if self._text_label is not None: - self._text_label.configure(cursor="hand2") - - def _on_enter(self, event=0): - if self._hover is True and self._state == tkinter.NORMAL: - if self._check_state is True: - self._canvas.itemconfig("inner_parts", - fill=self._apply_appearance_mode(self._hover_color), - outline=self._apply_appearance_mode(self._hover_color)) - self._canvas.itemconfig("border_parts", - fill=self._apply_appearance_mode(self._hover_color), - outline=self._apply_appearance_mode(self._hover_color)) - else: - self._canvas.itemconfig("inner_parts", - fill=self._apply_appearance_mode(self._hover_color), - outline=self._apply_appearance_mode(self._hover_color)) - - def _on_leave(self, event=0): - if self._check_state is True: - self._canvas.itemconfig("inner_parts", - fill=self._apply_appearance_mode(self._fg_color), - outline=self._apply_appearance_mode(self._fg_color)) - self._canvas.itemconfig("border_parts", - fill=self._apply_appearance_mode(self._fg_color), - outline=self._apply_appearance_mode(self._fg_color)) - else: - self._canvas.itemconfig("inner_parts", - fill=self._apply_appearance_mode(self._bg_color), - outline=self._apply_appearance_mode(self._bg_color)) - self._canvas.itemconfig("border_parts", - fill=self._apply_appearance_mode(self._border_color), - outline=self._apply_appearance_mode(self._border_color)) - - def _variable_callback(self, var_name, index, mode): - if not self._variable_callback_blocked: - if self._variable.get() == self._onvalue: - self.select(from_variable_callback=True) - elif self._variable.get() == self._offvalue: - self.deselect(from_variable_callback=True) - - def toggle(self, event=0): - if self._state == tkinter.NORMAL: - if self._check_state is True: - self._check_state = False - self._draw() - else: - self._check_state = True - self._draw() - - if self._variable is not None: - self._variable_callback_blocked = True - self._variable.set(self._onvalue if self._check_state is True else self._offvalue) - self._variable_callback_blocked = False - - if self._command is not None: - self._command() - - def select(self, from_variable_callback=False): - self._check_state = True - self._draw() - - if self._variable is not None and not from_variable_callback: - self._variable_callback_blocked = True - self._variable.set(self._onvalue) - self._variable_callback_blocked = False - - def deselect(self, from_variable_callback=False): - self._check_state = False - self._draw() - - if self._variable is not None and not from_variable_callback: - self._variable_callback_blocked = True - self._variable.set(self._offvalue) - self._variable_callback_blocked = False - - def get(self) -> Union[int, str]: - return self._onvalue if self._check_state is True else self._offvalue - - def bind(self, sequence: str = None, command: Callable = None, add: Union[str, bool] = True): - """ called on the tkinter.Canvas """ - if not (add == "+" or add is True): - raise ValueError("'add' argument can only be '+' or True to preserve internal callbacks") - self._canvas.bind(sequence, command, add=True) - self._text_label.bind(sequence, command, add=True) - - def unbind(self, sequence: str = None, funcid: str = None): - """ called on the tkinter.Label and tkinter.Canvas """ - if funcid is not None: - raise ValueError("'funcid' argument can only be None, because there is a bug in" + - " tkinter and its not clear whether the internal callbacks will be unbinded or not") - self._canvas.unbind(sequence, None) - self._text_label.unbind(sequence, None) - self._create_bindings(sequence=sequence) # restore internal callbacks for sequence - - def focus(self): - return self._text_label.focus() - - def focus_set(self): - return self._text_label.focus_set() - - def focus_force(self): - return self._text_label.focus_force() diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_combobox.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_combobox.py deleted file mode 100644 index 9949564..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_combobox.py +++ /dev/null @@ -1,424 +0,0 @@ -import tkinter -import sys -import copy -from typing import Union, Tuple, Callable, List, Optional, Any - -from .core_widget_classes import DropdownMenu -from .core_rendering import CTkCanvas -from .theme import ThemeManager -from .core_rendering import DrawEngine -from .core_widget_classes import CTkBaseClass -from .font import CTkFont - - -class CTkComboBox(CTkBaseClass): - """ - Combobox with dropdown menu, rounded corners, border, variable support. - For detailed information check out the documentation. - """ - - def __init__(self, - master: Any, - width: int = 140, - height: int = 28, - corner_radius: Optional[int] = None, - border_width: Optional[int] = None, - - bg_color: Union[str, Tuple[str, str]] = "transparent", - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - border_color: Optional[Union[str, Tuple[str, str]]] = None, - button_color: Optional[Union[str, Tuple[str, str]]] = None, - button_hover_color: Optional[Union[str, Tuple[str, str]]] = None, - dropdown_fg_color: Optional[Union[str, Tuple[str, str]]] = None, - dropdown_hover_color: Optional[Union[str, Tuple[str, str]]] = None, - dropdown_text_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color_disabled: Optional[Union[str, Tuple[str, str]]] = None, - - font: Optional[Union[tuple, CTkFont]] = None, - dropdown_font: Optional[Union[tuple, CTkFont]] = None, - values: Optional[List[str]] = None, - state: str = tkinter.NORMAL, - hover: bool = True, - variable: Union[tkinter.Variable, None] = None, - command: Union[Callable[[str], Any], None] = None, - justify: str = "left", - **kwargs): - - # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass - super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) - - # shape - self._corner_radius = ThemeManager.theme["CTkComboBox"]["corner_radius"] if corner_radius is None else corner_radius - self._border_width = ThemeManager.theme["CTkComboBox"]["border_width"] if border_width is None else border_width - - # color - self._fg_color = ThemeManager.theme["CTkComboBox"]["fg_color"] if fg_color is None else self._check_color_type(fg_color) - self._border_color = ThemeManager.theme["CTkComboBox"]["border_color"] if border_color is None else self._check_color_type(border_color) - self._button_color = ThemeManager.theme["CTkComboBox"]["button_color"] if button_color is None else self._check_color_type(button_color) - self._button_hover_color = ThemeManager.theme["CTkComboBox"]["button_hover_color"] if button_hover_color is None else self._check_color_type(button_hover_color) - self._text_color = ThemeManager.theme["CTkComboBox"]["text_color"] if text_color is None else self._check_color_type(text_color) - self._text_color_disabled = ThemeManager.theme["CTkComboBox"]["text_color_disabled"] if text_color_disabled is None else self._check_color_type(text_color_disabled) - - # font - self._font = CTkFont() if font is None else self._check_font_type(font) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - # callback and hover functionality - self._command = command - self._variable = variable - self._state = state - self._hover = hover - - if values is None: - self._values = ["CTkComboBox"] - else: - self._values = values - - self._dropdown_menu = DropdownMenu(master=self, - values=self._values, - command=self._dropdown_callback, - fg_color=dropdown_fg_color, - hover_color=dropdown_hover_color, - text_color=dropdown_text_color, - font=dropdown_font) - - # configure grid system (1x1) - self.grid_rowconfigure(0, weight=1) - self.grid_columnconfigure(0, weight=1) - - self._canvas = CTkCanvas(master=self, - highlightthickness=0, - width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self.draw_engine = DrawEngine(self._canvas) - - self._entry = tkinter.Entry(master=self, - state=self._state, - width=1, - bd=0, - justify=justify, - highlightthickness=0, - font=self._apply_font_scaling(self._font)) - - self._create_grid() - self._create_bindings() - self._draw() # initial draw - - if self._variable is not None: - self._entry.configure(textvariable=self._variable) - - # insert default value - if self._variable is None: - if len(self._values) > 0: - self._entry.insert(0, self._values[0]) - else: - self._entry.insert(0, "CTkComboBox") - - def _create_bindings(self, sequence: Optional[str] = None): - """ set necessary bindings for functionality of widget, will overwrite other bindings """ - if sequence is None: - self._canvas.tag_bind("right_parts", "", self._on_enter) - self._canvas.tag_bind("dropdown_arrow", "", self._on_enter) - self._canvas.tag_bind("right_parts", "", self._on_leave) - self._canvas.tag_bind("dropdown_arrow", "", self._on_leave) - self._canvas.tag_bind("right_parts", "", self._clicked) - self._canvas.tag_bind("dropdown_arrow", "", self._clicked) - - def _create_grid(self): - self._canvas.grid(row=0, column=0, rowspan=1, columnspan=1, sticky="nsew") - - left_section_width = self._current_width - self._current_height - self._entry.grid(row=0, column=0, rowspan=1, columnspan=1, sticky="ew", - padx=(max(self._apply_widget_scaling(self._corner_radius), self._apply_widget_scaling(3)), - max(self._apply_widget_scaling(self._current_width - left_section_width + 3), self._apply_widget_scaling(3))), - pady=self._apply_widget_scaling(self._border_width)) - - def _set_scaling(self, *args, **kwargs): - super()._set_scaling(*args, **kwargs) - - # change entry font size and grid padding - self._entry.configure(font=self._apply_font_scaling(self._font)) - self._create_grid() - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._draw(no_color_updates=True) - - def _set_dimensions(self, width: int = None, height: int = None): - super()._set_dimensions(width, height) - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._draw() - - def _update_font(self): - """ pass font to tkinter widgets with applied font scaling and update grid with workaround """ - self._entry.configure(font=self._apply_font_scaling(self._font)) - - # Workaround to force grid to be resized when text changes size. - # Otherwise grid will lag and only resizes if other mouse action occurs. - self._canvas.grid_forget() - self._canvas.grid(row=0, column=0, rowspan=1, columnspan=1, sticky="nsew") - - def destroy(self): - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - - super().destroy() - - def _draw(self, no_color_updates=False): - super()._draw(no_color_updates) - - left_section_width = self._current_width - self._current_height - requires_recoloring = self.draw_engine.draw_rounded_rect_with_border_vertical_split(self._apply_widget_scaling(self._current_width), - self._apply_widget_scaling(self._current_height), - self._apply_widget_scaling(self._corner_radius), - self._apply_widget_scaling(self._border_width), - self._apply_widget_scaling(left_section_width)) - - requires_recoloring_2 = self.draw_engine.draw_dropdown_arrow(self._apply_widget_scaling(self._current_width - (self._current_height / 2)), - self._apply_widget_scaling(self._current_height / 2), - self._apply_widget_scaling(self._current_height / 3)) - - if no_color_updates is False or requires_recoloring or requires_recoloring_2: - - self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - - self._canvas.itemconfig("inner_parts_left", - outline=self._apply_appearance_mode(self._fg_color), - fill=self._apply_appearance_mode(self._fg_color)) - self._canvas.itemconfig("border_parts_left", - outline=self._apply_appearance_mode(self._border_color), - fill=self._apply_appearance_mode(self._border_color)) - self._canvas.itemconfig("inner_parts_right", - outline=self._apply_appearance_mode(self._button_color), - fill=self._apply_appearance_mode(self._button_color)) - self._canvas.itemconfig("border_parts_right", - outline=self._apply_appearance_mode(self._button_color), - fill=self._apply_appearance_mode(self._button_color)) - - self._entry.configure(bg=self._apply_appearance_mode(self._fg_color), - fg=self._apply_appearance_mode(self._text_color), - readonlybackground=self._apply_appearance_mode(self._fg_color), - disabledbackground=self._apply_appearance_mode(self._fg_color), - disabledforeground=self._apply_appearance_mode(self._text_color_disabled), - highlightcolor=self._apply_appearance_mode(self._fg_color), - insertbackground=self._apply_appearance_mode(self._text_color)) - - if self._state == tkinter.DISABLED: - self._canvas.itemconfig("dropdown_arrow", - fill=self._apply_appearance_mode(self._text_color_disabled)) - else: - self._canvas.itemconfig("dropdown_arrow", - fill=self._apply_appearance_mode(self._text_color)) - - def _open_dropdown_menu(self): - self._dropdown_menu.open(self.winfo_rootx(), - self.winfo_rooty() + self._apply_widget_scaling(self._current_height + 0)) - - def configure(self, require_redraw=False, **kwargs): - if "corner_radius" in kwargs: - self._corner_radius = kwargs.pop("corner_radius") - require_redraw = True - - if "border_width" in kwargs: - self._border_width = kwargs.pop("border_width") - self._create_grid() - require_redraw = True - - if "fg_color" in kwargs: - self._fg_color = self._check_color_type(kwargs.pop("fg_color")) - require_redraw = True - - if "border_color" in kwargs: - self._border_color = self._check_color_type(kwargs.pop("border_color")) - require_redraw = True - - if "button_color" in kwargs: - self._button_color = self._check_color_type(kwargs.pop("button_color")) - require_redraw = True - - if "button_hover_color" in kwargs: - self._button_hover_color = self._check_color_type(kwargs.pop("button_hover_color")) - require_redraw = True - - if "dropdown_fg_color" in kwargs: - self._dropdown_menu.configure(fg_color=kwargs.pop("dropdown_fg_color")) - - if "dropdown_hover_color" in kwargs: - self._dropdown_menu.configure(hover_color=kwargs.pop("dropdown_hover_color")) - - if "dropdown_text_color" in kwargs: - self._dropdown_menu.configure(text_color=kwargs.pop("dropdown_text_color")) - - if "text_color" in kwargs: - self._text_color = self._check_color_type(kwargs.pop("text_color")) - require_redraw = True - - if "text_color_disabled" in kwargs: - self._text_color_disabled = self._check_color_type(kwargs.pop("text_color_disabled")) - require_redraw = True - - if "font" in kwargs: - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - self._font = self._check_font_type(kwargs.pop("font")) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - self._update_font() - - if "dropdown_font" in kwargs: - self._dropdown_menu.configure(font=kwargs.pop("dropdown_font")) - - if "values" in kwargs: - self._values = kwargs.pop("values") - self._dropdown_menu.configure(values=self._values) - - if "state" in kwargs: - self._state = kwargs.pop("state") - self._entry.configure(state=self._state) - require_redraw = True - - if "hover" in kwargs: - self._hover = kwargs.pop("hover") - - if "variable" in kwargs: - self._variable = kwargs.pop("variable") - self._entry.configure(textvariable=self._variable) - - if "command" in kwargs: - self._command = kwargs.pop("command") - - if "justify" in kwargs: - self._entry.configure(justify=kwargs.pop("justify")) - - super().configure(require_redraw=require_redraw, **kwargs) - - def cget(self, attribute_name: str) -> any: - if attribute_name == "corner_radius": - return self._corner_radius - elif attribute_name == "border_width": - return self._border_width - - elif attribute_name == "fg_color": - return self._fg_color - elif attribute_name == "border_color": - return self._border_color - elif attribute_name == "button_color": - return self._button_color - elif attribute_name == "button_hover_color": - return self._button_hover_color - elif attribute_name == "dropdown_fg_color": - return self._dropdown_menu.cget("fg_color") - elif attribute_name == "dropdown_hover_color": - return self._dropdown_menu.cget("hover_color") - elif attribute_name == "dropdown_text_color": - return self._dropdown_menu.cget("text_color") - elif attribute_name == "text_color": - return self._text_color - elif attribute_name == "text_color_disabled": - return self._text_color_disabled - - elif attribute_name == "font": - return self._font - elif attribute_name == "dropdown_font": - return self._dropdown_menu.cget("font") - elif attribute_name == "values": - return copy.copy(self._values) - elif attribute_name == "state": - return self._state - elif attribute_name == "hover": - return self._hover - elif attribute_name == "variable": - return self._variable - elif attribute_name == "command": - return self._command - elif attribute_name == "justify": - return self._entry.cget("justify") - else: - return super().cget(attribute_name) - - def _on_enter(self, event=0): - if self._hover is True and self._state == tkinter.NORMAL and len(self._values) > 0: - if sys.platform == "darwin" and len(self._values) > 0 and self._cursor_manipulation_enabled: - self._canvas.configure(cursor="pointinghand") - elif sys.platform.startswith("win") and len(self._values) > 0 and self._cursor_manipulation_enabled: - self._canvas.configure(cursor="hand2") - - # set color of inner button parts to hover color - self._canvas.itemconfig("inner_parts_right", - outline=self._apply_appearance_mode(self._button_hover_color), - fill=self._apply_appearance_mode(self._button_hover_color)) - self._canvas.itemconfig("border_parts_right", - outline=self._apply_appearance_mode(self._button_hover_color), - fill=self._apply_appearance_mode(self._button_hover_color)) - - def _on_leave(self, event=0): - if sys.platform == "darwin" and len(self._values) > 0 and self._cursor_manipulation_enabled: - self._canvas.configure(cursor="arrow") - elif sys.platform.startswith("win") and len(self._values) > 0 and self._cursor_manipulation_enabled: - self._canvas.configure(cursor="arrow") - - # set color of inner button parts - self._canvas.itemconfig("inner_parts_right", - outline=self._apply_appearance_mode(self._button_color), - fill=self._apply_appearance_mode(self._button_color)) - self._canvas.itemconfig("border_parts_right", - outline=self._apply_appearance_mode(self._button_color), - fill=self._apply_appearance_mode(self._button_color)) - - def _dropdown_callback(self, value: str): - if self._state == "readonly": - self._entry.configure(state="normal") - self._entry.delete(0, tkinter.END) - self._entry.insert(0, value) - self._entry.configure(state="readonly") - else: - self._entry.delete(0, tkinter.END) - self._entry.insert(0, value) - - if self._command is not None: - self._command(value) - - def set(self, value: str): - if self._state == "readonly": - self._entry.configure(state="normal") - self._entry.delete(0, tkinter.END) - self._entry.insert(0, value) - self._entry.configure(state="readonly") - else: - self._entry.delete(0, tkinter.END) - self._entry.insert(0, value) - - def get(self) -> str: - return self._entry.get() - - def _clicked(self, event=None): - if self._state is not tkinter.DISABLED and len(self._values) > 0: - self._open_dropdown_menu() - - def bind(self, sequence=None, command=None, add=True): - """ called on the tkinter.Entry """ - if not (add == "+" or add is True): - raise ValueError("'add' argument can only be '+' or True to preserve internal callbacks") - self._entry.bind(sequence, command, add=True) - - def unbind(self, sequence=None, funcid=None): - """ called on the tkinter.Entry """ - if funcid is not None: - raise ValueError("'funcid' argument can only be None, because there is a bug in" + - " tkinter and its not clear whether the internal callbacks will be unbinded or not") - self._entry.unbind(sequence, None) # unbind all callbacks for sequence - self._create_bindings(sequence=sequence) # restore internal callbacks for sequence - - def focus(self): - return self._entry.focus() - - def focus_set(self): - return self._entry.focus_set() - - def focus_force(self): - return self._entry.focus_force() diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_entry.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_entry.py deleted file mode 100644 index cdc0220..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_entry.py +++ /dev/null @@ -1,384 +0,0 @@ -import tkinter -from typing import Union, Tuple, Optional, Any - -from .core_rendering import CTkCanvas -from .theme import ThemeManager -from .core_rendering import DrawEngine -from .core_widget_classes import CTkBaseClass -from .font import CTkFont -from .utility import pop_from_dict_by_set, check_kwargs_empty - - -class CTkEntry(CTkBaseClass): - """ - Entry with rounded corners, border, textvariable support, focus and placeholder. - For detailed information check out the documentation. - """ - - _minimum_x_padding = 6 # minimum padding between tkinter entry and frame border - - # attributes that are passed to and managed by the tkinter entry only: - _valid_tk_entry_attributes = {"exportselection", "insertborderwidth", "insertofftime", - "insertontime", "insertwidth", "justify", "selectborderwidth", - "show", "takefocus", "validate", "validatecommand", "xscrollcommand"} - - def __init__(self, - master: Any, - width: int = 140, - height: int = 28, - corner_radius: Optional[int] = None, - border_width: Optional[int] = None, - - bg_color: Union[str, Tuple[str, str]] = "transparent", - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - border_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color: Optional[Union[str, Tuple[str, str]]] = None, - placeholder_text_color: Optional[Union[str, Tuple[str, str]]] = None, - - textvariable: Union[tkinter.Variable, None] = None, - placeholder_text: Union[str, None] = None, - font: Optional[Union[tuple, CTkFont]] = None, - state: str = tkinter.NORMAL, - **kwargs): - - # transfer basic functionality (bg_color, size, appearance_mode, scaling) to CTkBaseClass - super().__init__(master=master, bg_color=bg_color, width=width, height=height) - - # configure grid system (1x1) - self.grid_rowconfigure(0, weight=1) - self.grid_columnconfigure(0, weight=1) - - # color - self._fg_color = ThemeManager.theme["CTkEntry"]["fg_color"] if fg_color is None else self._check_color_type(fg_color, transparency=True) - self._text_color = ThemeManager.theme["CTkEntry"]["text_color"] if text_color is None else self._check_color_type(text_color) - self._placeholder_text_color = ThemeManager.theme["CTkEntry"]["placeholder_text_color"] if placeholder_text_color is None else self._check_color_type(placeholder_text_color) - self._border_color = ThemeManager.theme["CTkEntry"]["border_color"] if border_color is None else self._check_color_type(border_color) - - # shape - self._corner_radius = ThemeManager.theme["CTkEntry"]["corner_radius"] if corner_radius is None else corner_radius - self._border_width = ThemeManager.theme["CTkEntry"]["border_width"] if border_width is None else border_width - - # text and state - self._is_focused: bool = True - self._placeholder_text = placeholder_text - self._placeholder_text_active = False - self._pre_placeholder_arguments = {} # some set arguments of the entry will be changed for placeholder and then set back - self._textvariable = textvariable - self._state = state - self._textvariable_callback_name: str = "" - - # font - self._font = CTkFont() if font is None else self._check_font_type(font) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - if not (self._textvariable is None or self._textvariable == ""): - self._textvariable_callback_name = self._textvariable.trace_add("write", self._textvariable_callback) - - self._canvas = CTkCanvas(master=self, - highlightthickness=0, - width=self._apply_widget_scaling(self._current_width), - height=self._apply_widget_scaling(self._current_height)) - self._draw_engine = DrawEngine(self._canvas) - - self._entry = tkinter.Entry(master=self, - bd=0, - width=1, - highlightthickness=0, - font=self._apply_font_scaling(self._font), - state=self._state, - textvariable=self._textvariable, - **pop_from_dict_by_set(kwargs, self._valid_tk_entry_attributes)) - - check_kwargs_empty(kwargs, raise_error=True) - - self._create_grid() - self._activate_placeholder() - self._create_bindings() - self._draw() - - def _create_bindings(self, sequence: Optional[str] = None): - """ set necessary bindings for functionality of widget, will overwrite other bindings """ - if sequence is None or sequence == "": - self._entry.bind("", self._entry_focus_in) - if sequence is None or sequence == "": - self._entry.bind("", self._entry_focus_out) - - def _create_grid(self): - self._canvas.grid(column=0, row=0, sticky="nswe") - - if self._corner_radius >= self._minimum_x_padding: - self._entry.grid(column=0, row=0, sticky="nswe", - padx=min(self._apply_widget_scaling(self._corner_radius), round(self._apply_widget_scaling(self._current_height/2))), - pady=(self._apply_widget_scaling(self._border_width), self._apply_widget_scaling(self._border_width + 1))) - else: - self._entry.grid(column=0, row=0, sticky="nswe", - padx=self._apply_widget_scaling(self._minimum_x_padding), - pady=(self._apply_widget_scaling(self._border_width), self._apply_widget_scaling(self._border_width + 1))) - - def _textvariable_callback(self, var_name, index, mode): - if self._textvariable.get() == "": - self._activate_placeholder() - - def _set_scaling(self, *args, **kwargs): - super()._set_scaling(*args, **kwargs) - - self._entry.configure(font=self._apply_font_scaling(self._font)) - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), height=self._apply_widget_scaling(self._desired_height)) - self._create_grid() - self._draw(no_color_updates=True) - - def _set_dimensions(self, width=None, height=None): - super()._set_dimensions(width, height) - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._draw(no_color_updates=True) - - def _update_font(self): - """ pass font to tkinter widgets with applied font scaling and update grid with workaround """ - self._entry.configure(font=self._apply_font_scaling(self._font)) - - # Workaround to force grid to be resized when text changes size. - # Otherwise grid will lag and only resizes if other mouse action occurs. - self._canvas.grid_forget() - self._canvas.grid(column=0, row=0, sticky="nswe") - - def destroy(self): - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - - super().destroy() - - def _draw(self, no_color_updates=False): - super()._draw(no_color_updates) - - requires_recoloring = self._draw_engine.draw_rounded_rect_with_border(self._apply_widget_scaling(self._current_width), - self._apply_widget_scaling(self._current_height), - self._apply_widget_scaling(self._corner_radius), - self._apply_widget_scaling(self._border_width)) - - if requires_recoloring or no_color_updates is False: - self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - - if self._apply_appearance_mode(self._fg_color) == "transparent": - self._canvas.itemconfig("inner_parts", - fill=self._apply_appearance_mode(self._bg_color), - outline=self._apply_appearance_mode(self._bg_color)) - self._entry.configure(bg=self._apply_appearance_mode(self._bg_color), - disabledbackground=self._apply_appearance_mode(self._bg_color), - readonlybackground=self._apply_appearance_mode(self._bg_color), - highlightcolor=self._apply_appearance_mode(self._bg_color)) - else: - self._canvas.itemconfig("inner_parts", - fill=self._apply_appearance_mode(self._fg_color), - outline=self._apply_appearance_mode(self._fg_color)) - self._entry.configure(bg=self._apply_appearance_mode(self._fg_color), - disabledbackground=self._apply_appearance_mode(self._fg_color), - readonlybackground=self._apply_appearance_mode(self._fg_color), - highlightcolor=self._apply_appearance_mode(self._fg_color)) - - self._canvas.itemconfig("border_parts", - fill=self._apply_appearance_mode(self._border_color), - outline=self._apply_appearance_mode(self._border_color)) - - if self._placeholder_text_active: - self._entry.config(fg=self._apply_appearance_mode(self._placeholder_text_color), - disabledforeground=self._apply_appearance_mode(self._placeholder_text_color), - insertbackground=self._apply_appearance_mode(self._placeholder_text_color)) - else: - self._entry.config(fg=self._apply_appearance_mode(self._text_color), - disabledforeground=self._apply_appearance_mode(self._text_color), - insertbackground=self._apply_appearance_mode(self._text_color)) - - def configure(self, require_redraw=False, **kwargs): - if "state" in kwargs: - self._state = kwargs.pop("state") - self._entry.configure(state=self._state) - - if "fg_color" in kwargs: - self._fg_color = self._check_color_type(kwargs.pop("fg_color")) - require_redraw = True - - if "text_color" in kwargs: - self._text_color = self._check_color_type(kwargs.pop("text_color")) - require_redraw = True - - if "placeholder_text_color" in kwargs: - self._placeholder_text_color = self._check_color_type(kwargs.pop("placeholder_text_color")) - require_redraw = True - - if "border_color" in kwargs: - self._border_color = self._check_color_type(kwargs.pop("border_color")) - require_redraw = True - - if "border_width" in kwargs: - self._border_width = kwargs.pop("border_width") - self._create_grid() - require_redraw = True - - if "corner_radius" in kwargs: - self._corner_radius = kwargs.pop("corner_radius") - self._create_grid() - require_redraw = True - - if "placeholder_text" in kwargs: - self._placeholder_text = kwargs.pop("placeholder_text") - if self._placeholder_text_active: - self._entry.delete(0, tkinter.END) - self._entry.insert(0, self._placeholder_text) - else: - self._activate_placeholder() - - if "textvariable" in kwargs: - self._textvariable = kwargs.pop("textvariable") - self._entry.configure(textvariable=self._textvariable) - - if "font" in kwargs: - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - self._font = self._check_font_type(kwargs.pop("font")) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - self._update_font() - - if "show" in kwargs: - if self._placeholder_text_active: - self._pre_placeholder_arguments["show"] = kwargs.pop("show") # remember show argument for when placeholder gets deactivated - else: - self._entry.configure(show=kwargs.pop("show")) - - self._entry.configure(**pop_from_dict_by_set(kwargs, self._valid_tk_entry_attributes)) # configure Tkinter.Entry - super().configure(require_redraw=require_redraw, **kwargs) # configure CTkBaseClass - - def cget(self, attribute_name: str) -> any: - if attribute_name == "corner_radius": - return self._corner_radius - elif attribute_name == "border_width": - return self._border_width - - elif attribute_name == "fg_color": - return self._fg_color - elif attribute_name == "border_color": - return self._border_color - elif attribute_name == "text_color": - return self._text_color - elif attribute_name == "placeholder_text_color": - return self._placeholder_text_color - - elif attribute_name == "textvariable": - return self._textvariable - elif attribute_name == "placeholder_text": - return self._placeholder_text - elif attribute_name == "font": - return self._font - elif attribute_name == "state": - return self._state - - elif attribute_name in self._valid_tk_entry_attributes: - return self._entry.cget(attribute_name) # cget of tkinter.Entry - else: - return super().cget(attribute_name) # cget of CTkBaseClass - - def bind(self, sequence=None, command=None, add=True): - """ called on the tkinter.Entry """ - if not (add == "+" or add is True): - raise ValueError("'add' argument can only be '+' or True to preserve internal callbacks") - self._entry.bind(sequence, command, add=True) - - def unbind(self, sequence=None, funcid=None): - """ called on the tkinter.Entry """ - if funcid is not None: - raise ValueError("'funcid' argument can only be None, because there is a bug in" + - " tkinter and its not clear whether the internal callbacks will be unbinded or not") - self._entry.unbind(sequence, None) # unbind all callbacks for sequence - self._create_bindings(sequence=sequence) # restore internal callbacks for sequence - - def _activate_placeholder(self): - if self._entry.get() == "" and self._placeholder_text is not None and (self._textvariable is None or self._textvariable == ""): - self._placeholder_text_active = True - - self._pre_placeholder_arguments = {"show": self._entry.cget("show")} - self._entry.config(fg=self._apply_appearance_mode(self._placeholder_text_color), - disabledforeground=self._apply_appearance_mode(self._placeholder_text_color), - show="") - self._entry.delete(0, tkinter.END) - self._entry.insert(0, self._placeholder_text) - - def _deactivate_placeholder(self): - if self._placeholder_text_active and self._entry.cget("state") != "readonly": - self._placeholder_text_active = False - - self._entry.config(fg=self._apply_appearance_mode(self._text_color), - disabledforeground=self._apply_appearance_mode(self._text_color),) - self._entry.delete(0, tkinter.END) - for argument, value in self._pre_placeholder_arguments.items(): - self._entry[argument] = value - - def _entry_focus_out(self, event=None): - self._activate_placeholder() - self._is_focused = False - - def _entry_focus_in(self, event=None): - self._deactivate_placeholder() - self._is_focused = True - - def delete(self, first_index, last_index=None): - self._entry.delete(first_index, last_index) - - if not self._is_focused and self._entry.get() == "": - self._activate_placeholder() - - def insert(self, index, string): - self._deactivate_placeholder() - - return self._entry.insert(index, string) - - def get(self): - if self._placeholder_text_active: - return "" - else: - return self._entry.get() - - def focus(self): - self._entry.focus() - - def focus_set(self): - self._entry.focus_set() - - def focus_force(self): - self._entry.focus_force() - - def index(self, index): - return self._entry.index(index) - - def icursor(self, index): - return self._entry.icursor(index) - - def select_adjust(self, index): - return self._entry.select_adjust(index) - - def select_from(self, index): - return self._entry.icursor(index) - - def select_clear(self): - return self._entry.select_clear() - - def select_present(self): - return self._entry.select_present() - - def select_range(self, start_index, end_index): - return self._entry.select_range(start_index, end_index) - - def select_to(self, index): - return self._entry.select_to(index) - - def xview(self, index): - return self._entry.xview(index) - - def xview_moveto(self, f): - return self._entry.xview_moveto(f) - - def xview_scroll(self, number, what): - return self._entry.xview_scroll(number, what) diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_frame.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_frame.py deleted file mode 100644 index 7bddf3c..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_frame.py +++ /dev/null @@ -1,196 +0,0 @@ -from typing import Union, Tuple, List, Optional, Any - -from .core_rendering import CTkCanvas -from .theme import ThemeManager -from .core_rendering import DrawEngine -from .core_widget_classes import CTkBaseClass - - -class CTkFrame(CTkBaseClass): - """ - Frame with rounded corners and border. - Default foreground colors are set according to theme. - To make the frame transparent set fg_color=None. - For detailed information check out the documentation. - """ - - def __init__(self, - master: Any, - width: int = 200, - height: int = 200, - corner_radius: Optional[Union[int, str]] = None, - border_width: Optional[Union[int, str]] = None, - - bg_color: Union[str, Tuple[str, str]] = "transparent", - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - border_color: Optional[Union[str, Tuple[str, str]]] = None, - - background_corner_colors: Union[Tuple[Union[str, Tuple[str, str]]], None] = None, - overwrite_preferred_drawing_method: Union[str, None] = None, - **kwargs): - - # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass - super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) - - # color - self._border_color = ThemeManager.theme["CTkFrame"]["border_color"] if border_color is None else self._check_color_type(border_color) - - # determine fg_color of frame - if fg_color is None: - if isinstance(self.master, CTkFrame): - if self.master._fg_color == ThemeManager.theme["CTkFrame"]["fg_color"]: - self._fg_color = ThemeManager.theme["CTkFrame"]["top_fg_color"] - else: - self._fg_color = ThemeManager.theme["CTkFrame"]["fg_color"] - else: - self._fg_color = ThemeManager.theme["CTkFrame"]["fg_color"] - else: - self._fg_color = self._check_color_type(fg_color, transparency=True) - - self._background_corner_colors = background_corner_colors # rendering options for DrawEngine - - # shape - self._corner_radius = ThemeManager.theme["CTkFrame"]["corner_radius"] if corner_radius is None else corner_radius - self._border_width = ThemeManager.theme["CTkFrame"]["border_width"] if border_width is None else border_width - - self._canvas = CTkCanvas(master=self, - highlightthickness=0, - width=self._apply_widget_scaling(self._current_width), - height=self._apply_widget_scaling(self._current_height)) - self._canvas.place(x=0, y=0, relwidth=1, relheight=1) - self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - self._draw_engine = DrawEngine(self._canvas) - self._overwrite_preferred_drawing_method = overwrite_preferred_drawing_method - - self._draw(no_color_updates=True) - - def winfo_children(self) -> List[any]: - """ - winfo_children of CTkFrame without self.canvas widget, - because it's not a child but part of the CTkFrame itself - """ - - child_widgets = super().winfo_children() - try: - child_widgets.remove(self._canvas) - return child_widgets - except ValueError: - return child_widgets - - def _set_scaling(self, *args, **kwargs): - super()._set_scaling(*args, **kwargs) - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._draw() - - def _set_dimensions(self, width=None, height=None): - super()._set_dimensions(width, height) - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._draw() - - def _draw(self, no_color_updates=False): - super()._draw(no_color_updates) - - if not self._canvas.winfo_exists(): - return - - if self._background_corner_colors is not None: - self._draw_engine.draw_background_corners(self._apply_widget_scaling(self._current_width), - self._apply_widget_scaling(self._current_height)) - self._canvas.itemconfig("background_corner_top_left", fill=self._apply_appearance_mode(self._background_corner_colors[0])) - self._canvas.itemconfig("background_corner_top_right", fill=self._apply_appearance_mode(self._background_corner_colors[1])) - self._canvas.itemconfig("background_corner_bottom_right", fill=self._apply_appearance_mode(self._background_corner_colors[2])) - self._canvas.itemconfig("background_corner_bottom_left", fill=self._apply_appearance_mode(self._background_corner_colors[3])) - else: - self._canvas.delete("background_parts") - - requires_recoloring = self._draw_engine.draw_rounded_rect_with_border(self._apply_widget_scaling(self._current_width), - self._apply_widget_scaling(self._current_height), - self._apply_widget_scaling(self._corner_radius), - self._apply_widget_scaling(self._border_width), - overwrite_preferred_drawing_method=self._overwrite_preferred_drawing_method) - - if no_color_updates is False or requires_recoloring: - if self._fg_color == "transparent": - self._canvas.itemconfig("inner_parts", - fill=self._apply_appearance_mode(self._bg_color), - outline=self._apply_appearance_mode(self._bg_color)) - else: - self._canvas.itemconfig("inner_parts", - fill=self._apply_appearance_mode(self._fg_color), - outline=self._apply_appearance_mode(self._fg_color)) - - self._canvas.itemconfig("border_parts", - fill=self._apply_appearance_mode(self._border_color), - outline=self._apply_appearance_mode(self._border_color)) - self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - - # self._canvas.tag_lower("inner_parts") # maybe unnecessary, I don't know ??? - # self._canvas.tag_lower("border_parts") - - def configure(self, require_redraw=False, **kwargs): - if "fg_color" in kwargs: - self._fg_color = self._check_color_type(kwargs.pop("fg_color"), transparency=True) - require_redraw = True - - # check if CTk widgets are children of the frame and change their bg_color to new frame fg_color - for child in self.winfo_children(): - if isinstance(child, CTkBaseClass): - child.configure(bg_color=self._fg_color) - - if "bg_color" in kwargs: - # pass bg_color change to children if fg_color is "transparent" - if self._fg_color == "transparent": - for child in self.winfo_children(): - if isinstance(child, CTkBaseClass): - child.configure(bg_color=self._fg_color) - - if "border_color" in kwargs: - self._border_color = self._check_color_type(kwargs.pop("border_color")) - require_redraw = True - - if "background_corner_colors" in kwargs: - self._background_corner_colors = kwargs.pop("background_corner_colors") - require_redraw = True - - if "corner_radius" in kwargs: - self._corner_radius = kwargs.pop("corner_radius") - require_redraw = True - - if "border_width" in kwargs: - self._border_width = kwargs.pop("border_width") - require_redraw = True - - super().configure(require_redraw=require_redraw, **kwargs) - - def cget(self, attribute_name: str) -> any: - if attribute_name == "corner_radius": - return self._corner_radius - elif attribute_name == "border_width": - return self._border_width - - elif attribute_name == "fg_color": - return self._fg_color - elif attribute_name == "border_color": - return self._border_color - elif attribute_name == "background_corner_colors": - return self._background_corner_colors - - else: - return super().cget(attribute_name) - - def bind(self, sequence=None, command=None, add=True): - """ called on the tkinter.Canvas """ - if not (add == "+" or add is True): - raise ValueError("'add' argument can only be '+' or True to preserve internal callbacks") - self._canvas.bind(sequence, command, add=True) - - def unbind(self, sequence=None, funcid=None): - """ called on the tkinter.Canvas """ - if funcid is not None: - raise ValueError("'funcid' argument can only be None, because there is a bug in" + - " tkinter and its not clear whether the internal callbacks will be unbinded or not") - self._canvas.unbind(sequence, None) diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_label.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_label.py deleted file mode 100644 index 7e59ad7..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_label.py +++ /dev/null @@ -1,291 +0,0 @@ -import tkinter -from typing import Union, Tuple, Callable, Optional, Any - -from .core_rendering import CTkCanvas -from .theme import ThemeManager -from .core_rendering import DrawEngine -from .core_widget_classes import CTkBaseClass -from .font import CTkFont -from .image import CTkImage -from .utility import pop_from_dict_by_set, check_kwargs_empty - - -class CTkLabel(CTkBaseClass): - """ - Label with rounded corners. Default is fg_color=None (transparent fg_color). - For detailed information check out the documentation. - - state argument will probably be removed because it has no effect - """ - - # attributes that are passed to and managed by the tkinter entry only: - _valid_tk_label_attributes = {"cursor", "justify", "padx", "pady", - "textvariable", "state", "takefocus", "underline"} - - def __init__(self, - master: Any, - width: int = 0, - height: int = 28, - corner_radius: Optional[int] = None, - - bg_color: Union[str, Tuple[str, str]] = "transparent", - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color_disabled: Optional[Union[str, Tuple[str, str]]] = None, - - text: str = "CTkLabel", - font: Optional[Union[tuple, CTkFont]] = None, - image: Union[CTkImage, None] = None, - compound: str = "center", - anchor: str = "center", # label anchor: center, n, e, s, w - wraplength: int = 0, - **kwargs): - - # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass - super().__init__(master=master, bg_color=bg_color, width=width, height=height) - - # color - self._fg_color = ThemeManager.theme["CTkLabel"]["fg_color"] if fg_color is None else self._check_color_type(fg_color, transparency=True) - self._text_color = ThemeManager.theme["CTkLabel"]["text_color"] if text_color is None else self._check_color_type(text_color) - - if text_color_disabled is None: - if "text_color_disabled" in ThemeManager.theme["CTkLabel"]: - self._text_color_disabled = ThemeManager.theme["CTkLabel"]["text_color"] - else: - self._text_color_disabled = self._text_color - else: - self._text_color_disabled = self._check_color_type(text_color_disabled) - - # shape - self._corner_radius = ThemeManager.theme["CTkLabel"]["corner_radius"] if corner_radius is None else corner_radius - - # text - self._anchor = anchor - self._text = text - self._wraplength = wraplength - - # image - self._image = self._check_image_type(image) - self._compound = compound - if isinstance(self._image, CTkImage): - self._image.add_configure_callback(self._update_image) - - # font - self._font = CTkFont() if font is None else self._check_font_type(font) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - # configure grid system (1x1) - self.grid_rowconfigure(0, weight=1) - self.grid_columnconfigure(0, weight=1) - - self._canvas = CTkCanvas(master=self, - highlightthickness=0, - width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._canvas.grid(row=0, column=0, sticky="nswe") - self._draw_engine = DrawEngine(self._canvas) - - self._label = tkinter.Label(master=self, - highlightthickness=0, - padx=0, - pady=0, - borderwidth=0, - anchor=self._anchor, - compound=self._compound, - wraplength=self._apply_widget_scaling(self._wraplength), - text=self._text, - font=self._apply_font_scaling(self._font)) - self._label.configure(**pop_from_dict_by_set(kwargs, self._valid_tk_label_attributes)) - - check_kwargs_empty(kwargs, raise_error=True) - - self._create_grid() - self._update_image() - self._draw() - - def _set_scaling(self, *args, **kwargs): - super()._set_scaling(*args, **kwargs) - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), height=self._apply_widget_scaling(self._desired_height)) - self._label.configure(font=self._apply_font_scaling(self._font)) - self._label.configure(wraplength=self._apply_widget_scaling(self._wraplength)) - - self._create_grid() - self._update_image() - self._draw(no_color_updates=True) - - def _set_appearance_mode(self, mode_string): - super()._set_appearance_mode(mode_string) - self._update_image() - - def _set_dimensions(self, width=None, height=None): - super()._set_dimensions(width, height) - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._create_grid() - self._draw() - - def _update_font(self): - """ pass font to tkinter widgets with applied font scaling and update grid with workaround """ - self._label.configure(font=self._apply_font_scaling(self._font)) - - # Workaround to force grid to be resized when text changes size. - # Otherwise grid will lag and only resizes if other mouse action occurs. - self._canvas.grid_forget() - self._canvas.grid(row=0, column=0, sticky="nswe") - - def _update_image(self): - if isinstance(self._image, CTkImage): - self._label.configure(image=self._image.create_scaled_photo_image(self._get_widget_scaling(), - self._get_appearance_mode())) - elif self._image is not None: - self._label.configure(image=self._image) - - def destroy(self): - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - super().destroy() - - def _create_grid(self): - """ configure grid system (1x1) """ - - text_label_grid_sticky = self._anchor if self._anchor != "center" else "" - self._label.grid(row=0, column=0, sticky=text_label_grid_sticky, - padx=self._apply_widget_scaling(min(self._corner_radius, round(self._current_height / 2)))) - - def _draw(self, no_color_updates=False): - super()._draw(no_color_updates) - - requires_recoloring = self._draw_engine.draw_rounded_rect_with_border(self._apply_widget_scaling(self._current_width), - self._apply_widget_scaling(self._current_height), - self._apply_widget_scaling(self._corner_radius), - 0) - - if no_color_updates is False or requires_recoloring: - if self._apply_appearance_mode(self._fg_color) == "transparent": - self._canvas.itemconfig("inner_parts", - fill=self._apply_appearance_mode(self._bg_color), - outline=self._apply_appearance_mode(self._bg_color)) - - self._label.configure(fg=self._apply_appearance_mode(self._text_color), - disabledforeground=self._apply_appearance_mode(self._text_color_disabled), - bg=self._apply_appearance_mode(self._bg_color)) - else: - self._canvas.itemconfig("inner_parts", - fill=self._apply_appearance_mode(self._fg_color), - outline=self._apply_appearance_mode(self._fg_color)) - - self._label.configure(fg=self._apply_appearance_mode(self._text_color), - disabledforeground=self._apply_appearance_mode(self._text_color_disabled), - bg=self._apply_appearance_mode(self._fg_color)) - - self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - - def configure(self, require_redraw=False, **kwargs): - if "corner_radius" in kwargs: - self._corner_radius = kwargs.pop("corner_radius") - self._create_grid() - require_redraw = True - - if "fg_color" in kwargs: - self._fg_color = self._check_color_type(kwargs.pop("fg_color"), transparency=True) - require_redraw = True - - if "text_color" in kwargs: - self._text_color = self._check_color_type(kwargs.pop("text_color")) - require_redraw = True - - if "text_color_disabled" in kwargs: - self._text_color_disabled = self._check_color_type(kwargs.pop("text_color_disabled")) - require_redraw = True - - if "text" in kwargs: - self._text = kwargs.pop("text") - self._label.configure(text=self._text) - - if "font" in kwargs: - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - self._font = self._check_font_type(kwargs.pop("font")) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - self._update_font() - - if "image" in kwargs: - if isinstance(self._image, CTkImage): - self._image.remove_configure_callback(self._update_image) - self._image = self._check_image_type(kwargs.pop("image")) - if isinstance(self._image, CTkImage): - self._image.add_configure_callback(self._update_image) - self._update_image() - - if "compound" in kwargs: - self._compound = kwargs.pop("compound") - self._label.configure(compound=self._compound) - - if "anchor" in kwargs: - self._anchor = kwargs.pop("anchor") - self._label.configure(anchor=self._anchor) - self._create_grid() - - if "wraplength" in kwargs: - self._wraplength = kwargs.pop("wraplength") - self._label.configure(wraplength=self._apply_widget_scaling(self._wraplength)) - - self._label.configure(**pop_from_dict_by_set(kwargs, self._valid_tk_label_attributes)) # configure tkinter.Label - super().configure(require_redraw=require_redraw, **kwargs) # configure CTkBaseClass - - def cget(self, attribute_name: str) -> any: - if attribute_name == "corner_radius": - return self._corner_radius - - elif attribute_name == "fg_color": - return self._fg_color - elif attribute_name == "text_color": - return self._text_color - elif attribute_name == "text_color_disabled": - return self._text_color_disabled - - elif attribute_name == "text": - return self._text - elif attribute_name == "font": - return self._font - elif attribute_name == "image": - return self._image - elif attribute_name == "compound": - return self._compound - elif attribute_name == "anchor": - return self._anchor - elif attribute_name == "wraplength": - return self._wraplength - - elif attribute_name in self._valid_tk_label_attributes: - return self._label.cget(attribute_name) # cget of tkinter.Label - else: - return super().cget(attribute_name) # cget of CTkBaseClass - - def bind(self, sequence: str = None, command: Callable = None, add: str = True): - """ called on the tkinter.Label and tkinter.Canvas """ - if not (add == "+" or add is True): - raise ValueError("'add' argument can only be '+' or True to preserve internal callbacks") - self._canvas.bind(sequence, command, add=True) - self._label.bind(sequence, command, add=True) - - def unbind(self, sequence: str = None, funcid: Optional[str] = None): - """ called on the tkinter.Label and tkinter.Canvas """ - if funcid is not None: - raise ValueError("'funcid' argument can only be None, because there is a bug in" + - " tkinter and its not clear whether the internal callbacks will be unbinded or not") - self._canvas.unbind(sequence, None) - self._label.unbind(sequence, None) - - def focus(self): - return self._label.focus() - - def focus_set(self): - return self._label.focus_set() - - def focus_force(self): - return self._label.focus_force() diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_optionmenu.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_optionmenu.py deleted file mode 100644 index 491027b..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_optionmenu.py +++ /dev/null @@ -1,426 +0,0 @@ -import tkinter -import copy -import sys -from typing import Union, Tuple, Callable, Optional, Any - -from .core_rendering import CTkCanvas -from .theme import ThemeManager -from .core_rendering import DrawEngine -from .core_widget_classes import CTkBaseClass -from .core_widget_classes import DropdownMenu -from .font import CTkFont - - -class CTkOptionMenu(CTkBaseClass): - """ - Optionmenu with rounded corners, dropdown menu, variable support, command. - For detailed information check out the documentation. - """ - - def __init__(self, - master: Any, - width: int = 140, - height: int = 28, - corner_radius: Optional[Union[int]] = None, - - bg_color: Union[str, Tuple[str, str]] = "transparent", - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - button_color: Optional[Union[str, Tuple[str, str]]] = None, - button_hover_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color_disabled: Optional[Union[str, Tuple[str, str]]] = None, - dropdown_fg_color: Optional[Union[str, Tuple[str, str]]] = None, - dropdown_hover_color: Optional[Union[str, Tuple[str, str]]] = None, - dropdown_text_color: Optional[Union[str, Tuple[str, str]]] = None, - - font: Optional[Union[tuple, CTkFont]] = None, - dropdown_font: Optional[Union[tuple, CTkFont]] = None, - values: Optional[list] = None, - variable: Union[tkinter.Variable, None] = None, - state: str = tkinter.NORMAL, - hover: bool = True, - command: Union[Callable[[str], Any], None] = None, - dynamic_resizing: bool = True, - anchor: str = "w", - **kwargs): - - # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass - super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) - - # color variables - self._fg_color = ThemeManager.theme["CTkOptionMenu"]["fg_color"] if fg_color is None else self._check_color_type(fg_color) - self._button_color = ThemeManager.theme["CTkOptionMenu"]["button_color"] if button_color is None else self._check_color_type(button_color) - self._button_hover_color = ThemeManager.theme["CTkOptionMenu"]["button_hover_color"] if button_hover_color is None else self._check_color_type(button_hover_color) - - # shape - self._corner_radius = ThemeManager.theme["CTkOptionMenu"]["corner_radius"] if corner_radius is None else corner_radius - - # text and font - self._text_color = ThemeManager.theme["CTkOptionMenu"]["text_color"] if text_color is None else self._check_color_type(text_color) - self._text_color_disabled = ThemeManager.theme["CTkOptionMenu"]["text_color_disabled"] if text_color_disabled is None else self._check_color_type(text_color_disabled) - - # font - self._font = CTkFont() if font is None else self._check_font_type(font) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - # callback and hover functionality - self._command = command - self._variable = variable - self._variable_callback_blocked: bool = False - self._variable_callback_name: Union[str, None] = None - self._state = state - self._hover = hover - self._dynamic_resizing = dynamic_resizing - - if values is None: - self._values = ["CTkOptionMenu"] - else: - self._values = values - - if len(self._values) > 0: - self._current_value = self._values[0] - else: - self._current_value = "CTkOptionMenu" - - self._dropdown_menu = DropdownMenu(master=self, - values=self._values, - command=self._dropdown_callback, - fg_color=dropdown_fg_color, - hover_color=dropdown_hover_color, - text_color=dropdown_text_color, - font=dropdown_font) - - # configure grid system (1x1) - self.grid_rowconfigure(0, weight=1) - self.grid_columnconfigure(0, weight=1) - - self._canvas = CTkCanvas(master=self, - highlightthickness=0, - width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._draw_engine = DrawEngine(self._canvas) - - self._text_label = tkinter.Label(master=self, - font=self._apply_font_scaling(self._font), - anchor=anchor, - padx=0, - pady=0, - borderwidth=1, - text=self._current_value) - - if self._cursor_manipulation_enabled: - if sys.platform == "darwin": - self.configure(cursor="pointinghand") - elif sys.platform.startswith("win"): - self.configure(cursor="hand2") - - self._create_grid() - if not self._dynamic_resizing: - self.grid_propagate(0) - - self._create_bindings() - self._draw() # initial draw - - if self._variable is not None: - self._variable_callback_name = self._variable.trace_add("write", self._variable_callback) - self._current_value = self._variable.get() - self._text_label.configure(text=self._current_value) - - def _create_bindings(self, sequence: Optional[str] = None): - """ set necessary bindings for functionality of widget, will overwrite other bindings """ - if sequence is None or sequence == "": - self._canvas.bind("", self._on_enter) - self._text_label.bind("", self._on_enter) - if sequence is None or sequence == "": - self._canvas.bind("", self._on_leave) - self._text_label.bind("", self._on_leave) - if sequence is None or sequence == "": - self._canvas.bind("", self._clicked) - self._text_label.bind("", self._clicked) - - def _create_grid(self): - self._canvas.grid(row=0, column=0, sticky="nsew") - - left_section_width = self._current_width - self._current_height - self._text_label.grid(row=0, column=0, sticky="ew", - padx=(max(self._apply_widget_scaling(self._corner_radius), self._apply_widget_scaling(3)), - max(self._apply_widget_scaling(self._current_width - left_section_width + 3), self._apply_widget_scaling(3)))) - - def _set_scaling(self, *args, **kwargs): - super()._set_scaling(*args, **kwargs) - - # change label font size and grid padding - self._text_label.configure(font=self._apply_font_scaling(self._font)) - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._create_grid() - self._draw(no_color_updates=True) - - def _set_dimensions(self, width: int = None, height: int = None): - super()._set_dimensions(width, height) - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._draw() - - def _update_font(self): - """ pass font to tkinter widgets with applied font scaling and update grid with workaround """ - self._text_label.configure(font=self._apply_font_scaling(self._font)) - - # Workaround to force grid to be resized when text changes size. - # Otherwise grid will lag and only resizes if other mouse action occurs. - self._canvas.grid_forget() - self._canvas.grid(row=0, column=0, sticky="nsew") - - def destroy(self): - if self._variable is not None: # remove old callback - self._variable.trace_remove("write", self._variable_callback_name) - - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - - super().destroy() - - def _draw(self, no_color_updates=False): - super()._draw(no_color_updates) - - left_section_width = self._current_width - self._current_height - requires_recoloring = self._draw_engine.draw_rounded_rect_with_border_vertical_split(self._apply_widget_scaling(self._current_width), - self._apply_widget_scaling(self._current_height), - self._apply_widget_scaling(self._corner_radius), - 0, - self._apply_widget_scaling(left_section_width)) - - requires_recoloring_2 = self._draw_engine.draw_dropdown_arrow(self._apply_widget_scaling(self._current_width - (self._current_height / 2)), - self._apply_widget_scaling(self._current_height / 2), - self._apply_widget_scaling(self._current_height / 3)) - - if no_color_updates is False or requires_recoloring or requires_recoloring_2: - self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - - self._canvas.itemconfig("inner_parts_left", - outline=self._apply_appearance_mode(self._fg_color), - fill=self._apply_appearance_mode(self._fg_color)) - self._canvas.itemconfig("inner_parts_right", - outline=self._apply_appearance_mode(self._button_color), - fill=self._apply_appearance_mode(self._button_color)) - - self._text_label.configure(fg=self._apply_appearance_mode(self._text_color)) - - if self._state == tkinter.DISABLED: - self._text_label.configure(fg=(self._apply_appearance_mode(self._text_color_disabled))) - self._canvas.itemconfig("dropdown_arrow", - fill=self._apply_appearance_mode(self._text_color_disabled)) - else: - self._text_label.configure(fg=self._apply_appearance_mode(self._text_color)) - self._canvas.itemconfig("dropdown_arrow", - fill=self._apply_appearance_mode(self._text_color)) - - self._text_label.configure(bg=self._apply_appearance_mode(self._fg_color)) - - self._canvas.update_idletasks() - - def configure(self, require_redraw=False, **kwargs): - if "corner_radius" in kwargs: - self._corner_radius = kwargs.pop("corner_radius") - self._create_grid() - require_redraw = True - - if "fg_color" in kwargs: - self._fg_color = self._check_color_type(kwargs.pop("fg_color")) - require_redraw = True - - if "button_color" in kwargs: - self._button_color = self._check_color_type(kwargs.pop("button_color")) - require_redraw = True - - if "button_hover_color" in kwargs: - self._button_hover_color = self._check_color_type(kwargs.pop("button_hover_color")) - require_redraw = True - - if "text_color" in kwargs: - self._text_color = self._check_color_type(kwargs.pop("text_color")) - require_redraw = True - - if "text_color_disabled" in kwargs: - self._text_color_disabled = self._check_color_type(kwargs.pop("text_color_disabled")) - require_redraw = True - - if "dropdown_fg_color" in kwargs: - self._dropdown_menu.configure(fg_color=kwargs.pop("dropdown_fg_color")) - - if "dropdown_hover_color" in kwargs: - self._dropdown_menu.configure(hover_color=kwargs.pop("dropdown_hover_color")) - - if "dropdown_text_color" in kwargs: - self._dropdown_menu.configure(text_color=kwargs.pop("dropdown_text_color")) - - if "font" in kwargs: - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - self._font = self._check_font_type(kwargs.pop("font")) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - self._update_font() - - if "dropdown_font" in kwargs: - self._dropdown_menu.configure(font=kwargs.pop("dropdown_font")) - - if "values" in kwargs: - self._values = kwargs.pop("values") - self._dropdown_menu.configure(values=self._values) - - if "variable" in kwargs: - if self._variable is not None: # remove old callback - self._variable.trace_remove("write", self._variable_callback_name) - - self._variable = kwargs.pop("variable") - - if self._variable is not None and self._variable != "": - self._variable_callback_name = self._variable.trace_add("write", self._variable_callback) - self._current_value = self._variable.get() - self._text_label.configure(text=self._current_value) - else: - self._variable = None - - if "state" in kwargs: - self._state = kwargs.pop("state") - require_redraw = True - - if "hover" in kwargs: - self._hover = kwargs.pop("hover") - - if "command" in kwargs: - self._command = kwargs.pop("command") - - if "dynamic_resizing" in kwargs: - self._dynamic_resizing = kwargs.pop("dynamic_resizing") - if not self._dynamic_resizing: - self.grid_propagate(0) - else: - self.grid_propagate(1) - - if "anchor" in kwargs: - self._text_label.configure(anchor=kwargs.pop("anchor")) - - super().configure(require_redraw=require_redraw, **kwargs) - - def cget(self, attribute_name: str) -> any: - if attribute_name == "corner_radius": - return self._corner_radius - - elif attribute_name == "fg_color": - return self._fg_color - elif attribute_name == "button_color": - return self._button_color - elif attribute_name == "button_hover_color": - return self._button_hover_color - elif attribute_name == "text_color": - return self._text_color - elif attribute_name == "text_color_disabled": - return self._text_color_disabled - elif attribute_name == "dropdown_fg_color": - return self._dropdown_menu.cget("fg_color") - elif attribute_name == "dropdown_hover_color": - return self._dropdown_menu.cget("hover_color") - elif attribute_name == "dropdown_text_color": - return self._dropdown_menu.cget("text_color") - - elif attribute_name == "font": - return self._font - elif attribute_name == "dropdown_font": - return self._dropdown_menu.cget("font") - elif attribute_name == "values": - return copy.copy(self._values) - elif attribute_name == "variable": - return self._variable - elif attribute_name == "state": - return self._state - elif attribute_name == "hover": - return self._hover - elif attribute_name == "command": - return self._command - elif attribute_name == "dynamic_resizing": - return self._dynamic_resizing - elif attribute_name == "anchor": - return self._text_label.cget("anchor") - - else: - return super().cget(attribute_name) - - def _open_dropdown_menu(self): - self._dropdown_menu.open(self.winfo_rootx(), - self.winfo_rooty() + self._apply_widget_scaling(self._current_height + 0)) - - def _on_enter(self, event=0): - if self._hover is True and self._state == tkinter.NORMAL and len(self._values) > 0: - # set color of inner button parts to hover color - self._canvas.itemconfig("inner_parts_right", - outline=self._apply_appearance_mode(self._button_hover_color), - fill=self._apply_appearance_mode(self._button_hover_color)) - - def _on_leave(self, event=0): - # set color of inner button parts - self._canvas.itemconfig("inner_parts_right", - outline=self._apply_appearance_mode(self._button_color), - fill=self._apply_appearance_mode(self._button_color)) - - def _variable_callback(self, var_name, index, mode): - if not self._variable_callback_blocked: - self._current_value = self._variable.get() - self._text_label.configure(text=self._current_value) - - def _dropdown_callback(self, value: str): - self._current_value = value - self._text_label.configure(text=self._current_value) - - if self._variable is not None: - self._variable_callback_blocked = True - self._variable.set(self._current_value) - self._variable_callback_blocked = False - - if self._command is not None: - self._command(self._current_value) - - def set(self, value: str): - self._current_value = value - self._text_label.configure(text=self._current_value) - - if self._variable is not None: - self._variable_callback_blocked = True - self._variable.set(self._current_value) - self._variable_callback_blocked = False - - def get(self) -> str: - return self._current_value - - def _clicked(self, event=0): - if self._state is not tkinter.DISABLED and len(self._values) > 0: - self._open_dropdown_menu() - - def bind(self, sequence: str = None, command: Callable = None, add: Union[str, bool] = True): - """ called on the tkinter.Canvas """ - if not (add == "+" or add is True): - raise ValueError("'add' argument can only be '+' or True to preserve internal callbacks") - self._canvas.bind(sequence, command, add=True) - self._text_label.bind(sequence, command, add=True) - - def unbind(self, sequence: str = None, funcid: str = None): - """ called on the tkinter.Label and tkinter.Canvas """ - if funcid is not None: - raise ValueError("'funcid' argument can only be None, because there is a bug in" + - " tkinter and its not clear whether the internal callbacks will be unbinded or not") - self._canvas.unbind(sequence, None) - self._text_label.unbind(sequence, None) - self._create_bindings(sequence=sequence) # restore internal callbacks for sequence - - def focus(self): - return self._text_label.focus() - - def focus_set(self): - return self._text_label.focus_set() - - def focus_force(self): - return self._text_label.focus_force() diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_progressbar.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_progressbar.py deleted file mode 100644 index 2d6ce59..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_progressbar.py +++ /dev/null @@ -1,312 +0,0 @@ -import tkinter -import math -from typing import Union, Tuple, Optional, Callable, Any -try: - from typing import Literal -except ImportError: - from typing_extensions import Literal - -from .core_rendering import CTkCanvas -from .theme import ThemeManager -from .core_rendering import DrawEngine -from .core_widget_classes import CTkBaseClass - - -class CTkProgressBar(CTkBaseClass): - """ - Progressbar with rounded corners, border, variable support, - indeterminate mode, vertical orientation. - For detailed information check out the documentation. - """ - - def __init__(self, - master: Any, - width: Optional[int] = None, - height: Optional[int] = None, - corner_radius: Optional[int] = None, - border_width: Optional[int] = None, - - bg_color: Union[str, Tuple[str, str]] = "transparent", - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - border_color: Optional[Union[str, Tuple[str, str]]] = None, - progress_color: Optional[Union[str, Tuple[str, str]]] = None, - - variable: Union[tkinter.Variable, None] = None, - orientation: str = "horizontal", - mode: Literal["determinate", "indeterminate"] = "determinate", - determinate_speed: float = 1, - indeterminate_speed: float = 1, - **kwargs): - - # set default dimensions according to orientation - if width is None: - if orientation.lower() == "vertical": - width = 8 - else: - width = 200 - if height is None: - if orientation.lower() == "vertical": - height = 200 - else: - height = 8 - - # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass - super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) - - # color - self._border_color = ThemeManager.theme["CTkProgressBar"]["border_color"] if border_color is None else self._check_color_type(border_color) - self._fg_color = ThemeManager.theme["CTkProgressBar"]["fg_color"] if fg_color is None else self._check_color_type(fg_color) - self._progress_color = ThemeManager.theme["CTkProgressBar"]["progress_color"] if progress_color is None else self._check_color_type(progress_color) - - # control variable - self._variable = variable - self._variable_callback_blocked = False - self._variable_callback_name = None - self._loop_after_id = None - - # shape - self._corner_radius = ThemeManager.theme["CTkProgressBar"]["corner_radius"] if corner_radius is None else corner_radius - self._border_width = ThemeManager.theme["CTkProgressBar"]["border_width"] if border_width is None else border_width - self._determinate_value: float = 0.5 # range 0-1 - self._determinate_speed = determinate_speed # range 0-1 - self._indeterminate_value: float = 0 # range 0-inf - self._indeterminate_width: float = 0.4 # range 0-1 - self._indeterminate_speed = indeterminate_speed # range 0-1 to travel in 50ms - self._loop_running: bool = False - self._orientation = orientation - self._mode = mode # "determinate" or "indeterminate" - - self.grid_rowconfigure(0, weight=1) - self.grid_columnconfigure(0, weight=1) - - self._canvas = CTkCanvas(master=self, - highlightthickness=0, - width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._canvas.grid(row=0, column=0, rowspan=1, columnspan=1, sticky="nswe") - self._draw_engine = DrawEngine(self._canvas) - - self._draw() # initial draw - - if self._variable is not None: - self._variable_callback_name = self._variable.trace_add("write", self._variable_callback) - self._variable_callback_blocked = True - self.set(self._variable.get(), from_variable_callback=True) - self._variable_callback_blocked = False - - def _set_scaling(self, *args, **kwargs): - super()._set_scaling(*args, **kwargs) - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._draw(no_color_updates=True) - - def _set_dimensions(self, width=None, height=None): - super()._set_dimensions(width, height) - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._draw() - - def destroy(self): - if self._variable is not None: - self._variable.trace_remove("write", self._variable_callback_name) - - super().destroy() - - def _draw(self, no_color_updates=False): - super()._draw(no_color_updates) - - if self._orientation.lower() == "horizontal": - orientation = "w" - elif self._orientation.lower() == "vertical": - orientation = "s" - else: - orientation = "w" - - if self._mode == "determinate": - requires_recoloring = self._draw_engine.draw_rounded_progress_bar_with_border(self._apply_widget_scaling(self._current_width), - self._apply_widget_scaling(self._current_height), - self._apply_widget_scaling(self._corner_radius), - self._apply_widget_scaling(self._border_width), - 0, - self._determinate_value, - orientation) - else: # indeterminate mode - progress_value = (math.sin(self._indeterminate_value * math.pi / 40) + 1) / 2 - progress_value_1 = min(1.0, progress_value + (self._indeterminate_width / 2)) - progress_value_2 = max(0.0, progress_value - (self._indeterminate_width / 2)) - - requires_recoloring = self._draw_engine.draw_rounded_progress_bar_with_border(self._apply_widget_scaling(self._current_width), - self._apply_widget_scaling(self._current_height), - self._apply_widget_scaling(self._corner_radius), - self._apply_widget_scaling(self._border_width), - progress_value_1, - progress_value_2, - orientation) - - if no_color_updates is False or requires_recoloring: - self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - self._canvas.itemconfig("border_parts", - fill=self._apply_appearance_mode(self._border_color), - outline=self._apply_appearance_mode(self._border_color)) - self._canvas.itemconfig("inner_parts", - fill=self._apply_appearance_mode(self._fg_color), - outline=self._apply_appearance_mode(self._fg_color)) - self._canvas.itemconfig("progress_parts", - fill=self._apply_appearance_mode(self._progress_color), - outline=self._apply_appearance_mode(self._progress_color)) - - def configure(self, require_redraw=False, **kwargs): - if "corner_radius" in kwargs: - self._corner_radius = kwargs.pop("corner_radius") - require_redraw = True - - if "border_width" in kwargs: - self._border_width = kwargs.pop("border_width") - require_redraw = True - - if "fg_color" in kwargs: - self._fg_color = self._check_color_type(kwargs.pop("fg_color")) - require_redraw = True - - if "border_color" in kwargs: - self._border_color = self._check_color_type(kwargs.pop("border_color")) - require_redraw = True - - if "progress_color" in kwargs: - self._progress_color = self._check_color_type(kwargs.pop("progress_color")) - require_redraw = True - - if "variable" in kwargs: - if self._variable is not None: - self._variable.trace_remove("write", self._variable_callback_name) - - self._variable = kwargs.pop("variable") - - if self._variable is not None and self._variable != "": - self._variable_callback_name = self._variable.trace_add("write", self._variable_callback) - self.set(self._variable.get(), from_variable_callback=True) - else: - self._variable = None - - if "mode" in kwargs: - self._mode = kwargs.pop("mode") - require_redraw = True - - if "determinate_speed" in kwargs: - self._determinate_speed = kwargs.pop("determinate_speed") - - if "indeterminate_speed" in kwargs: - self._indeterminate_speed = kwargs.pop("indeterminate_speed") - - super().configure(require_redraw=require_redraw, **kwargs) - - def cget(self, attribute_name: str) -> any: - if attribute_name == "corner_radius": - return self._corner_radius - elif attribute_name == "border_width": - return self._border_width - - elif attribute_name == "fg_color": - return self._fg_color - elif attribute_name == "border_color": - return self._border_color - elif attribute_name == "progress_color": - return self._progress_color - - elif attribute_name == "variable": - return self._variable - elif attribute_name == "orientation": - return self._orientation - elif attribute_name == "mode": - return self._mode - elif attribute_name == "determinate_speed": - return self._determinate_speed - elif attribute_name == "indeterminate_speed": - return self._indeterminate_speed - - else: - return super().cget(attribute_name) - - def _variable_callback(self, var_name, index, mode): - if not self._variable_callback_blocked: - self.set(self._variable.get(), from_variable_callback=True) - - def set(self, value, from_variable_callback=False): - """ set determinate value """ - self._determinate_value = value - - if self._determinate_value > 1: - self._determinate_value = 1 - elif self._determinate_value < 0: - self._determinate_value = 0 - - self._draw(no_color_updates=True) - - if self._variable is not None and not from_variable_callback: - self._variable_callback_blocked = True - self._variable.set(round(self._determinate_value) if isinstance(self._variable, tkinter.IntVar) else self._determinate_value) - self._variable_callback_blocked = False - - def get(self) -> float: - """ get determinate value """ - return self._determinate_value - - def start(self): - """ start automatic mode """ - if not self._loop_running: - self._loop_running = True - self._internal_loop() - - def stop(self): - """ stop automatic mode """ - if self._loop_after_id is not None: - self.after_cancel(self._loop_after_id) - self._loop_running = False - - def _internal_loop(self): - if self._loop_running: - if self._mode == "determinate": - self._determinate_value += self._determinate_speed / 50 - if self._determinate_value > 1: - self._determinate_value -= 1 - self._draw() - self._loop_after_id = self.after(20, self._internal_loop) - else: - self._indeterminate_value += self._indeterminate_speed - self._draw() - self._loop_after_id = self.after(20, self._internal_loop) - - def step(self): - """ increase progress """ - if self._mode == "determinate": - self._determinate_value += self._determinate_speed / 50 - if self._determinate_value > 1: - self._determinate_value -= 1 - self._draw() - else: - self._indeterminate_value += self._indeterminate_speed - self._draw() - - def bind(self, sequence: str = None, command: Callable = None, add: Union[str, bool] = True): - """ called on the tkinter.Canvas """ - if not (add == "+" or add is True): - raise ValueError("'add' argument can only be '+' or True to preserve internal callbacks") - self._canvas.bind(sequence, command, add=True) - - def unbind(self, sequence: str = None, funcid: str = None): - """ called on the tkinter.Label and tkinter.Canvas """ - if funcid is not None: - raise ValueError("'funcid' argument can only be None, because there is a bug in" + - " tkinter and its not clear whether the internal callbacks will be unbinded or not") - self._canvas.unbind(sequence, None) - - def focus(self): - return self._canvas.focus() - - def focus_set(self): - return self._canvas.focus_set() - - def focus_force(self): - return self._canvas.focus_force() diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_radiobutton.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_radiobutton.py deleted file mode 100644 index c07cd1f..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_radiobutton.py +++ /dev/null @@ -1,430 +0,0 @@ -import tkinter -import sys -from typing import Union, Tuple, Callable, Optional, Any - -from .core_rendering import CTkCanvas -from .theme import ThemeManager -from .core_rendering import DrawEngine -from .core_widget_classes import CTkBaseClass -from .font import CTkFont - - -class CTkRadioButton(CTkBaseClass): - """ - Radiobutton with rounded corners, border, label, variable support, command. - For detailed information check out the documentation. - """ - - def __init__(self, - master: Any, - width: int = 100, - height: int = 22, - radiobutton_width: int = 22, - radiobutton_height: int = 22, - corner_radius: Optional[int] = None, - border_width_unchecked: Optional[int] = None, - border_width_checked: Optional[int] = None, - - bg_color: Union[str, Tuple[str, str]] = "transparent", - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - hover_color: Optional[Union[str, Tuple[str, str]]] = None, - border_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color_disabled: Optional[Union[str, Tuple[str, str]]] = None, - - text: str = "CTkRadioButton", - font: Optional[Union[tuple, CTkFont]] = None, - textvariable: Union[tkinter.Variable, None] = None, - variable: Union[tkinter.Variable, None] = None, - value: Union[int, str] = 0, - state: str = tkinter.NORMAL, - hover: bool = True, - command: Union[Callable, Any] = None, - **kwargs): - - # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass - super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) - - # dimensions - self._radiobutton_width = radiobutton_width - self._radiobutton_height = radiobutton_height - - # color - self._fg_color = ThemeManager.theme["CTkRadioButton"]["fg_color"] if fg_color is None else self._check_color_type(fg_color) - self._hover_color = ThemeManager.theme["CTkRadioButton"]["hover_color"] if hover_color is None else self._check_color_type(hover_color) - self._border_color = ThemeManager.theme["CTkRadioButton"]["border_color"] if border_color is None else self._check_color_type(border_color) - - # shape - self._corner_radius = ThemeManager.theme["CTkRadioButton"]["corner_radius"] if corner_radius is None else corner_radius - self._border_width_unchecked = ThemeManager.theme["CTkRadioButton"]["border_width_unchecked"] if border_width_unchecked is None else border_width_unchecked - self._border_width_checked = ThemeManager.theme["CTkRadioButton"]["border_width_checked"] if border_width_checked is None else border_width_checked - - # text - self._text = text - self._text_label: Union[tkinter.Label, None] = None - self._text_color = ThemeManager.theme["CTkRadioButton"]["text_color"] if text_color is None else self._check_color_type(text_color) - self._text_color_disabled = ThemeManager.theme["CTkRadioButton"]["text_color_disabled"] if text_color_disabled is None else self._check_color_type(text_color_disabled) - - # font - self._font = CTkFont() if font is None else self._check_font_type(font) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - # callback and control variables - self._command = command - self._state = state - self._hover = hover - self._check_state: bool = False - self._value = value - self._variable: tkinter.Variable = variable - self._variable_callback_blocked: bool = False - self._textvariable = textvariable - self._variable_callback_name: Union[str, None] = None - - # configure grid system (3x1) - self.grid_columnconfigure(0, weight=0) - self.grid_columnconfigure(1, weight=0, minsize=self._apply_widget_scaling(6)) - self.grid_columnconfigure(2, weight=1) - self.grid_rowconfigure(0, weight=1) - - self._bg_canvas = CTkCanvas(master=self, - highlightthickness=0, - width=self._apply_widget_scaling(self._current_width), - height=self._apply_widget_scaling(self._current_height)) - self._bg_canvas.grid(row=0, column=0, columnspan=3, sticky="nswe") - - self._canvas = CTkCanvas(master=self, - highlightthickness=0, - width=self._apply_widget_scaling(self._radiobutton_width), - height=self._apply_widget_scaling(self._radiobutton_height)) - self._canvas.grid(row=0, column=0) - self._draw_engine = DrawEngine(self._canvas) - - self._text_label = tkinter.Label(master=self, - bd=0, - padx=0, - pady=0, - text=self._text, - justify=tkinter.LEFT, - font=self._apply_font_scaling(self._font), - textvariable=self._textvariable) - self._text_label.grid(row=0, column=2, sticky="w") - self._text_label["anchor"] = "w" - - if self._variable is not None: - self._variable_callback_name = self._variable.trace_add("write", self._variable_callback) - self._check_state = True if self._variable.get() == self._value else False - - self._create_bindings() - self._set_cursor() - self._draw() - - def _create_bindings(self, sequence: Optional[str] = None): - """ set necessary bindings for functionality of widget, will overwrite other bindings """ - if sequence is None or sequence == "": - self._canvas.bind("", self._on_enter) - self._text_label.bind("", self._on_enter) - if sequence is None or sequence == "": - self._canvas.bind("", self._on_leave) - self._text_label.bind("", self._on_leave) - if sequence is None or sequence == "": - self._canvas.bind("", self.invoke) - self._text_label.bind("", self.invoke) - - def _set_scaling(self, *args, **kwargs): - super()._set_scaling(*args, **kwargs) - - self.grid_columnconfigure(1, weight=0, minsize=self._apply_widget_scaling(6)) - self._text_label.configure(font=self._apply_font_scaling(self._font)) - - self._bg_canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._canvas.configure(width=self._apply_widget_scaling(self._radiobutton_width), - height=self._apply_widget_scaling(self._radiobutton_height)) - self._draw(no_color_updates=True) - - def _set_dimensions(self, width: int = None, height: int = None): - super()._set_dimensions(width, height) - - self._bg_canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - - def _update_font(self): - """ pass font to tkinter widgets with applied font scaling and update grid with workaround """ - self._text_label.configure(font=self._apply_font_scaling(self._font)) - - # Workaround to force grid to be resized when text changes size. - # Otherwise grid will lag and only resizes if other mouse action occurs. - self._bg_canvas.grid_forget() - self._bg_canvas.grid(row=0, column=0, columnspan=3, sticky="nswe") - - def destroy(self): - if self._variable is not None: - self._variable.trace_remove("write", self._variable_callback_name) - - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - - super().destroy() - - def _draw(self, no_color_updates=False): - super()._draw(no_color_updates) - - if self._check_state is True: - requires_recoloring = self._draw_engine.draw_rounded_rect_with_border(self._apply_widget_scaling(self._radiobutton_width), - self._apply_widget_scaling(self._radiobutton_height), - self._apply_widget_scaling(self._corner_radius), - self._apply_widget_scaling(self._border_width_checked)) - else: - requires_recoloring = self._draw_engine.draw_rounded_rect_with_border(self._apply_widget_scaling(self._radiobutton_width), - self._apply_widget_scaling(self._radiobutton_height), - self._apply_widget_scaling(self._corner_radius), - self._apply_widget_scaling(self._border_width_unchecked)) - - if no_color_updates is False or requires_recoloring: - self._bg_canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - - if self._check_state is False: - self._canvas.itemconfig("border_parts", - outline=self._apply_appearance_mode(self._border_color), - fill=self._apply_appearance_mode(self._border_color)) - else: - self._canvas.itemconfig("border_parts", - outline=self._apply_appearance_mode(self._fg_color), - fill=self._apply_appearance_mode(self._fg_color)) - - self._canvas.itemconfig("inner_parts", - outline=self._apply_appearance_mode(self._bg_color), - fill=self._apply_appearance_mode(self._bg_color)) - - if self._state == tkinter.DISABLED: - self._text_label.configure(fg=self._apply_appearance_mode(self._text_color_disabled)) - else: - self._text_label.configure(fg=self._apply_appearance_mode(self._text_color)) - - self._text_label.configure(bg=self._apply_appearance_mode(self._bg_color)) - - def configure(self, require_redraw=False, **kwargs): - if "corner_radius" in kwargs: - self._corner_radius = kwargs.pop("corner_radius") - require_redraw = True - - if "border_width_unchecked" in kwargs: - self._border_width_unchecked = kwargs.pop("border_width_unchecked") - require_redraw = True - - if "border_width_checked" in kwargs: - self._border_width_checked = kwargs.pop("border_width_checked") - require_redraw = True - - if "radiobutton_width" in kwargs: - self._radiobutton_width = kwargs.pop("radiobutton_width") - self._canvas.configure(width=self._apply_widget_scaling(self._radiobutton_width)) - require_redraw = True - - if "radiobutton_height" in kwargs: - self._radiobutton_height = kwargs.pop("radiobutton_height") - self._canvas.configure(height=self._apply_widget_scaling(self._radiobutton_height)) - require_redraw = True - - if "text" in kwargs: - self._text = kwargs.pop("text") - self._text_label.configure(text=self._text) - - if "font" in kwargs: - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - self._font = self._check_font_type(kwargs.pop("font")) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - self._update_font() - - if "state" in kwargs: - self._state = kwargs.pop("state") - self._set_cursor() - require_redraw = True - - if "fg_color" in kwargs: - self._fg_color = self._check_color_type(kwargs.pop("fg_color")) - require_redraw = True - - if "hover_color" in kwargs: - self._hover_color = self._check_color_type(kwargs.pop("hover_color")) - require_redraw = True - - if "text_color" in kwargs: - self._text_color = self._check_color_type(kwargs.pop("text_color")) - require_redraw = True - - if "text_color_disabled" in kwargs: - self._text_color_disabled = self._check_color_type(kwargs.pop("text_color_disabled")) - require_redraw = True - - if "border_color" in kwargs: - self._border_color = self._check_color_type(kwargs.pop("border_color")) - require_redraw = True - - if "hover" in kwargs: - self._hover = kwargs.pop("hover") - - if "command" in kwargs: - self._command = kwargs.pop("command") - - if "textvariable" in kwargs: - self._textvariable = kwargs.pop("textvariable") - self._text_label.configure(textvariable=self._textvariable) - - if "variable" in kwargs: - if self._variable is not None: - self._variable.trace_remove("write", self._variable_callback_name) - - self._variable = kwargs.pop("variable") - - if self._variable is not None and self._variable != "": - self._variable_callback_name = self._variable.trace_add("write", self._variable_callback) - self._check_state = True if self._variable.get() == self._value else False - require_redraw = True - - super().configure(require_redraw=require_redraw, **kwargs) - - def cget(self, attribute_name: str) -> any: - if attribute_name == "corner_radius": - return self._corner_radius - elif attribute_name == "border_width_unchecked": - return self._border_width_unchecked - elif attribute_name == "border_width_checked": - return self._border_width_checked - elif attribute_name == "radiobutton_width": - return self._radiobutton_width - elif attribute_name == "radiobutton_height": - return self._radiobutton_height - - elif attribute_name == "fg_color": - return self._fg_color - elif attribute_name == "hover_color": - return self._hover_color - elif attribute_name == "border_color": - return self._border_color - elif attribute_name == "text_color": - return self._text_color - elif attribute_name == "text_color_disabled": - return self._text_color_disabled - - elif attribute_name == "text": - return self._text - elif attribute_name == "font": - return self._font - elif attribute_name == "textvariable": - return self._textvariable - elif attribute_name == "variable": - return self._variable - elif attribute_name == "value": - return self._value - elif attribute_name == "state": - return self._state - elif attribute_name == "hover": - return self._hover - elif attribute_name == "command": - return self._command - - else: - return super().cget(attribute_name) - - def _set_cursor(self): - if self._cursor_manipulation_enabled: - if self._state == tkinter.DISABLED: - if sys.platform == "darwin": - self._canvas.configure(cursor="arrow") - if self._text_label is not None: - self._text_label.configure(cursor="arrow") - elif sys.platform.startswith("win"): - self._canvas.configure(cursor="arrow") - if self._text_label is not None: - self._text_label.configure(cursor="arrow") - - elif self._state == tkinter.NORMAL: - if sys.platform == "darwin": - self._canvas.configure(cursor="pointinghand") - if self._text_label is not None: - self._text_label.configure(cursor="pointinghand") - elif sys.platform.startswith("win"): - self._canvas.configure(cursor="hand2") - if self._text_label is not None: - self._text_label.configure(cursor="hand2") - - def _on_enter(self, event=0): - if self._hover is True and self._state == tkinter.NORMAL: - self._canvas.itemconfig("border_parts", - fill=self._apply_appearance_mode(self._hover_color), - outline=self._apply_appearance_mode(self._hover_color)) - - def _on_leave(self, event=0): - if self._check_state is True: - self._canvas.itemconfig("border_parts", - fill=self._apply_appearance_mode(self._fg_color), - outline=self._apply_appearance_mode(self._fg_color)) - else: - self._canvas.itemconfig("border_parts", - fill=self._apply_appearance_mode(self._border_color), - outline=self._apply_appearance_mode(self._border_color)) - - def _variable_callback(self, var_name, index, mode): - if not self._variable_callback_blocked: - if self._variable.get() == self._value: - self.select(from_variable_callback=True) - else: - self.deselect(from_variable_callback=True) - - def invoke(self, event=0): - if self._state == tkinter.NORMAL: - if self._check_state is False: - self._check_state = True - self.select() - - if self._command is not None: - self._command() - - def select(self, from_variable_callback=False): - self._check_state = True - self._draw() - - if self._variable is not None and not from_variable_callback: - self._variable_callback_blocked = True - self._variable.set(self._value) - self._variable_callback_blocked = False - - def deselect(self, from_variable_callback=False): - self._check_state = False - self._draw() - - if self._variable is not None and not from_variable_callback: - self._variable_callback_blocked = True - self._variable.set("") - self._variable_callback_blocked = False - - def bind(self, sequence: str = None, command: Callable = None, add: Union[str, bool] = True): - """ called on the tkinter.Canvas """ - if not (add == "+" or add is True): - raise ValueError("'add' argument can only be '+' or True to preserve internal callbacks") - self._canvas.bind(sequence, command, add=True) - self._text_label.bind(sequence, command, add=True) - - def unbind(self, sequence: str = None, funcid: str = None): - """ called on the tkinter.Label and tkinter.Canvas """ - if funcid is not None: - raise ValueError("'funcid' argument can only be None, because there is a bug in" + - " tkinter and its not clear whether the internal callbacks will be unbinded or not") - self._canvas.unbind(sequence, None) - self._text_label.unbind(sequence, None) - self._create_bindings(sequence=sequence) # restore internal callbacks for sequence - - def focus(self): - return self._text_label.focus() - - def focus_set(self): - return self._text_label.focus_set() - - def focus_force(self): - return self._text_label.focus_force() diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_scrollable_frame.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_scrollable_frame.py deleted file mode 100644 index eede091..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_scrollable_frame.py +++ /dev/null @@ -1,316 +0,0 @@ -from typing import Union, Tuple, Optional, Any -try: - from typing import Literal -except ImportError: - from typing_extensions import Literal -import tkinter -import sys - -from .ctk_frame import CTkFrame -from .ctk_scrollbar import CTkScrollbar -from .appearance_mode import CTkAppearanceModeBaseClass -from .scaling import CTkScalingBaseClass -from .core_widget_classes import CTkBaseClass -from .ctk_label import CTkLabel -from .font import CTkFont -from .theme import ThemeManager - - -class CTkScrollableFrame(tkinter.Frame, CTkAppearanceModeBaseClass, CTkScalingBaseClass): - def __init__(self, - master: Any, - width: int = 200, - height: int = 200, - corner_radius: Optional[Union[int, str]] = None, - border_width: Optional[Union[int, str]] = None, - - bg_color: Union[str, Tuple[str, str]] = "transparent", - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - border_color: Optional[Union[str, Tuple[str, str]]] = None, - scrollbar_fg_color: Optional[Union[str, Tuple[str, str]]] = None, - scrollbar_button_color: Optional[Union[str, Tuple[str, str]]] = None, - scrollbar_button_hover_color: Optional[Union[str, Tuple[str, str]]] = None, - label_fg_color: Optional[Union[str, Tuple[str, str]]] = None, - label_text_color: Optional[Union[str, Tuple[str, str]]] = None, - - label_text: str = "", - label_font: Optional[Union[tuple, CTkFont]] = None, - label_anchor: str = "center", - orientation: Literal["vertical", "horizontal"] = "vertical"): - - self._orientation = orientation - - # dimensions independent of scaling - self._desired_width = width # _desired_width and _desired_height, represent desired size set by width and height - self._desired_height = height - - self._parent_frame = CTkFrame(master=master, width=0, height=0, corner_radius=corner_radius, - border_width=border_width, bg_color=bg_color, fg_color=fg_color, border_color=border_color) - self._parent_canvas = tkinter.Canvas(master=self._parent_frame, highlightthickness=0) - self._set_scroll_increments() - - if self._orientation == "horizontal": - self._scrollbar = CTkScrollbar(master=self._parent_frame, orientation="horizontal", command=self._parent_canvas.xview, - fg_color=scrollbar_fg_color, button_color=scrollbar_button_color, button_hover_color=scrollbar_button_hover_color) - self._parent_canvas.configure(xscrollcommand=self._scrollbar.set) - elif self._orientation == "vertical": - self._scrollbar = CTkScrollbar(master=self._parent_frame, orientation="vertical", command=self._parent_canvas.yview, - fg_color=scrollbar_fg_color, button_color=scrollbar_button_color, button_hover_color=scrollbar_button_hover_color) - self._parent_canvas.configure(yscrollcommand=self._scrollbar.set) - - self._label_text = label_text - self._label = CTkLabel(self._parent_frame, text=label_text, anchor=label_anchor, font=label_font, - corner_radius=self._parent_frame.cget("corner_radius"), text_color=label_text_color, - fg_color=ThemeManager.theme["CTkScrollableFrame"]["label_fg_color"] if label_fg_color is None else label_fg_color) - - tkinter.Frame.__init__(self, master=self._parent_canvas, highlightthickness=0) - CTkAppearanceModeBaseClass.__init__(self) - CTkScalingBaseClass.__init__(self, scaling_type="widget") - - self._create_grid() - - self._parent_canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - - self.bind("", lambda e: self._parent_canvas.configure(scrollregion=self._parent_canvas.bbox("all"))) - self._parent_canvas.bind("", self._fit_frame_dimensions_to_canvas) - self.bind_all("", self._mouse_wheel_all, add="+") - self.bind_all("", self._keyboard_shift_press_all, add="+") - self.bind_all("", self._keyboard_shift_press_all, add="+") - self.bind_all("", self._keyboard_shift_release_all, add="+") - self.bind_all("", self._keyboard_shift_release_all, add="+") - self._create_window_id = self._parent_canvas.create_window(0, 0, window=self, anchor="nw") - - if self._parent_frame.cget("fg_color") == "transparent": - tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) - self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) - else: - tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) - self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) - - self._shift_pressed = False - - def destroy(self): - tkinter.Frame.destroy(self) - CTkAppearanceModeBaseClass.destroy(self) - CTkScalingBaseClass.destroy(self) - - def _create_grid(self): - border_spacing = self._apply_widget_scaling(self._parent_frame.cget("corner_radius") + self._parent_frame.cget("border_width")) - - if self._orientation == "horizontal": - self._parent_frame.grid_columnconfigure(0, weight=1) - self._parent_frame.grid_rowconfigure(1, weight=1) - self._parent_canvas.grid(row=1, column=0, sticky="nsew", padx=border_spacing, pady=(border_spacing, 0)) - self._scrollbar.grid(row=2, column=0, sticky="nsew", padx=border_spacing) - - if self._label_text is not None and self._label_text != "": - self._label.grid(row=0, column=0, sticky="ew", padx=border_spacing, pady=border_spacing) - else: - self._label.grid_forget() - - elif self._orientation == "vertical": - self._parent_frame.grid_columnconfigure(0, weight=1) - self._parent_frame.grid_rowconfigure(1, weight=1) - self._parent_canvas.grid(row=1, column=0, sticky="nsew", padx=(border_spacing, 0), pady=border_spacing) - self._scrollbar.grid(row=1, column=1, sticky="nsew", pady=border_spacing) - - if self._label_text is not None and self._label_text != "": - self._label.grid(row=0, column=0, columnspan=2, sticky="ew", padx=border_spacing, pady=border_spacing) - else: - self._label.grid_forget() - - def _set_appearance_mode(self, mode_string): - super()._set_appearance_mode(mode_string) - - if self._parent_frame.cget("fg_color") == "transparent": - tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) - self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) - else: - tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) - self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) - - def _set_scaling(self, new_widget_scaling, new_window_scaling): - super()._set_scaling(new_widget_scaling, new_window_scaling) - - self._parent_canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - - def _set_dimensions(self, width=None, height=None): - if width is not None: - self._desired_width = width - if height is not None: - self._desired_height = height - - self._parent_canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - - def configure(self, **kwargs): - if "width" in kwargs: - self._set_dimensions(width=kwargs.pop("width")) - - if "height" in kwargs: - self._set_dimensions(height=kwargs.pop("height")) - - if "corner_radius" in kwargs: - new_corner_radius = kwargs.pop("corner_radius") - self._parent_frame.configure(corner_radius=new_corner_radius) - if self._label is not None: - self._label.configure(corner_radius=new_corner_radius) - self._create_grid() - - if "border_width" in kwargs: - self._parent_frame.configure(border_width=kwargs.pop("border_width")) - self._create_grid() - - if "fg_color" in kwargs: - self._parent_frame.configure(fg_color=kwargs.pop("fg_color")) - - if self._parent_frame.cget("fg_color") == "transparent": - tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) - self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("bg_color"))) - else: - tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) - self._parent_canvas.configure(bg=self._apply_appearance_mode(self._parent_frame.cget("fg_color"))) - - for child in self.winfo_children(): - if isinstance(child, CTkBaseClass): - child.configure(bg_color=self._parent_frame.cget("fg_color")) - - if "scrollbar_fg_color" in kwargs: - self._scrollbar.configure(fg_color=kwargs.pop("scrollbar_fg_color")) - - if "scrollbar_button_color" in kwargs: - self._scrollbar.configure(button_color=kwargs.pop("scrollbar_button_color")) - - if "scrollbar_button_hover_color" in kwargs: - self._scrollbar.configure(button_hover_color=kwargs.pop("scrollbar_button_hover_color")) - - if "label_text" in kwargs: - self._label_text = kwargs.pop("label_text") - self._label.configure(text=self._label_text) - self._create_grid() - - if "label_font" in kwargs: - self._label.configure(font=kwargs.pop("label_font")) - - if "label_text_color" in kwargs: - self._label.configure(text_color=kwargs.pop("label_text_color")) - - if "label_fg_color" in kwargs: - self._label.configure(fg_color=kwargs.pop("label_fg_color")) - - if "label_anchor" in kwargs: - self._label.configure(anchor=kwargs.pop("label_anchor")) - - self._parent_frame.configure(**kwargs) - - def cget(self, attribute_name: str): - if attribute_name == "width": - return self._desired_width - elif attribute_name == "height": - return self._desired_height - - elif attribute_name == "label_text": - return self._label_text - elif attribute_name == "label_font": - return self._label.cget("font") - elif attribute_name == "label_text_color": - return self._label.cget("_text_color") - elif attribute_name == "label_fg_color": - return self._label.cget("fg_color") - elif attribute_name == "label_anchor": - return self._label.cget("anchor") - - elif attribute_name.startswith("scrollbar_fg_color"): - return self._scrollbar.cget("fg_color") - elif attribute_name.startswith("scrollbar_button_color"): - return self._scrollbar.cget("button_color") - elif attribute_name.startswith("scrollbar_button_hover_color"): - return self._scrollbar.cget("button_hover_color") - - else: - return self._parent_frame.cget(attribute_name) - - def _fit_frame_dimensions_to_canvas(self, event): - if self._orientation == "horizontal": - self._parent_canvas.itemconfigure(self._create_window_id, height=self._parent_canvas.winfo_height()) - elif self._orientation == "vertical": - self._parent_canvas.itemconfigure(self._create_window_id, width=self._parent_canvas.winfo_width()) - - def _set_scroll_increments(self): - if sys.platform.startswith("win"): - self._parent_canvas.configure(xscrollincrement=1, yscrollincrement=1) - elif sys.platform == "darwin": - self._parent_canvas.configure(xscrollincrement=4, yscrollincrement=8) - - def _mouse_wheel_all(self, event): - if self.check_if_master_is_canvas(event.widget): - if sys.platform.startswith("win"): - if self._shift_pressed: - if self._parent_canvas.xview() != (0.0, 1.0): - self._parent_canvas.xview("scroll", -int(event.delta / 6), "units") - else: - if self._parent_canvas.yview() != (0.0, 1.0): - self._parent_canvas.yview("scroll", -int(event.delta / 6), "units") - elif sys.platform == "darwin": - if self._shift_pressed: - if self._parent_canvas.xview() != (0.0, 1.0): - self._parent_canvas.xview("scroll", -event.delta, "units") - else: - if self._parent_canvas.yview() != (0.0, 1.0): - self._parent_canvas.yview("scroll", -event.delta, "units") - else: - if self._shift_pressed: - if self._parent_canvas.xview() != (0.0, 1.0): - self._parent_canvas.xview("scroll", -event.delta, "units") - else: - if self._parent_canvas.yview() != (0.0, 1.0): - self._parent_canvas.yview("scroll", -event.delta, "units") - - def _keyboard_shift_press_all(self, event): - self._shift_pressed = True - - def _keyboard_shift_release_all(self, event): - self._shift_pressed = False - - def check_if_master_is_canvas(self, widget): - if widget == self._parent_canvas: - return True - elif widget.master is not None: - return self.check_if_master_is_canvas(widget.master) - else: - return False - - def pack(self, **kwargs): - self._parent_frame.pack(**kwargs) - - def place(self, **kwargs): - self._parent_frame.place(**kwargs) - - def grid(self, **kwargs): - self._parent_frame.grid(**kwargs) - - def pack_forget(self): - self._parent_frame.pack_forget() - - def place_forget(self, **kwargs): - self._parent_frame.place_forget() - - def grid_forget(self, **kwargs): - self._parent_frame.grid_forget() - - def grid_remove(self, **kwargs): - self._parent_frame.grid_remove() - - def grid_propagate(self, **kwargs): - self._parent_frame.grid_propagate() - - def grid_info(self, **kwargs): - return self._parent_frame.grid_info() - - def lift(self, aboveThis=None): - self._parent_frame.lift(aboveThis) - - def lower(self, belowThis=None): - self._parent_frame.lower(belowThis) diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_scrollbar.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_scrollbar.py deleted file mode 100644 index 8e96221..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_scrollbar.py +++ /dev/null @@ -1,281 +0,0 @@ -import sys -from typing import Union, Tuple, Callable, Optional, Any - -from .core_rendering import CTkCanvas -from .theme import ThemeManager -from .core_rendering import DrawEngine -from .core_widget_classes import CTkBaseClass - - -class CTkScrollbar(CTkBaseClass): - """ - Scrollbar with rounded corners, configurable spacing. - Connect to scrollable widget by passing .set() method and set command attribute. - For detailed information check out the documentation. - """ - - def __init__(self, - master: Any, - width: Optional[Union[int, str]] = None, - height: Optional[Union[int, str]] = None, - corner_radius: Optional[int] = None, - border_spacing: Optional[int] = None, - minimum_pixel_length: int = 20, - - bg_color: Union[str, Tuple[str, str]] = "transparent", - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - button_color: Optional[Union[str, Tuple[str, str]]] = None, - button_hover_color: Optional[Union[str, Tuple[str, str]]] = None, - - hover: bool = True, - command: Union[Callable, Any] = None, - orientation: str = "vertical", - **kwargs): - - # set default dimensions according to orientation - if width is None: - if orientation.lower() == "vertical": - width = 16 - else: - width = 200 - if height is None: - if orientation.lower() == "horizontal": - height = 16 - else: - height = 200 - - # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass - super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) - - # color - self._fg_color = ThemeManager.theme["CTkScrollbar"]["fg_color"] if fg_color is None else self._check_color_type(fg_color, transparency=True) - self._button_color = ThemeManager.theme["CTkScrollbar"]["button_color"] if button_color is None else self._check_color_type(button_color) - self._button_hover_color = ThemeManager.theme["CTkScrollbar"]["button_hover_color"] if button_hover_color is None else self._check_color_type(button_hover_color) - - # shape - self._corner_radius = ThemeManager.theme["CTkScrollbar"]["corner_radius"] if corner_radius is None else corner_radius - self._border_spacing = ThemeManager.theme["CTkScrollbar"]["border_spacing"] if border_spacing is None else border_spacing - - self._hover = hover - self._hover_state: bool = False - self._command = command - self._orientation = orientation - self._start_value: float = 0 # 0 to 1 - self._end_value: float = 1 # 0 to 1 - self._minimum_pixel_length = minimum_pixel_length - - self._canvas = CTkCanvas(master=self, - highlightthickness=0, - width=self._apply_widget_scaling(self._current_width), - height=self._apply_widget_scaling(self._current_height)) - self._canvas.place(x=0, y=0, relwidth=1, relheight=1) - self._draw_engine = DrawEngine(self._canvas) - - self._create_bindings() - self._draw() - - def _create_bindings(self, sequence: Optional[str] = None): - """ set necessary bindings for functionality of widget, will overwrite other bindings """ - if sequence is None: - self._canvas.tag_bind("border_parts", "", self._clicked) - if sequence is None or sequence == "": - self._canvas.bind("", self._on_enter) - if sequence is None or sequence == "": - self._canvas.bind("", self._on_leave) - if sequence is None or sequence == "": - self._canvas.bind("", self._clicked) - if sequence is None or sequence == "": - self._canvas.bind("", self._mouse_scroll_event) - - def _set_scaling(self, *args, **kwargs): - super()._set_scaling(*args, **kwargs) - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._draw(no_color_updates=True) - - def _set_dimensions(self, width=None, height=None): - super()._set_dimensions(width, height) - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._draw(no_color_updates=True) - - def _get_scrollbar_values_for_minimum_pixel_size(self): - # correct scrollbar float values if scrollbar is too small - if self._orientation == "vertical": - scrollbar_pixel_length = (self._end_value - self._start_value) * self._current_height - if scrollbar_pixel_length < self._minimum_pixel_length and -scrollbar_pixel_length + self._current_height != 0: - # calculate how much to increase the float interval values so that the scrollbar width is self.minimum_pixel_length - interval_extend_factor = (-scrollbar_pixel_length + self._minimum_pixel_length) / (-scrollbar_pixel_length + self._current_height) - corrected_end_value = self._end_value + (1 - self._end_value) * interval_extend_factor - corrected_start_value = self._start_value - self._start_value * interval_extend_factor - return corrected_start_value, corrected_end_value - else: - return self._start_value, self._end_value - - else: - scrollbar_pixel_length = (self._end_value - self._start_value) * self._current_width - if scrollbar_pixel_length < self._minimum_pixel_length and -scrollbar_pixel_length + self._current_width != 0: - # calculate how much to increase the float interval values so that the scrollbar width is self.minimum_pixel_length - interval_extend_factor = (-scrollbar_pixel_length + self._minimum_pixel_length) / (-scrollbar_pixel_length + self._current_width) - corrected_end_value = self._end_value + (1 - self._end_value) * interval_extend_factor - corrected_start_value = self._start_value - self._start_value * interval_extend_factor - return corrected_start_value, corrected_end_value - else: - return self._start_value, self._end_value - - def _draw(self, no_color_updates=False): - super()._draw(no_color_updates) - - corrected_start_value, corrected_end_value = self._get_scrollbar_values_for_minimum_pixel_size() - requires_recoloring = self._draw_engine.draw_rounded_scrollbar(self._apply_widget_scaling(self._current_width), - self._apply_widget_scaling(self._current_height), - self._apply_widget_scaling(self._corner_radius), - self._apply_widget_scaling(self._border_spacing), - corrected_start_value, - corrected_end_value, - self._orientation) - - if no_color_updates is False or requires_recoloring: - if self._hover_state is True: - self._canvas.itemconfig("scrollbar_parts", - fill=self._apply_appearance_mode(self._button_hover_color), - outline=self._apply_appearance_mode(self._button_hover_color)) - else: - self._canvas.itemconfig("scrollbar_parts", - fill=self._apply_appearance_mode(self._button_color), - outline=self._apply_appearance_mode(self._button_color)) - - if self._fg_color == "transparent": - self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - self._canvas.itemconfig("border_parts", - fill=self._apply_appearance_mode(self._bg_color), - outline=self._apply_appearance_mode(self._bg_color)) - else: - self._canvas.configure(bg=self._apply_appearance_mode(self._fg_color)) - self._canvas.itemconfig("border_parts", - fill=self._apply_appearance_mode(self._fg_color), - outline=self._apply_appearance_mode(self._fg_color)) - - self._canvas.update_idletasks() - - def configure(self, require_redraw=False, **kwargs): - if "fg_color" in kwargs: - self._fg_color = self._check_color_type(kwargs.pop("fg_color"), transparency=True) - require_redraw = True - - if "button_color" in kwargs: - self._button_color = self._check_color_type(kwargs.pop("button_color")) - require_redraw = True - - if "button_hover_color" in kwargs: - self._button_hover_color = self._check_color_type(kwargs.pop("button_hover_color")) - require_redraw = True - - if "hover" in kwargs: - self._hover = kwargs.pop("hover") - - if "command" in kwargs: - self._command = kwargs.pop("command") - - if "corner_radius" in kwargs: - self._corner_radius = kwargs.pop("corner_radius") - require_redraw = True - - if "border_spacing" in kwargs: - self._border_spacing = kwargs.pop("border_spacing") - require_redraw = True - - super().configure(require_redraw=require_redraw, **kwargs) - - def cget(self, attribute_name: str) -> any: - if attribute_name == "corner_radius": - return self._corner_radius - elif attribute_name == "border_spacing": - return self._border_spacing - elif attribute_name == "minimum_pixel_length": - return self._minimum_pixel_length - - elif attribute_name == "fg_color": - return self._fg_color - elif attribute_name == "scrollbar_color": - return self._button_color - elif attribute_name == "scrollbar_hover_color": - return self._button_hover_color - - elif attribute_name == "hover": - return self._hover - elif attribute_name == "command": - return self._command - elif attribute_name == "orientation": - return self._orientation - - else: - return super().cget(attribute_name) - - def _on_enter(self, event=0): - if self._hover is True: - self._hover_state = True - self._canvas.itemconfig("scrollbar_parts", - outline=self._apply_appearance_mode(self._button_hover_color), - fill=self._apply_appearance_mode(self._button_hover_color)) - - def _on_leave(self, event=0): - self._hover_state = False - self._canvas.itemconfig("scrollbar_parts", - outline=self._apply_appearance_mode(self._button_color), - fill=self._apply_appearance_mode(self._button_color)) - - def _clicked(self, event): - if self._orientation == "vertical": - value = self._reverse_widget_scaling(((event.y - self._border_spacing) / (self._current_height - 2 * self._border_spacing))) - else: - value = self._reverse_widget_scaling(((event.x - self._border_spacing) / (self._current_width - 2 * self._border_spacing))) - - current_scrollbar_length = self._end_value - self._start_value - value = max(current_scrollbar_length / 2, min(value, 1 - (current_scrollbar_length / 2))) - self._start_value = value - (current_scrollbar_length / 2) - self._end_value = value + (current_scrollbar_length / 2) - self._draw() - - if self._command is not None: - self._command('moveto', self._start_value) - - def _mouse_scroll_event(self, event=None): - if self._command is not None: - if sys.platform.startswith("win"): - self._command('scroll', -int(event.delta/40), 'units') - else: - self._command('scroll', -event.delta, 'units') - - def set(self, start_value: float, end_value: float): - self._start_value = float(start_value) - self._end_value = float(end_value) - self._draw() - - def get(self): - return self._start_value, self._end_value - - def bind(self, sequence=None, command=None, add=True): - """ called on the tkinter.Canvas """ - if not (add == "+" or add is True): - raise ValueError("'add' argument can only be '+' or True to preserve internal callbacks") - self._canvas.bind(sequence, command, add=True) - - def unbind(self, sequence=None, funcid=None): - """ called on the tkinter.Canvas, restores internal callbacks """ - if funcid is not None: - raise ValueError("'funcid' argument can only be None, because there is a bug in" + - " tkinter and its not clear whether the internal callbacks will be unbinded or not") - self._canvas.unbind(sequence, None) # unbind all callbacks for sequence - self._create_bindings(sequence=sequence) # restore internal callbacks for sequence - - def focus(self): - return self._canvas.focus() - - def focus_set(self): - return self._canvas.focus_set() - - def focus_force(self): - return self._canvas.focus_force() diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_segmented_button.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_segmented_button.py deleted file mode 100644 index b8de1e7..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_segmented_button.py +++ /dev/null @@ -1,447 +0,0 @@ -import tkinter -import copy -from typing import Union, Tuple, List, Dict, Callable, Optional, Any -try: - from typing import Literal -except ImportError: - from typing_extensions import Literal - -from .theme import ThemeManager -from .font import CTkFont -from .ctk_button import CTkButton -from .ctk_frame import CTkFrame -from .utility import check_kwargs_empty - - -class CTkSegmentedButton(CTkFrame): - """ - Segmented button with corner radius, border width, variable support. - For detailed information check out the documentation. - """ - - def __init__(self, - master: Any, - width: int = 140, - height: int = 28, - corner_radius: Optional[int] = None, - border_width: int = 3, - - bg_color: Union[str, Tuple[str, str]] = "transparent", - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - selected_color: Optional[Union[str, Tuple[str, str]]] = None, - selected_hover_color: Optional[Union[str, Tuple[str, str]]] = None, - unselected_color: Optional[Union[str, Tuple[str, str]]] = None, - unselected_hover_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color_disabled: Optional[Union[str, Tuple[str, str]]] = None, - background_corner_colors: Union[Tuple[Union[str, Tuple[str, str]]], None] = None, - - font: Optional[Union[tuple, CTkFont]] = None, - values: Optional[list] = None, - variable: Union[tkinter.Variable, None] = None, - dynamic_resizing: bool = True, - command: Union[Callable[[str], Any], None] = None, - state: str = "normal"): - - super().__init__(master=master, bg_color=bg_color, width=width, height=height) - - self._sb_fg_color = ThemeManager.theme["CTkSegmentedButton"]["fg_color"] if fg_color is None else self._check_color_type(fg_color) - - self._sb_selected_color = ThemeManager.theme["CTkSegmentedButton"]["selected_color"] if selected_color is None else self._check_color_type(selected_color) - self._sb_selected_hover_color = ThemeManager.theme["CTkSegmentedButton"]["selected_hover_color"] if selected_hover_color is None else self._check_color_type(selected_hover_color) - - self._sb_unselected_color = ThemeManager.theme["CTkSegmentedButton"]["unselected_color"] if unselected_color is None else self._check_color_type(unselected_color) - self._sb_unselected_hover_color = ThemeManager.theme["CTkSegmentedButton"]["unselected_hover_color"] if unselected_hover_color is None else self._check_color_type(unselected_hover_color) - - self._sb_text_color = ThemeManager.theme["CTkSegmentedButton"]["text_color"] if text_color is None else self._check_color_type(text_color) - self._sb_text_color_disabled = ThemeManager.theme["CTkSegmentedButton"]["text_color_disabled"] if text_color_disabled is None else self._check_color_type(text_color_disabled) - - self._sb_corner_radius = ThemeManager.theme["CTkSegmentedButton"]["corner_radius"] if corner_radius is None else corner_radius - self._sb_border_width = ThemeManager.theme["CTkSegmentedButton"]["border_width"] if border_width is None else border_width - - self._background_corner_colors = background_corner_colors # rendering options for DrawEngine - - self._command: Callable[[str], None] = command - self._font = CTkFont() if font is None else font - self._state = state - - self._buttons_dict: Dict[str, CTkButton] = {} # mapped from value to button object - if values is None: - self._value_list: List[str] = ["CTkSegmentedButton"] - else: - self._value_list: List[str] = values # Values ordered like buttons rendered on widget - - self._dynamic_resizing = dynamic_resizing - if not self._dynamic_resizing: - self.grid_propagate(False) - - self._check_unique_values(self._value_list) - self._current_value: str = "" - if len(self._value_list) > 0: - self._create_buttons_from_values() - self._create_button_grid() - - self._variable = variable - self._variable_callback_blocked: bool = False - self._variable_callback_name: Union[str, None] = None - - if self._variable is not None: - self._variable_callback_name = self._variable.trace_add("write", self._variable_callback) - self.set(self._variable.get(), from_variable_callback=True) - - super().configure(corner_radius=self._sb_corner_radius, fg_color="transparent") - - def destroy(self): - if self._variable is not None: # remove old callback - self._variable.trace_remove("write", self._variable_callback_name) - - super().destroy() - - def _set_dimensions(self, width: int = None, height: int = None): - super()._set_dimensions(width, height) - - for button in self._buttons_dict.values(): - button.configure(height=height) - - def _variable_callback(self, var_name, index, mode): - if not self._variable_callback_blocked: - self.set(self._variable.get(), from_variable_callback=True) - - def _get_index_by_value(self, value: str): - for index, value_from_list in enumerate(self._value_list): - if value_from_list == value: - return index - - raise ValueError(f"CTkSegmentedButton does not contain value '{value}'") - - def _configure_button_corners_for_index(self, index: int): - if index == 0 and len(self._value_list) == 1: - if self._background_corner_colors is None: - self._buttons_dict[self._value_list[index]].configure(background_corner_colors=(self._bg_color, self._bg_color, self._bg_color, self._bg_color)) - else: - self._buttons_dict[self._value_list[index]].configure(background_corner_colors=self._background_corner_colors) - - elif index == 0: - if self._background_corner_colors is None: - self._buttons_dict[self._value_list[index]].configure(background_corner_colors=(self._bg_color, self._sb_fg_color, self._sb_fg_color, self._bg_color)) - else: - self._buttons_dict[self._value_list[index]].configure(background_corner_colors=(self._background_corner_colors[0], self._sb_fg_color, self._sb_fg_color, self._background_corner_colors[3])) - - elif index == len(self._value_list) - 1: - if self._background_corner_colors is None: - self._buttons_dict[self._value_list[index]].configure(background_corner_colors=(self._sb_fg_color, self._bg_color, self._bg_color, self._sb_fg_color)) - else: - self._buttons_dict[self._value_list[index]].configure(background_corner_colors=(self._sb_fg_color, self._background_corner_colors[1], self._background_corner_colors[2], self._sb_fg_color)) - - else: - self._buttons_dict[self._value_list[index]].configure(background_corner_colors=(self._sb_fg_color, self._sb_fg_color, self._sb_fg_color, self._sb_fg_color)) - - def _unselect_button_by_value(self, value: str): - if value in self._buttons_dict: - self._buttons_dict[value].configure(fg_color=self._sb_unselected_color, - hover_color=self._sb_unselected_hover_color) - - def _select_button_by_value(self, value: str): - if self._current_value is not None and self._current_value != "": - self._unselect_button_by_value(self._current_value) - - self._current_value = value - - self._buttons_dict[value].configure(fg_color=self._sb_selected_color, - hover_color=self._sb_selected_hover_color) - - def _create_button(self, index: int, value: str) -> CTkButton: - new_button = CTkButton(self, - width=0, - height=self._current_height, - corner_radius=self._sb_corner_radius, - border_width=self._sb_border_width, - fg_color=self._sb_unselected_color, - border_color=self._sb_fg_color, - hover_color=self._sb_unselected_hover_color, - text_color=self._sb_text_color, - text_color_disabled=self._sb_text_color_disabled, - text=value, - font=self._font, - state=self._state, - command=lambda v=value: self.set(v, from_button_callback=True), - background_corner_colors=None, - round_width_to_even_numbers=False, - round_height_to_even_numbers=False) # DrawEngine rendering option (so that theres no gap between buttons) - - return new_button - - @staticmethod - def _check_unique_values(values: List[str]): - """ raises exception if values are not unique """ - if len(values) != len(set(values)): - raise ValueError("CTkSegmentedButton values are not unique") - - def _create_button_grid(self): - # remove minsize from every grid cell in the first row - number_of_columns, _ = self.grid_size() - for n in range(number_of_columns): - self.grid_columnconfigure(n, weight=1, minsize=0) - self.grid_rowconfigure(0, weight=1) - - for index, value in enumerate(self._value_list): - self.grid_columnconfigure(index, weight=1, minsize=self._current_height) - self._buttons_dict[value].grid(row=0, column=index, sticky="nsew") - - def _create_buttons_from_values(self): - assert len(self._buttons_dict) == 0 - assert len(self._value_list) > 0 - - for index, value in enumerate(self._value_list): - self._buttons_dict[value] = self._create_button(index, value) - self._configure_button_corners_for_index(index) - - def configure(self, **kwargs): - if "width" in kwargs: - super().configure(width=kwargs.pop("width")) - - if "height" in kwargs: - super().configure(height=kwargs.pop("height")) - - if "corner_radius" in kwargs: - self._sb_corner_radius = kwargs.pop("corner_radius") - super().configure(corner_radius=self._sb_corner_radius) - for button in self._buttons_dict.values(): - button.configure(corner_radius=self._sb_corner_radius) - - if "border_width" in kwargs: - self._sb_border_width = kwargs.pop("border_width") - for button in self._buttons_dict.values(): - button.configure(border_width=self._sb_border_width) - - if "bg_color" in kwargs: - super().configure(bg_color=kwargs.pop("bg_color")) - - if len(self._buttons_dict) > 0: - self._configure_button_corners_for_index(0) - if len(self._buttons_dict) > 1: - max_index = len(self._buttons_dict) - 1 - self._configure_button_corners_for_index(max_index) - - if "fg_color" in kwargs: - self._sb_fg_color = self._check_color_type(kwargs.pop("fg_color")) - for index, button in enumerate(self._buttons_dict.values()): - button.configure(border_color=self._sb_fg_color) - self._configure_button_corners_for_index(index) - - if "selected_color" in kwargs: - self._sb_selected_color = self._check_color_type(kwargs.pop("selected_color")) - if self._current_value in self._buttons_dict: - self._buttons_dict[self._current_value].configure(fg_color=self._sb_selected_color) - - if "selected_hover_color" in kwargs: - self._sb_selected_hover_color = self._check_color_type(kwargs.pop("selected_hover_color")) - if self._current_value in self._buttons_dict: - self._buttons_dict[self._current_value].configure(hover_color=self._sb_selected_hover_color) - - if "unselected_color" in kwargs: - self._sb_unselected_color = self._check_color_type(kwargs.pop("unselected_color")) - for value, button in self._buttons_dict.items(): - if value != self._current_value: - button.configure(fg_color=self._sb_unselected_color) - - if "unselected_hover_color" in kwargs: - self._sb_unselected_hover_color = self._check_color_type(kwargs.pop("unselected_hover_color")) - for value, button in self._buttons_dict.items(): - if value != self._current_value: - button.configure(hover_color=self._sb_unselected_hover_color) - - if "text_color" in kwargs: - self._sb_text_color = self._check_color_type(kwargs.pop("text_color")) - for button in self._buttons_dict.values(): - button.configure(text_color=self._sb_text_color) - - if "text_color_disabled" in kwargs: - self._sb_text_color_disabled = self._check_color_type(kwargs.pop("text_color_disabled")) - for button in self._buttons_dict.values(): - button.configure(text_color_disabled=self._sb_text_color_disabled) - - if "background_corner_colors" in kwargs: - self._background_corner_colors = kwargs.pop("background_corner_colors") - for i in range(len(self._buttons_dict)): - self._configure_button_corners_for_index(i) - - if "font" in kwargs: - self._font = kwargs.pop("font") - for button in self._buttons_dict.values(): - button.configure(font=self._font) - - if "values" in kwargs: - for button in self._buttons_dict.values(): - button.destroy() - self._buttons_dict.clear() - self._value_list = kwargs.pop("values") - - self._check_unique_values(self._value_list) - - if len(self._value_list) > 0: - self._create_buttons_from_values() - self._create_button_grid() - - if self._current_value in self._value_list: - self._select_button_by_value(self._current_value) - - if "variable" in kwargs: - if self._variable is not None: # remove old callback - self._variable.trace_remove("write", self._variable_callback_name) - - self._variable = kwargs.pop("variable") - - if self._variable is not None and self._variable != "": - self._variable_callback_name = self._variable.trace_add("write", self._variable_callback) - self.set(self._variable.get(), from_variable_callback=True) - else: - self._variable = None - - if "dynamic_resizing" in kwargs: - self._dynamic_resizing = kwargs.pop("dynamic_resizing") - if not self._dynamic_resizing: - self.grid_propagate(False) - else: - self.grid_propagate(True) - - if "command" in kwargs: - self._command = kwargs.pop("command") - - if "state" in kwargs: - self._state = kwargs.pop("state") - for button in self._buttons_dict.values(): - button.configure(state=self._state) - - check_kwargs_empty(kwargs, raise_error=True) - - def cget(self, attribute_name: str) -> any: - if attribute_name == "width": - return super().cget(attribute_name) - elif attribute_name == "height": - return super().cget(attribute_name) - elif attribute_name == "corner_radius": - return self._sb_corner_radius - elif attribute_name == "border_width": - return self._sb_border_width - - elif attribute_name == "bg_color": - return super().cget(attribute_name) - elif attribute_name == "fg_color": - return self._sb_fg_color - elif attribute_name == "selected_color": - return self._sb_selected_color - elif attribute_name == "selected_hover_color": - return self._sb_selected_hover_color - elif attribute_name == "unselected_color": - return self._sb_unselected_color - elif attribute_name == "unselected_hover_color": - return self._sb_unselected_hover_color - elif attribute_name == "text_color": - return self._sb_text_color - elif attribute_name == "text_color_disabled": - return self._sb_text_color_disabled - - elif attribute_name == "font": - return self._font - elif attribute_name == "values": - return copy.copy(self._value_list) - elif attribute_name == "variable": - return self._variable - elif attribute_name == "dynamic_resizing": - return self._dynamic_resizing - elif attribute_name == "command": - return self._command - - else: - raise ValueError(f"'{attribute_name}' is not a supported argument. Look at the documentation for supported arguments.") - - def set(self, value: str, from_variable_callback: bool = False, from_button_callback: bool = False): - if value == self._current_value: - return - elif value in self._buttons_dict: - self._select_button_by_value(value) - - if self._variable is not None and not from_variable_callback: - self._variable_callback_blocked = True - self._variable.set(value) - self._variable_callback_blocked = False - else: - if self._current_value in self._buttons_dict: - self._unselect_button_by_value(self._current_value) - self._current_value = value - - if self._variable is not None and not from_variable_callback: - self._variable_callback_blocked = True - self._variable.set(value) - self._variable_callback_blocked = False - - if from_button_callback: - if self._command is not None: - self._command(self._current_value) - - def get(self) -> str: - return self._current_value - - def index(self, value: str) -> int: - return self._value_list.index(value) - - def insert(self, index: int, value: str): - if value not in self._buttons_dict: - if value != "": - self._value_list.insert(index, value) - self._buttons_dict[value] = self._create_button(index, value) - - self._configure_button_corners_for_index(index) - if index > 0: - self._configure_button_corners_for_index(index - 1) - if index < len(self._buttons_dict) - 1: - self._configure_button_corners_for_index(index + 1) - - self._create_button_grid() - - if value == self._current_value: - self._select_button_by_value(self._current_value) - else: - raise ValueError(f"CTkSegmentedButton can not insert value ''") - else: - raise ValueError(f"CTkSegmentedButton can not insert value '{value}', already part of the values") - - def move(self, new_index: int, value: str): - if 0 <= new_index < len(self._value_list): - if value in self._buttons_dict: - self.delete(value) - self.insert(new_index, value) - else: - raise ValueError(f"CTkSegmentedButton has no value named '{value}'") - else: - raise ValueError(f"CTkSegmentedButton new_index {new_index} not in range of value list with len {len(self._value_list)}") - - def delete(self, value: str): - if value in self._buttons_dict: - self._buttons_dict[value].destroy() - self._buttons_dict.pop(value) - index_to_remove = self._get_index_by_value(value) - self._value_list.pop(index_to_remove) - - # removed index was outer right element - if index_to_remove == len(self._buttons_dict) and len(self._buttons_dict) > 0: - self._configure_button_corners_for_index(index_to_remove - 1) - - # removed index was outer left element - if index_to_remove == 0 and len(self._buttons_dict) > 0: - self._configure_button_corners_for_index(0) - - #if index_to_remove <= len(self._buttons_dict) - 1: - # self._configure_button_corners_for_index(index_to_remove) - - self._create_button_grid() - else: - raise ValueError(f"CTkSegmentedButton does not contain value '{value}'") - - def bind(self, sequence=None, command=None, add=None): - raise NotImplementedError - - def unbind(self, sequence=None, funcid=None): - raise NotImplementedError - diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_slider.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_slider.py deleted file mode 100644 index 7aa03ee..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_slider.py +++ /dev/null @@ -1,413 +0,0 @@ -import tkinter -import sys -from typing import Union, Tuple, Callable, Optional, Any - -from .core_rendering import CTkCanvas -from .theme import ThemeManager -from .core_rendering import DrawEngine -from .core_widget_classes import CTkBaseClass - - -class CTkSlider(CTkBaseClass): - """ - Slider with rounded corners, border, number of steps, variable support, vertical orientation. - For detailed information check out the documentation. - """ - - def __init__(self, - master: Any, - width: Optional[int] = None, - height: Optional[int] = None, - corner_radius: Optional[int] = None, - button_corner_radius: Optional[int] = None, - border_width: Optional[int] = None, - button_length: Optional[int] = None, - - bg_color: Union[str, Tuple[str, str]] = "transparent", - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - border_color: Union[str, Tuple[str, str]] = "transparent", - progress_color: Optional[Union[str, Tuple[str, str]]] = None, - button_color: Optional[Union[str, Tuple[str, str]]] = None, - button_hover_color: Optional[Union[str, Tuple[str, str]]] = None, - - from_: int = 0, - to: int = 1, - state: str = "normal", - number_of_steps: Union[int, None] = None, - hover: bool = True, - command: Union[Callable[[float], Any], None] = None, - variable: Union[tkinter.Variable, None] = None, - orientation: str = "horizontal", - **kwargs): - - # set default dimensions according to orientation - if width is None: - if orientation.lower() == "vertical": - width = 16 - else: - width = 200 - if height is None: - if orientation.lower() == "vertical": - height = 200 - else: - height = 16 - - # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass - super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) - - # color - self._border_color = self._check_color_type(border_color, transparency=True) - self._fg_color = ThemeManager.theme["CTkSlider"]["fg_color"] if fg_color is None else self._check_color_type(fg_color) - self._progress_color = ThemeManager.theme["CTkSlider"]["progress_color"] if progress_color is None else self._check_color_type(progress_color, transparency=True) - self._button_color = ThemeManager.theme["CTkSlider"]["button_color"] if button_color is None else self._check_color_type(button_color) - self._button_hover_color = ThemeManager.theme["CTkSlider"]["button_hover_color"] if button_hover_color is None else self._check_color_type(button_hover_color) - - # shape - self._corner_radius = ThemeManager.theme["CTkSlider"]["corner_radius"] if corner_radius is None else corner_radius - self._button_corner_radius = ThemeManager.theme["CTkSlider"]["button_corner_radius"] if button_corner_radius is None else button_corner_radius - self._border_width = ThemeManager.theme["CTkSlider"]["border_width"] if border_width is None else border_width - self._button_length = ThemeManager.theme["CTkSlider"]["button_length"] if button_length is None else button_length - self._value: float = 0.5 # initial value of slider in percent - self._orientation = orientation - self._hover_state: bool = False - self._hover = hover - self._from_ = from_ - self._to = to - self._number_of_steps = number_of_steps - self._output_value = self._from_ + (self._value * (self._to - self._from_)) - - if self._corner_radius < self._button_corner_radius: - self._corner_radius = self._button_corner_radius - - # callback and control variables - self._command = command - self._variable: tkinter.Variable = variable - self._variable_callback_blocked: bool = False - self._variable_callback_name: Union[bool, None] = None - self._state = state - - self.grid_rowconfigure(0, weight=1) - self.grid_columnconfigure(0, weight=1) - - self._canvas = CTkCanvas(master=self, - highlightthickness=0, - width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._canvas.grid(column=0, row=0, rowspan=1, columnspan=1, sticky="nswe") - self._draw_engine = DrawEngine(self._canvas) - - self._create_bindings() - self._set_cursor() - self._draw() # initial draw - - if self._variable is not None: - self._variable_callback_name = self._variable.trace_add("write", self._variable_callback) - self._variable_callback_blocked = True - self.set(self._variable.get(), from_variable_callback=True) - self._variable_callback_blocked = False - - def _create_bindings(self, sequence: Optional[str] = None): - """ set necessary bindings for functionality of widget, will overwrite other bindings """ - if sequence is None or sequence == "": - self._canvas.bind("", self._on_enter) - if sequence is None or sequence == "": - self._canvas.bind("", self._on_leave) - if sequence is None or sequence == "": - self._canvas.bind("", self._clicked) - if sequence is None or sequence == "": - self._canvas.bind("", self._clicked) - - def _set_scaling(self, *args, **kwargs): - super()._set_scaling(*args, **kwargs) - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._draw(no_color_updates=True) - - def _set_dimensions(self, width=None, height=None): - super()._set_dimensions(width, height) - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._draw() - - def destroy(self): - # remove variable_callback from variable callbacks if variable exists - if self._variable is not None: - self._variable.trace_remove("write", self._variable_callback_name) - - super().destroy() - - def _set_cursor(self): - if self._state == "normal" and self._cursor_manipulation_enabled: - if sys.platform == "darwin": - self.configure(cursor="pointinghand") - elif sys.platform.startswith("win"): - self.configure(cursor="hand2") - - elif self._state == "disabled" and self._cursor_manipulation_enabled: - if sys.platform == "darwin": - self.configure(cursor="arrow") - elif sys.platform.startswith("win"): - self.configure(cursor="arrow") - - def _draw(self, no_color_updates=False): - super()._draw(no_color_updates) - - if self._orientation.lower() == "horizontal": - orientation = "w" - elif self._orientation.lower() == "vertical": - orientation = "s" - else: - orientation = "w" - - requires_recoloring = self._draw_engine.draw_rounded_slider_with_border_and_button(self._apply_widget_scaling(self._current_width), - self._apply_widget_scaling(self._current_height), - self._apply_widget_scaling(self._corner_radius), - self._apply_widget_scaling(self._border_width), - self._apply_widget_scaling(self._button_length), - self._apply_widget_scaling(self._button_corner_radius), - self._value, orientation) - - if no_color_updates is False or requires_recoloring: - self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - - if self._border_color == "transparent": - self._canvas.itemconfig("border_parts", fill=self._apply_appearance_mode(self._bg_color), - outline=self._apply_appearance_mode(self._bg_color)) - else: - self._canvas.itemconfig("border_parts", fill=self._apply_appearance_mode(self._border_color), - outline=self._apply_appearance_mode(self._border_color)) - - self._canvas.itemconfig("inner_parts", fill=self._apply_appearance_mode(self._fg_color), - outline=self._apply_appearance_mode(self._fg_color)) - - if self._progress_color == "transparent": - self._canvas.itemconfig("progress_parts", fill=self._apply_appearance_mode(self._fg_color), - outline=self._apply_appearance_mode(self._fg_color)) - else: - self._canvas.itemconfig("progress_parts", fill=self._apply_appearance_mode(self._progress_color), - outline=self._apply_appearance_mode(self._progress_color)) - - if self._hover_state is True: - self._canvas.itemconfig("slider_parts", - fill=self._apply_appearance_mode(self._button_hover_color), - outline=self._apply_appearance_mode(self._button_hover_color)) - else: - self._canvas.itemconfig("slider_parts", - fill=self._apply_appearance_mode(self._button_color), - outline=self._apply_appearance_mode(self._button_color)) - - def configure(self, require_redraw=False, **kwargs): - if "corner_radius" in kwargs: - self._corner_radius = kwargs.pop("corner_radius") - require_redraw = True - - if "button_corner_radius" in kwargs: - self._button_corner_radius = kwargs.pop("button_corner_radius") - require_redraw = True - - if "border_width" in kwargs: - self._border_width = kwargs.pop("border_width") - require_redraw = True - - if "button_length" in kwargs: - self._button_length = kwargs.pop("button_length") - require_redraw = True - - if "fg_color" in kwargs: - self._fg_color = self._check_color_type(kwargs.pop("fg_color")) - require_redraw = True - - if "border_color" in kwargs: - self._border_color = self._check_color_type(kwargs.pop("border_color"), transparency=True) - require_redraw = True - - if "progress_color" in kwargs: - self._progress_color = self._check_color_type(kwargs.pop("progress_color"), transparency=True) - require_redraw = True - - if "button_color" in kwargs: - self._button_color = self._check_color_type(kwargs.pop("button_color")) - require_redraw = True - - if "button_hover_color" in kwargs: - self._button_hover_color = self._check_color_type(kwargs.pop("button_hover_color")) - require_redraw = True - - if "from_" in kwargs: - self._from_ = kwargs.pop("from_") - - if "to" in kwargs: - self._to = kwargs.pop("to") - - if "state" in kwargs: - self._state = kwargs.pop("state") - self._set_cursor() - require_redraw = True - - if "number_of_steps" in kwargs: - self._number_of_steps = kwargs.pop("number_of_steps") - - if "hover" in kwargs: - self._hover = kwargs.pop("hover") - - if "command" in kwargs: - self._command = kwargs.pop("command") - - if "variable" in kwargs: - if self._variable is not None: - self._variable.trace_remove("write", self._variable_callback_name) - - self._variable = kwargs.pop("variable") - - if self._variable is not None and self._variable != "": - self._variable_callback_name = self._variable.trace_add("write", self._variable_callback) - self.set(self._variable.get(), from_variable_callback=True) - else: - self._variable = None - - if "orientation" in kwargs: - self._orientation = kwargs.pop("orientation") - require_redraw = True - - super().configure(require_redraw=require_redraw, **kwargs) - - def cget(self, attribute_name: str) -> any: - if attribute_name == "corner_radius": - return self._corner_radius - elif attribute_name == "button_corner_radius": - return self._button_corner_radius - elif attribute_name == "border_width": - return self._border_width - elif attribute_name == "button_length": - return self._button_length - - elif attribute_name == "fg_color": - return self._fg_color - elif attribute_name == "border_color": - return self._border_color - elif attribute_name == "progress_color": - return self._progress_color - elif attribute_name == "button_color": - return self._button_color - elif attribute_name == "button_hover_color": - return self._button_hover_color - - elif attribute_name == "from_": - return self._from_ - elif attribute_name == "to": - return self._to - elif attribute_name == "state": - return self._state - elif attribute_name == "number_of_steps": - return self._number_of_steps - elif attribute_name == "hover": - return self._hover - elif attribute_name == "command": - return self._command - elif attribute_name == "variable": - return self._variable - elif attribute_name == "orientation": - return self._orientation - - else: - return super().cget(attribute_name) - - def _clicked(self, event=None): - if self._state == "normal": - if self._orientation.lower() == "horizontal": - self._value = self._reverse_widget_scaling(event.x / self._current_width) - else: - self._value = 1 - self._reverse_widget_scaling(event.y / self._current_height) - - if self._value > 1: - self._value = 1 - if self._value < 0: - self._value = 0 - - self._output_value = self._round_to_step_size(self._from_ + (self._value * (self._to - self._from_))) - self._value = (self._output_value - self._from_) / (self._to - self._from_) - - self._draw(no_color_updates=False) - - if self._variable is not None: - self._variable_callback_blocked = True - self._variable.set(round(self._output_value) if isinstance(self._variable, tkinter.IntVar) else self._output_value) - self._variable_callback_blocked = False - - if self._command is not None: - self._command(self._output_value) - - def _on_enter(self, event=0): - if self._hover is True and self._state == "normal": - self._hover_state = True - self._canvas.itemconfig("slider_parts", - fill=self._apply_appearance_mode(self._button_hover_color), - outline=self._apply_appearance_mode(self._button_hover_color)) - - def _on_leave(self, event=0): - self._hover_state = False - self._canvas.itemconfig("slider_parts", - fill=self._apply_appearance_mode(self._button_color), - outline=self._apply_appearance_mode(self._button_color)) - - def _round_to_step_size(self, value) -> float: - if self._number_of_steps is not None: - step_size = (self._to - self._from_) / self._number_of_steps - value = self._to - (round((self._to - value) / step_size) * step_size) - return value - else: - return value - - def get(self) -> float: - return self._output_value - - def set(self, output_value, from_variable_callback=False): - if self._from_ < self._to: - if output_value > self._to: - output_value = self._to - elif output_value < self._from_: - output_value = self._from_ - else: - if output_value < self._to: - output_value = self._to - elif output_value > self._from_: - output_value = self._from_ - - self._output_value = self._round_to_step_size(output_value) - self._value = (self._output_value - self._from_) / (self._to - self._from_) - - self._draw(no_color_updates=False) - - if self._variable is not None and not from_variable_callback: - self._variable_callback_blocked = True - self._variable.set(round(self._output_value) if isinstance(self._variable, tkinter.IntVar) else self._output_value) - self._variable_callback_blocked = False - - def _variable_callback(self, var_name, index, mode): - if not self._variable_callback_blocked: - self.set(self._variable.get(), from_variable_callback=True) - - def bind(self, sequence: str = None, command: Callable = None, add: Union[str, bool] = True): - """ called on the tkinter.Canvas """ - if not (add == "+" or add is True): - raise ValueError("'add' argument can only be '+' or True to preserve internal callbacks") - self._canvas.bind(sequence, command, add=True) - - def unbind(self, sequence: str = None, funcid: str = None): - """ called on the tkinter.Label and tkinter.Canvas """ - if funcid is not None: - raise ValueError("'funcid' argument can only be None, because there is a bug in" + - " tkinter and its not clear whether the internal callbacks will be unbinded or not") - self._canvas.unbind(sequence, None) - self._create_bindings(sequence=sequence) # restore internal callbacks for sequence - - def focus(self): - return self._canvas.focus() - - def focus_set(self): - return self._canvas.focus_set() - - def focus_force(self): - return self._canvas.focus_force() diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_switch.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_switch.py deleted file mode 100644 index 155c174..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_switch.py +++ /dev/null @@ -1,483 +0,0 @@ -import tkinter -import sys -from typing import Union, Tuple, Callable, Optional, Any - -from .core_rendering import CTkCanvas -from .theme import ThemeManager -from .core_rendering import DrawEngine -from .core_widget_classes import CTkBaseClass -from .font import CTkFont - - -class CTkSwitch(CTkBaseClass): - """ - Switch with rounded corners, border, label, command, variable support. - For detailed information check out the documentation. - """ - - def __init__(self, - master: Any, - width: int = 100, - height: int = 24, - switch_width: int = 36, - switch_height: int = 18, - corner_radius: Optional[int] = None, - border_width: Optional[int] = None, - button_length: Optional[int] = None, - - bg_color: Union[str, Tuple[str, str]] = "transparent", - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - border_color: Union[str, Tuple[str, str]] = "transparent", - progress_color: Optional[Union[str, Tuple[str, str]]] = None, - button_color: Optional[Union[str, Tuple[str, str]]] = None, - button_hover_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color_disabled: Optional[Union[str, Tuple[str, str]]] = None, - - text: str = "CTkSwitch", - font: Optional[Union[tuple, CTkFont]] = None, - textvariable: Union[tkinter.Variable, None] = None, - onvalue: Union[int, str] = 1, - offvalue: Union[int, str] = 0, - variable: Union[tkinter.Variable, None] = None, - hover: bool = True, - command: Union[Callable, Any] = None, - state: str = tkinter.NORMAL, - **kwargs): - - # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass - super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) - - # dimensions - self._switch_width = switch_width - self._switch_height = switch_height - - # color - self._border_color = self._check_color_type(border_color, transparency=True) - self._fg_color = ThemeManager.theme["CTkSwitch"]["fg_color"] if fg_color is None else self._check_color_type(fg_color) - self._progress_color = ThemeManager.theme["CTkSwitch"]["progress_color"] if progress_color is None else self._check_color_type(progress_color, transparency=True) - self._button_color = ThemeManager.theme["CTkSwitch"]["button_color"] if button_color is None else self._check_color_type(button_color) - self._button_hover_color = ThemeManager.theme["CTkSwitch"]["button_hover_color"] if button_hover_color is None else self._check_color_type(button_hover_color) - self._text_color = ThemeManager.theme["CTkSwitch"]["text_color"] if text_color is None else self._check_color_type(text_color) - self._text_color_disabled = ThemeManager.theme["CTkSwitch"]["text_color_disabled"] if text_color_disabled is None else self._check_color_type(text_color_disabled) - - # text - self._text = text - self._text_label = None - - # font - self._font = CTkFont() if font is None else self._check_font_type(font) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - # shape - self._corner_radius = ThemeManager.theme["CTkSwitch"]["corner_radius"] if corner_radius is None else corner_radius - self._border_width = ThemeManager.theme["CTkSwitch"]["border_width"] if border_width is None else border_width - self._button_length = ThemeManager.theme["CTkSwitch"]["button_length"] if button_length is None else button_length - self._hover_state: bool = False - self._check_state: bool = False # True if switch is activated - self._hover = hover - self._state = state - self._onvalue = onvalue - self._offvalue = offvalue - - # callback and control variables - self._command = command - self._variable = variable - self._variable_callback_blocked = False - self._variable_callback_name = None - self._textvariable = textvariable - - # configure grid system (3x1) - self.grid_columnconfigure(0, weight=0) - self.grid_columnconfigure(1, weight=0, minsize=self._apply_widget_scaling(6)) - self.grid_columnconfigure(2, weight=1) - self.grid_rowconfigure(0, weight=1) - - self._bg_canvas = CTkCanvas(master=self, - highlightthickness=0, - width=self._apply_widget_scaling(self._current_width), - height=self._apply_widget_scaling(self._current_height)) - self._bg_canvas.grid(row=0, column=0, columnspan=3, sticky="nswe") - - self._canvas = CTkCanvas(master=self, - highlightthickness=0, - width=self._apply_widget_scaling(self._switch_width), - height=self._apply_widget_scaling(self._switch_height)) - self._canvas.grid(row=0, column=0, sticky="") - self._draw_engine = DrawEngine(self._canvas) - - self._text_label = tkinter.Label(master=self, - bd=0, - padx=0, - pady=0, - text=self._text, - justify=tkinter.LEFT, - font=self._apply_font_scaling(self._font), - textvariable=self._textvariable) - self._text_label.grid(row=0, column=2, sticky="w") - self._text_label["anchor"] = "w" - - if self._variable is not None and self._variable != "": - self._variable_callback_name = self._variable.trace_add("write", self._variable_callback) - self._check_state = True if self._variable.get() == self._onvalue else False - - self._create_bindings() - self._set_cursor() - self._draw() # initial draw - - def _create_bindings(self, sequence: Optional[str] = None): - """ set necessary bindings for functionality of widget, will overwrite other bindings """ - if sequence is None or sequence == "": - self._canvas.bind("", self._on_enter) - self._text_label.bind("", self._on_enter) - if sequence is None or sequence == "": - self._canvas.bind("", self._on_leave) - self._text_label.bind("", self._on_leave) - if sequence is None or sequence == "": - self._canvas.bind("", self.toggle) - self._text_label.bind("", self.toggle) - - def _set_scaling(self, *args, **kwargs): - super()._set_scaling(*args, **kwargs) - - self.grid_columnconfigure(1, weight=0, minsize=self._apply_widget_scaling(6)) - self._text_label.configure(font=self._apply_font_scaling(self._font)) - - self._bg_canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._canvas.configure(width=self._apply_widget_scaling(self._switch_width), - height=self._apply_widget_scaling(self._switch_height)) - self._draw(no_color_updates=True) - - def _set_dimensions(self, width: int = None, height: int = None): - super()._set_dimensions(width, height) - - self._bg_canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - - def _update_font(self): - """ pass font to tkinter widgets with applied font scaling and update grid with workaround """ - self._text_label.configure(font=self._apply_font_scaling(self._font)) - - # Workaround to force grid to be resized when text changes size. - # Otherwise grid will lag and only resizes if other mouse action occurs. - self._bg_canvas.grid_forget() - self._bg_canvas.grid(row=0, column=0, columnspan=3, sticky="nswe") - - def destroy(self): - # remove variable_callback from variable callbacks if variable exists - if self._variable is not None: - self._variable.trace_remove("write", self._variable_callback_name) - - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - - super().destroy() - - def _set_cursor(self): - if self._cursor_manipulation_enabled: - if self._state == tkinter.DISABLED: - if sys.platform == "darwin": - self._canvas.configure(cursor="arrow") - if self._text_label is not None: - self._text_label.configure(cursor="arrow") - elif sys.platform.startswith("win"): - self._canvas.configure(cursor="arrow") - if self._text_label is not None: - self._text_label.configure(cursor="arrow") - - elif self._state == tkinter.NORMAL: - if sys.platform == "darwin": - self._canvas.configure(cursor="pointinghand") - if self._text_label is not None: - self._text_label.configure(cursor="pointinghand") - elif sys.platform.startswith("win"): - self._canvas.configure(cursor="hand2") - if self._text_label is not None: - self._text_label.configure(cursor="hand2") - - def _draw(self, no_color_updates=False): - super()._draw(no_color_updates) - - if self._check_state is True: - requires_recoloring = self._draw_engine.draw_rounded_slider_with_border_and_button(self._apply_widget_scaling(self._switch_width), - self._apply_widget_scaling(self._switch_height), - self._apply_widget_scaling(self._corner_radius), - self._apply_widget_scaling(self._border_width), - self._apply_widget_scaling(self._button_length), - self._apply_widget_scaling(self._corner_radius), - 1, "w") - else: - requires_recoloring = self._draw_engine.draw_rounded_slider_with_border_and_button(self._apply_widget_scaling(self._switch_width), - self._apply_widget_scaling(self._switch_height), - self._apply_widget_scaling(self._corner_radius), - self._apply_widget_scaling(self._border_width), - self._apply_widget_scaling(self._button_length), - self._apply_widget_scaling(self._corner_radius), - 0, "w") - - if no_color_updates is False or requires_recoloring: - self._bg_canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - - if self._border_color == "transparent": - self._canvas.itemconfig("border_parts", - fill=self._apply_appearance_mode(self._bg_color), - outline=self._apply_appearance_mode(self._bg_color)) - else: - self._canvas.itemconfig("border_parts", - fill=self._apply_appearance_mode(self._border_color), - outline=self._apply_appearance_mode(self._border_color)) - - self._canvas.itemconfig("inner_parts", - fill=self._apply_appearance_mode(self._fg_color), - outline=self._apply_appearance_mode(self._fg_color)) - - if self._progress_color == "transparent": - self._canvas.itemconfig("progress_parts", - fill=self._apply_appearance_mode(self._fg_color), - outline=self._apply_appearance_mode(self._fg_color)) - else: - self._canvas.itemconfig("progress_parts", - fill=self._apply_appearance_mode(self._progress_color), - outline=self._apply_appearance_mode(self._progress_color)) - - self._canvas.itemconfig("slider_parts", - fill=self._apply_appearance_mode(self._button_color), - outline=self._apply_appearance_mode(self._button_color)) - - if self._state == tkinter.DISABLED: - self._text_label.configure(fg=(self._apply_appearance_mode(self._text_color_disabled))) - else: - self._text_label.configure(fg=self._apply_appearance_mode(self._text_color)) - - self._text_label.configure(bg=self._apply_appearance_mode(self._bg_color)) - - def configure(self, require_redraw=False, **kwargs): - if "corner_radius" in kwargs: - self._corner_radius = kwargs.pop("corner_radius") - require_redraw = True - - if "border_width" in kwargs: - self._border_width = kwargs.pop("border_width") - require_redraw = True - - if "button_length" in kwargs: - self._button_length = kwargs.pop("button_length") - require_redraw = True - - if "switch_width" in kwargs: - self._switch_width = kwargs.pop("switch_width") - self._canvas.configure(width=self._apply_widget_scaling(self._switch_width)) - require_redraw = True - - if "switch_height" in kwargs: - self._switch_height = kwargs.pop("switch_height") - self._canvas.configure(height=self._apply_widget_scaling(self._switch_height)) - require_redraw = True - - if "text" in kwargs: - self._text = kwargs.pop("text") - self._text_label.configure(text=self._text) - - if "font" in kwargs: - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - self._font = self._check_font_type(kwargs.pop("font")) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - self._update_font() - - if "state" in kwargs: - self._state = kwargs.pop("state") - self._set_cursor() - require_redraw = True - - if "fg_color" in kwargs: - self._fg_color = self._check_color_type(kwargs.pop("fg_color")) - require_redraw = True - - if "border_color" in kwargs: - self._border_color = self._check_color_type(kwargs.pop("border_color"), transparency=True) - require_redraw = True - - if "progress_color" in kwargs: - self._progress_color = self._check_color_type(kwargs.pop("progress_color"), transparency=True) - require_redraw = True - - if "button_color" in kwargs: - self._button_color = self._check_color_type(kwargs.pop("button_color")) - require_redraw = True - - if "button_hover_color" in kwargs: - self._button_hover_color = self._check_color_type(kwargs.pop("button_hover_color")) - require_redraw = True - - if "text_color" in kwargs: - self._text_color = self._check_color_type(kwargs.pop("text_color")) - require_redraw = True - - if "text_color_disabled" in kwargs: - self._text_color_disabled = self._check_color_type(kwargs.pop("text_color_disabled")) - require_redraw = True - - if "hover" in kwargs: - self._hover = kwargs.pop("hover") - - if "command" in kwargs: - self._command = kwargs.pop("command") - - if "textvariable" in kwargs: - self._textvariable = kwargs.pop("textvariable") - self._text_label.configure(textvariable=self._textvariable) - - if "variable" in kwargs: - if self._variable is not None and self._variable != "": - self._variable.trace_remove("write", self._variable_callback_name) - - self._variable = kwargs.pop("variable") - - if self._variable is not None and self._variable != "": - self._variable_callback_name = self._variable.trace_add("write", self._variable_callback) - self._check_state = True if self._variable.get() == self._onvalue else False - require_redraw = True - - super().configure(require_redraw=require_redraw, **kwargs) - - def cget(self, attribute_name: str) -> any: - if attribute_name == "corner_radius": - return self._corner_radius - elif attribute_name == "border_width": - return self._border_width - elif attribute_name == "button_length": - return self._button_length - elif attribute_name == "switch_width": - return self._switch_width - elif attribute_name == "switch_height": - return self._switch_height - - elif attribute_name == "fg_color": - return self._fg_color - elif attribute_name == "border_color": - return self._border_color - elif attribute_name == "progress_color": - return self._progress_color - elif attribute_name == "button_color": - return self._button_color - elif attribute_name == "button_hover_color": - return self._button_hover_color - elif attribute_name == "text_color": - return self._text_color - elif attribute_name == "text_color_disabled": - return self._text_color_disabled - - elif attribute_name == "text": - return self._text - elif attribute_name == "font": - return self._font - elif attribute_name == "textvariable": - return self._textvariable - elif attribute_name == "onvalue": - return self._onvalue - elif attribute_name == "offvalue": - return self._offvalue - elif attribute_name == "variable": - return self._variable - elif attribute_name == "hover": - return self._hover - elif attribute_name == "command": - return self._command - elif attribute_name == "state": - return self._state - - else: - return super().cget(attribute_name) - - def toggle(self, event=None): - if self._state is not tkinter.DISABLED: - if self._check_state is True: - self._check_state = False - else: - self._check_state = True - - self._draw(no_color_updates=True) - - if self._variable is not None: - self._variable_callback_blocked = True - self._variable.set(self._onvalue if self._check_state is True else self._offvalue) - self._variable_callback_blocked = False - - if self._command is not None: - self._command() - - def select(self, from_variable_callback=False): - if self._state is not tkinter.DISABLED or from_variable_callback: - self._check_state = True - - self._draw(no_color_updates=True) - - if self._variable is not None and not from_variable_callback: - self._variable_callback_blocked = True - self._variable.set(self._onvalue) - self._variable_callback_blocked = False - - def deselect(self, from_variable_callback=False): - if self._state is not tkinter.DISABLED or from_variable_callback: - self._check_state = False - - self._draw(no_color_updates=True) - - if self._variable is not None and not from_variable_callback: - self._variable_callback_blocked = True - self._variable.set(self._offvalue) - self._variable_callback_blocked = False - - def get(self) -> Union[int, str]: - return self._onvalue if self._check_state is True else self._offvalue - - def _on_enter(self, event=0): - if self._hover is True and self._state == "normal": - self._hover_state = True - self._canvas.itemconfig("slider_parts", - fill=self._apply_appearance_mode(self._button_hover_color), - outline=self._apply_appearance_mode(self._button_hover_color)) - - def _on_leave(self, event=0): - self._hover_state = False - self._canvas.itemconfig("slider_parts", - fill=self._apply_appearance_mode(self._button_color), - outline=self._apply_appearance_mode(self._button_color)) - - def _variable_callback(self, var_name, index, mode): - if not self._variable_callback_blocked: - if self._variable.get() == self._onvalue: - self.select(from_variable_callback=True) - elif self._variable.get() == self._offvalue: - self.deselect(from_variable_callback=True) - - def bind(self, sequence: str = None, command: Callable = None, add: Union[str, bool] = True): - """ called on the tkinter.Canvas """ - if not (add == "+" or add is True): - raise ValueError("'add' argument can only be '+' or True to preserve internal callbacks") - self._canvas.bind(sequence, command, add=True) - self._text_label.bind(sequence, command, add=True) - - def unbind(self, sequence: str = None, funcid: str = None): - """ called on the tkinter.Label and tkinter.Canvas """ - if funcid is not None: - raise ValueError("'funcid' argument can only be None, because there is a bug in" + - " tkinter and its not clear whether the internal callbacks will be unbinded or not") - self._canvas.unbind(sequence, None) - self._text_label.unbind(sequence, None) - self._create_bindings(sequence=sequence) # restore internal callbacks for sequence - - def focus(self): - return self._text_label.focus() - - def focus_set(self): - return self._text_label.focus_set() - - def focus_force(self): - return self._text_label.focus_force() diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_tabview.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_tabview.py deleted file mode 100644 index 3b2ea5b..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_tabview.py +++ /dev/null @@ -1,433 +0,0 @@ -import tkinter -from typing import Union, Tuple, Dict, List, Callable, Optional, Any - -from .theme import ThemeManager -from .ctk_frame import CTkFrame -from .core_rendering import CTkCanvas -from .core_rendering import DrawEngine -from .core_widget_classes import CTkBaseClass -from .ctk_segmented_button import CTkSegmentedButton - - -class CTkTabview(CTkBaseClass): - """ - Tabview... - For detailed information check out the documentation. - """ - - _outer_spacing: int = 10 # px on top or below the button - _outer_button_overhang: int = 8 # px - _button_height: int = 26 - _segmented_button_border_width: int = 3 - - def __init__(self, - master: Any, - width: int = 300, - height: int = 250, - corner_radius: Optional[int] = None, - border_width: Optional[int] = None, - - bg_color: Union[str, Tuple[str, str]] = "transparent", - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - border_color: Optional[Union[str, Tuple[str, str]]] = None, - - segmented_button_fg_color: Optional[Union[str, Tuple[str, str]]] = None, - segmented_button_selected_color: Optional[Union[str, Tuple[str, str]]] = None, - segmented_button_selected_hover_color: Optional[Union[str, Tuple[str, str]]] = None, - segmented_button_unselected_color: Optional[Union[str, Tuple[str, str]]] = None, - segmented_button_unselected_hover_color: Optional[Union[str, Tuple[str, str]]] = None, - - text_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color_disabled: Optional[Union[str, Tuple[str, str]]] = None, - - command: Union[Callable, Any] = None, - anchor: str = "center", - state: str = "normal", - **kwargs): - - # transfer some functionality to CTkFrame - super().__init__(master=master, bg_color=bg_color, width=width, height=height, **kwargs) - - # color - self._border_color = ThemeManager.theme["CTkFrame"]["border_color"] if border_color is None else self._check_color_type(border_color) - - # determine fg_color of frame - if fg_color is None: - if isinstance(self.master, (CTkFrame, CTkTabview)): - if self.master.cget("fg_color") == ThemeManager.theme["CTkFrame"]["fg_color"]: - self._fg_color = ThemeManager.theme["CTkFrame"]["top_fg_color"] - else: - self._fg_color = ThemeManager.theme["CTkFrame"]["fg_color"] - else: - self._fg_color = ThemeManager.theme["CTkFrame"]["fg_color"] - else: - self._fg_color = self._check_color_type(fg_color, transparency=True) - - # shape - self._corner_radius = ThemeManager.theme["CTkFrame"]["corner_radius"] if corner_radius is None else corner_radius - self._border_width = ThemeManager.theme["CTkFrame"]["border_width"] if border_width is None else border_width - self._anchor = anchor - - self._canvas = CTkCanvas(master=self, - bg=self._apply_appearance_mode(self._bg_color), - highlightthickness=0, - width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height - self._outer_spacing - self._outer_button_overhang)) - self._draw_engine = DrawEngine(self._canvas) - - self._segmented_button = CTkSegmentedButton(self, - values=[], - height=self._button_height, - fg_color=segmented_button_fg_color, - selected_color=segmented_button_selected_color, - selected_hover_color=segmented_button_selected_hover_color, - unselected_color=segmented_button_unselected_color, - unselected_hover_color=segmented_button_unselected_hover_color, - text_color=text_color, - text_color_disabled=text_color_disabled, - corner_radius=corner_radius, - border_width=self._segmented_button_border_width, - command=self._segmented_button_callback, - state=state) - self._configure_segmented_button_background_corners() - self._configure_grid() - self._set_grid_canvas() - - self._tab_dict: Dict[str, CTkFrame] = {} - self._name_list: List[str] = [] # list of unique tab names in order of tabs - self._current_name: str = "" - self._command = command - - self._draw() - - def _segmented_button_callback(self, selected_name): - self._tab_dict[self._current_name].grid_forget() - self._current_name = selected_name - self._set_grid_current_tab() - - if self._command is not None: - self._command() - - def winfo_children(self) -> List[any]: - """ - winfo_children of CTkTabview without canvas and segmented button widgets, - because it's not a child but part of the CTkTabview itself - """ - - child_widgets = super().winfo_children() - try: - child_widgets.remove(self._canvas) - child_widgets.remove(self._segmented_button) - return child_widgets - except ValueError: - return child_widgets - - def _set_scaling(self, *args, **kwargs): - super()._set_scaling(*args, **kwargs) - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height - self._outer_spacing - self._outer_button_overhang)) - self._configure_grid() - self._draw(no_color_updates=True) - - def _set_dimensions(self, width=None, height=None): - super()._set_dimensions(width, height) - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height - self._outer_spacing - self._outer_button_overhang)) - self._draw() - - def _configure_segmented_button_background_corners(self): - """ needs to be called for changes in fg_color, bg_color """ - - if self._fg_color == "transparent": - self._segmented_button.configure(background_corner_colors=(self._bg_color, self._bg_color, self._bg_color, self._bg_color)) - else: - if self._anchor.lower() in ("center", "w", "nw", "n", "ne", "e", "e"): - self._segmented_button.configure(background_corner_colors=(self._bg_color, self._bg_color, self._fg_color, self._fg_color)) - else: - self._segmented_button.configure(background_corner_colors=(self._fg_color, self._fg_color, self._bg_color, self._bg_color)) - - def _configure_grid(self): - """ create 3 x 4 grid system """ - - if self._anchor.lower() in ("center", "w", "nw", "n", "ne", "e", "e"): - self.grid_rowconfigure(0, weight=0, minsize=self._apply_widget_scaling(self._outer_spacing)) - self.grid_rowconfigure(1, weight=0, minsize=self._apply_widget_scaling(self._outer_button_overhang)) - self.grid_rowconfigure(2, weight=0, minsize=self._apply_widget_scaling(self._button_height - self._outer_button_overhang)) - self.grid_rowconfigure(3, weight=1) - else: - self.grid_rowconfigure(0, weight=1) - self.grid_rowconfigure(1, weight=0, minsize=self._apply_widget_scaling(self._button_height - self._outer_button_overhang)) - self.grid_rowconfigure(2, weight=0, minsize=self._apply_widget_scaling(self._outer_button_overhang)) - self.grid_rowconfigure(3, weight=0, minsize=self._apply_widget_scaling(self._outer_spacing)) - - self.grid_columnconfigure(0, weight=1) - - def _set_grid_canvas(self): - if self._anchor.lower() in ("center", "w", "nw", "n", "ne", "e", "e"): - self._canvas.grid(row=2, rowspan=2, column=0, columnspan=1, sticky="nsew") - else: - self._canvas.grid(row=0, rowspan=2, column=0, columnspan=1, sticky="nsew") - - def _set_grid_segmented_button(self): - """ needs to be called for changes in corner_radius, anchor """ - - if self._anchor.lower() in ("center", "n", "s"): - self._segmented_button.grid(row=1, rowspan=2, column=0, columnspan=1, padx=self._apply_widget_scaling(self._corner_radius), sticky="ns") - elif self._anchor.lower() in ("nw", "w", "sw"): - self._segmented_button.grid(row=1, rowspan=2, column=0, columnspan=1, padx=self._apply_widget_scaling(self._corner_radius), sticky="nsw") - elif self._anchor.lower() in ("ne", "e", "se"): - self._segmented_button.grid(row=1, rowspan=2, column=0, columnspan=1, padx=self._apply_widget_scaling(self._corner_radius), sticky="nse") - - def _set_grid_current_tab(self): - """ needs to be called for changes in corner_radius, border_width """ - if self._anchor.lower() in ("center", "w", "nw", "n", "ne", "e", "e"): - self._tab_dict[self._current_name].grid(row=3, column=0, sticky="nsew", - padx=self._apply_widget_scaling(max(self._corner_radius, self._border_width)), - pady=self._apply_widget_scaling(max(self._corner_radius, self._border_width))) - else: - self._tab_dict[self._current_name].grid(row=0, column=0, sticky="nsew", - padx=self._apply_widget_scaling(max(self._corner_radius, self._border_width)), - pady=self._apply_widget_scaling(max(self._corner_radius, self._border_width))) - - def _grid_forget_all_tabs(self, exclude_name=None): - for name, frame in self._tab_dict.items(): - if name != exclude_name: - frame.grid_forget() - - def _create_tab(self) -> CTkFrame: - new_tab = CTkFrame(self, - height=0, - width=0, - border_width=0, - corner_radius=0) - - if self._fg_color == "transparent": - new_tab.configure(fg_color=self._apply_appearance_mode(self._bg_color), - bg_color=self._apply_appearance_mode(self._bg_color)) - else: - new_tab.configure(fg_color=self._apply_appearance_mode(self._fg_color), - bg_color=self._apply_appearance_mode(self._fg_color)) - - return new_tab - - def _draw(self, no_color_updates: bool = False): - super()._draw(no_color_updates) - - if not self._canvas.winfo_exists(): - return - - requires_recoloring = self._draw_engine.draw_rounded_rect_with_border(self._apply_widget_scaling(self._current_width), - self._apply_widget_scaling(self._current_height - self._outer_spacing - self._outer_button_overhang), - self._apply_widget_scaling(self._corner_radius), - self._apply_widget_scaling(self._border_width)) - - if no_color_updates is False or requires_recoloring: - if self._fg_color == "transparent": - self._canvas.itemconfig("inner_parts", - fill=self._apply_appearance_mode(self._bg_color), - outline=self._apply_appearance_mode(self._bg_color)) - for tab in self._tab_dict.values(): - tab.configure(fg_color=self._apply_appearance_mode(self._bg_color), - bg_color=self._apply_appearance_mode(self._bg_color)) - else: - self._canvas.itemconfig("inner_parts", - fill=self._apply_appearance_mode(self._fg_color), - outline=self._apply_appearance_mode(self._fg_color)) - for tab in self._tab_dict.values(): - tab.configure(fg_color=self._apply_appearance_mode(self._fg_color), - bg_color=self._apply_appearance_mode(self._fg_color)) - - self._canvas.itemconfig("border_parts", - fill=self._apply_appearance_mode(self._border_color), - outline=self._apply_appearance_mode(self._border_color)) - self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - tkinter.Frame.configure(self, bg=self._apply_appearance_mode(self._bg_color)) # configure bg color of tkinter.Frame, cause canvas does not fill frame - - def configure(self, require_redraw=False, **kwargs): - if "corner_radius" in kwargs: - self._corner_radius = kwargs.pop("corner_radius") - self._set_grid_segmented_button() - self._set_grid_current_tab() - self._set_grid_canvas() - self._configure_segmented_button_background_corners() - self._segmented_button.configure(corner_radius=self._corner_radius) - if "border_width" in kwargs: - self._border_width = kwargs.pop("border_width") - require_redraw = True - if "fg_color" in kwargs: - self._fg_color = self._check_color_type(kwargs.pop("fg_color"), transparency=True) - self._configure_segmented_button_background_corners() - require_redraw = True - if "border_color" in kwargs: - self._border_color = self._check_color_type(kwargs.pop("border_color")) - require_redraw = True - if "segmented_button_fg_color" in kwargs: - self._segmented_button.configure(fg_color=kwargs.pop("segmented_button_fg_color")) - if "segmented_button_selected_color" in kwargs: - self._segmented_button.configure(selected_color=kwargs.pop("segmented_button_selected_color")) - if "segmented_button_selected_hover_color" in kwargs: - self._segmented_button.configure(selected_hover_color=kwargs.pop("segmented_button_selected_hover_color")) - if "segmented_button_unselected_color" in kwargs: - self._segmented_button.configure(unselected_color=kwargs.pop("segmented_button_unselected_color")) - if "segmented_button_unselected_hover_color" in kwargs: - self._segmented_button.configure(unselected_hover_color=kwargs.pop("segmented_button_unselected_hover_color")) - if "text_color" in kwargs: - self._segmented_button.configure(text_color=kwargs.pop("text_color")) - if "text_color_disabled" in kwargs: - self._segmented_button.configure(text_color_disabled=kwargs.pop("text_color_disabled")) - - if "command" in kwargs: - self._command = kwargs.pop("command") - if "anchor" in kwargs: - self._anchor = kwargs.pop("anchor") - self._configure_grid() - self._set_grid_segmented_button() - if "state" in kwargs: - self._segmented_button.configure(state=kwargs.pop("state")) - - super().configure(require_redraw=require_redraw, **kwargs) - - def cget(self, attribute_name: str): - if attribute_name == "corner_radius": - return self._corner_radius - elif attribute_name == "border_width": - return self._border_width - - elif attribute_name == "fg_color": - return self._fg_color - elif attribute_name == "border_color": - return self._border_color - elif attribute_name == "segmented_button_fg_color": - return self._segmented_button.cget(attribute_name) - elif attribute_name == "segmented_button_selected_color": - return self._segmented_button.cget(attribute_name) - elif attribute_name == "segmented_button_selected_hover_color": - return self._segmented_button.cget(attribute_name) - elif attribute_name == "segmented_button_unselected_color": - return self._segmented_button.cget(attribute_name) - elif attribute_name == "segmented_button_unselected_hover_color": - return self._segmented_button.cget(attribute_name) - elif attribute_name == "text_color": - return self._segmented_button.cget(attribute_name) - elif attribute_name == "text_color_disabled": - return self._segmented_button.cget(attribute_name) - - elif attribute_name == "command": - return self._command - elif attribute_name == "anchor": - return self._anchor - elif attribute_name == "state": - return self._segmented_button.cget(attribute_name) - - else: - return super().cget(attribute_name) - - def tab(self, name: str) -> CTkFrame: - """ returns reference to the tab with given name """ - - if name in self._tab_dict: - return self._tab_dict[name] - else: - raise ValueError(f"CTkTabview has no tab named '{name}'") - - def insert(self, index: int, name: str) -> CTkFrame: - """ creates new tab with given name at position index """ - - if name not in self._tab_dict: - # if no tab exists, set grid for segmented button - if len(self._tab_dict) == 0: - self._set_grid_segmented_button() - - self._name_list.append(name) - self._tab_dict[name] = self._create_tab() - self._segmented_button.insert(index, name) - - # if created tab is only tab select this tab - if len(self._tab_dict) == 1: - self._current_name = name - self._segmented_button.set(self._current_name) - self._grid_forget_all_tabs() - self._set_grid_current_tab() - - return self._tab_dict[name] - else: - raise ValueError(f"CTkTabview already has tab named '{name}'") - - def add(self, name: str) -> CTkFrame: - """ appends new tab with given name """ - return self.insert(len(self._tab_dict), name) - - def index(self, name) -> int: - """ get index of tab with given name """ - return self._segmented_button.index(name) - - def move(self, new_index: int, name: str): - if 0 <= new_index < len(self._name_list): - if name in self._tab_dict: - self._segmented_button.move(new_index, name) - else: - raise ValueError(f"CTkTabview has no name '{name}'") - else: - raise ValueError(f"CTkTabview new_index {new_index} not in range of name list with len {len(self._name_list)}") - - def rename(self, old_name: str, new_name: str): - if new_name in self._name_list: - raise ValueError(f"new_name '{new_name}' already exists") - - # segmented button - old_index = self._segmented_button.index(old_name) - self._segmented_button.delete(old_name) - self._segmented_button.insert(old_index, new_name) - - # name list - self._name_list.remove(old_name) - self._name_list.append(new_name) - - # tab dictionary - self._tab_dict[new_name] = self._tab_dict.pop(old_name) - - def delete(self, name: str): - """ delete tab by name """ - - if name in self._tab_dict: - self._name_list.remove(name) - self._tab_dict[name].grid_forget() - self._tab_dict.pop(name) - self._segmented_button.delete(name) - - # set current_name to '' and remove segmented button if no tab is left - if len(self._name_list) == 0: - self._current_name = "" - self._segmented_button.grid_forget() - - # if only one tab left, select this tab - elif len(self._name_list) == 1: - self._current_name = self._name_list[0] - self._segmented_button.set(self._current_name) - self._grid_forget_all_tabs() - self._set_grid_current_tab() - - # more tabs are left - else: - # if current_name is deleted tab, select first tab at position 0 - if self._current_name == name: - self.set(self._name_list[0]) - else: - raise ValueError(f"CTkTabview has no tab named '{name}'") - - def set(self, name: str): - """ select tab by name """ - - if name in self._tab_dict: - self._current_name = name - self._segmented_button.set(name) - self._set_grid_current_tab() - self.after(100, lambda: self._grid_forget_all_tabs(exclude_name=name)) - else: - raise ValueError(f"CTkTabview has no tab named '{name}'") - - def get(self) -> str: - """ returns name of selected tab, returns empty string if no tab selected """ - return self._current_name diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_textbox.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_textbox.py deleted file mode 100644 index 4b3a165..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/ctk_textbox.py +++ /dev/null @@ -1,500 +0,0 @@ -import tkinter -from typing import Union, Tuple, Optional, Callable, Any - -from .core_rendering import CTkCanvas -from .ctk_scrollbar import CTkScrollbar -from .theme import ThemeManager -from .core_rendering import DrawEngine -from .core_widget_classes import CTkBaseClass -from .font import CTkFont -from .utility import pop_from_dict_by_set, check_kwargs_empty - - -class CTkTextbox(CTkBaseClass): - """ - Textbox with x and y scrollbars, rounded corners, and all text features of tkinter.Text widget. - Scrollbars only appear when they are needed. Text is wrapped on line end by default, - set wrap='none' to disable automatic line wrapping. - For detailed information check out the documentation. - - Detailed methods and parameters of the underlaying tkinter.Text widget can be found here: - https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/text.html - (most of them are implemented here too) - """ - - _scrollbar_update_time = 200 # interval in ms, to check if scrollbars are needed - - # attributes that are passed to and managed by the tkinter textbox only: - _valid_tk_text_attributes = {"autoseparators", "cursor", "exportselection", - "insertborderwidth", "insertofftime", "insertontime", "insertwidth", - "maxundo", "padx", "pady", "selectborderwidth", "spacing1", - "spacing2", "spacing3", "state", "tabs", "takefocus", "undo", "wrap", - "xscrollcommand", "yscrollcommand"} - - def __init__(self, - master: any, - width: int = 200, - height: int = 200, - corner_radius: Optional[int] = None, - border_width: Optional[int] = None, - border_spacing: int = 3, - - bg_color: Union[str, Tuple[str, str]] = "transparent", - fg_color: Optional[Union[str, Tuple[str, str]]] = None, - border_color: Optional[Union[str, Tuple[str, str]]] = None, - text_color: Optional[Union[str, str]] = None, - scrollbar_button_color: Optional[Union[str, Tuple[str, str]]] = None, - scrollbar_button_hover_color: Optional[Union[str, Tuple[str, str]]] = None, - - font: Optional[Union[tuple, CTkFont]] = None, - activate_scrollbars: bool = True, - **kwargs): - - # transfer basic functionality (_bg_color, size, __appearance_mode, scaling) to CTkBaseClass - super().__init__(master=master, bg_color=bg_color, width=width, height=height) - - # color - self._fg_color = ThemeManager.theme["CTkTextbox"]["fg_color"] if fg_color is None else self._check_color_type(fg_color, transparency=True) - self._border_color = ThemeManager.theme["CTkTextbox"]["border_color"] if border_color is None else self._check_color_type(border_color) - self._text_color = ThemeManager.theme["CTkTextbox"]["text_color"] if text_color is None else self._check_color_type(text_color) - self._scrollbar_button_color = ThemeManager.theme["CTkTextbox"]["scrollbar_button_color"] if scrollbar_button_color is None else self._check_color_type(scrollbar_button_color) - self._scrollbar_button_hover_color = ThemeManager.theme["CTkTextbox"]["scrollbar_button_hover_color"] if scrollbar_button_hover_color is None else self._check_color_type(scrollbar_button_hover_color) - - # shape - self._corner_radius = ThemeManager.theme["CTkTextbox"]["corner_radius"] if corner_radius is None else corner_radius - self._border_width = ThemeManager.theme["CTkTextbox"]["border_width"] if border_width is None else border_width - self._border_spacing = border_spacing - - # font - self._font = CTkFont() if font is None else self._check_font_type(font) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - self._canvas = CTkCanvas(master=self, - highlightthickness=0, - width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._canvas.grid(row=0, column=0, rowspan=2, columnspan=2, sticky="nsew") - self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - self._draw_engine = DrawEngine(self._canvas) - - self._textbox = tkinter.Text(self, - fg=self._apply_appearance_mode(self._text_color), - width=0, - height=0, - font=self._apply_font_scaling(self._font), - highlightthickness=0, - relief="flat", - insertbackground=self._apply_appearance_mode(self._text_color), - **pop_from_dict_by_set(kwargs, self._valid_tk_text_attributes)) - - check_kwargs_empty(kwargs, raise_error=True) - - # scrollbars - self._scrollbars_activated = activate_scrollbars - self._hide_x_scrollbar = True - self._hide_y_scrollbar = True - - self._y_scrollbar = CTkScrollbar(self, - width=8, - height=0, - border_spacing=0, - fg_color=self._fg_color, - button_color=self._scrollbar_button_color, - button_hover_color=self._scrollbar_button_hover_color, - orientation="vertical", - command=self._textbox.yview) - self._textbox.configure(yscrollcommand=self._y_scrollbar.set) - - self._x_scrollbar = CTkScrollbar(self, - height=8, - width=0, - border_spacing=0, - fg_color=self._fg_color, - button_color=self._scrollbar_button_color, - button_hover_color=self._scrollbar_button_hover_color, - orientation="horizontal", - command=self._textbox.xview) - self._textbox.configure(xscrollcommand=self._x_scrollbar.set) - - self._create_grid_for_text_and_scrollbars(re_grid_textbox=True, re_grid_x_scrollbar=True, re_grid_y_scrollbar=True) - - self.after(50, self._check_if_scrollbars_needed, None, True) - self._draw() - - def _create_grid_for_text_and_scrollbars(self, re_grid_textbox=False, re_grid_x_scrollbar=False, re_grid_y_scrollbar=False): - - # configure 2x2 grid - self.grid_rowconfigure(0, weight=1) - self.grid_rowconfigure(1, weight=0, minsize=self._apply_widget_scaling(max(self._corner_radius, self._border_width + self._border_spacing))) - self.grid_columnconfigure(0, weight=1) - self.grid_columnconfigure(1, weight=0, minsize=self._apply_widget_scaling(max(self._corner_radius, self._border_width + self._border_spacing))) - - if re_grid_textbox: - self._textbox.grid(row=0, column=0, rowspan=1, columnspan=1, sticky="nsew", - padx=(self._apply_widget_scaling(max(self._corner_radius, self._border_width + self._border_spacing)), 0), - pady=(self._apply_widget_scaling(max(self._corner_radius, self._border_width + self._border_spacing)), 0)) - - if re_grid_x_scrollbar: - if not self._hide_x_scrollbar and self._scrollbars_activated: - self._x_scrollbar.grid(row=1, column=0, rowspan=1, columnspan=1, sticky="ewn", - pady=(3, self._border_spacing + self._border_width), - padx=(max(self._corner_radius, self._border_width + self._border_spacing), 0)) # scrollbar grid method without scaling - else: - self._x_scrollbar.grid_forget() - - if re_grid_y_scrollbar: - if not self._hide_y_scrollbar and self._scrollbars_activated: - self._y_scrollbar.grid(row=0, column=1, rowspan=1, columnspan=1, sticky="nsw", - padx=(3, self._border_spacing + self._border_width), - pady=(max(self._corner_radius, self._border_width + self._border_spacing), 0)) # scrollbar grid method without scaling - else: - self._y_scrollbar.grid_forget() - - def _check_if_scrollbars_needed(self, event=None, continue_loop: bool = False): - """ Method hides or places the scrollbars if they are needed on key release event of tkinter.text widget """ - - if self._scrollbars_activated: - if self._textbox.xview() != (0.0, 1.0) and not self._x_scrollbar.winfo_ismapped(): # x scrollbar needed - self._hide_x_scrollbar = False - self._create_grid_for_text_and_scrollbars(re_grid_x_scrollbar=True) - elif self._textbox.xview() == (0.0, 1.0) and self._x_scrollbar.winfo_ismapped(): # x scrollbar not needed - self._hide_x_scrollbar = True - self._create_grid_for_text_and_scrollbars(re_grid_x_scrollbar=True) - - if self._textbox.yview() != (0.0, 1.0) and not self._y_scrollbar.winfo_ismapped(): # y scrollbar needed - self._hide_y_scrollbar = False - self._create_grid_for_text_and_scrollbars(re_grid_y_scrollbar=True) - elif self._textbox.yview() == (0.0, 1.0) and self._y_scrollbar.winfo_ismapped(): # y scrollbar not needed - self._hide_y_scrollbar = True - self._create_grid_for_text_and_scrollbars(re_grid_y_scrollbar=True) - else: - self._hide_x_scrollbar = False - self._hide_x_scrollbar = False - self._create_grid_for_text_and_scrollbars(re_grid_y_scrollbar=True) - - if self._textbox.winfo_exists() and continue_loop is True: - self.after(self._scrollbar_update_time, lambda: self._check_if_scrollbars_needed(continue_loop=True)) - - def _set_scaling(self, *args, **kwargs): - super()._set_scaling(*args, **kwargs) - - self._textbox.configure(font=self._apply_font_scaling(self._font)) - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._create_grid_for_text_and_scrollbars(re_grid_textbox=True, re_grid_x_scrollbar=True, re_grid_y_scrollbar=True) - self._draw(no_color_updates=True) - - def _set_dimensions(self, width=None, height=None): - super()._set_dimensions(width, height) - - self._canvas.configure(width=self._apply_widget_scaling(self._desired_width), - height=self._apply_widget_scaling(self._desired_height)) - self._draw() - - def _update_font(self): - """ pass font to tkinter widgets with applied font scaling and update grid with workaround """ - self._textbox.configure(font=self._apply_font_scaling(self._font)) - - # Workaround to force grid to be resized when text changes size. - # Otherwise grid will lag and only resizes if other mouse action occurs. - self._canvas.grid_forget() - self._canvas.grid(row=0, column=0, rowspan=2, columnspan=2, sticky="nsew") - - def destroy(self): - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - - super().destroy() - - def _draw(self, no_color_updates=False): - super()._draw(no_color_updates) - - if not self._canvas.winfo_exists(): - return - - requires_recoloring = self._draw_engine.draw_rounded_rect_with_border(self._apply_widget_scaling(self._current_width), - self._apply_widget_scaling(self._current_height), - self._apply_widget_scaling(self._corner_radius), - self._apply_widget_scaling(self._border_width)) - - if no_color_updates is False or requires_recoloring: - if self._fg_color == "transparent": - self._canvas.itemconfig("inner_parts", - fill=self._apply_appearance_mode(self._bg_color), - outline=self._apply_appearance_mode(self._bg_color)) - self._textbox.configure(fg=self._apply_appearance_mode(self._text_color), - bg=self._apply_appearance_mode(self._bg_color), - insertbackground=self._apply_appearance_mode(self._text_color)) - self._x_scrollbar.configure(fg_color=self._bg_color, button_color=self._scrollbar_button_color, - button_hover_color=self._scrollbar_button_hover_color) - self._y_scrollbar.configure(fg_color=self._bg_color, button_color=self._scrollbar_button_color, - button_hover_color=self._scrollbar_button_hover_color) - else: - self._canvas.itemconfig("inner_parts", - fill=self._apply_appearance_mode(self._fg_color), - outline=self._apply_appearance_mode(self._fg_color)) - self._textbox.configure(fg=self._apply_appearance_mode(self._text_color), - bg=self._apply_appearance_mode(self._fg_color), - insertbackground=self._apply_appearance_mode(self._text_color)) - self._x_scrollbar.configure(fg_color=self._fg_color, button_color=self._scrollbar_button_color, - button_hover_color=self._scrollbar_button_hover_color) - self._y_scrollbar.configure(fg_color=self._fg_color, button_color=self._scrollbar_button_color, - button_hover_color=self._scrollbar_button_hover_color) - - self._canvas.itemconfig("border_parts", - fill=self._apply_appearance_mode(self._border_color), - outline=self._apply_appearance_mode(self._border_color)) - self._canvas.configure(bg=self._apply_appearance_mode(self._bg_color)) - - self._canvas.tag_lower("inner_parts") - self._canvas.tag_lower("border_parts") - - def configure(self, require_redraw=False, **kwargs): - if "fg_color" in kwargs: - self._fg_color = self._check_color_type(kwargs.pop("fg_color"), transparency=True) - require_redraw = True - - # check if CTk widgets are children of the frame and change their _bg_color to new frame fg_color - for child in self.winfo_children(): - if isinstance(child, CTkBaseClass) and hasattr(child, "_fg_color"): - child.configure(bg_color=self._fg_color) - - if "border_color" in kwargs: - self._border_color = self._check_color_type(kwargs.pop("border_color")) - require_redraw = True - - if "text_color" in kwargs: - self._text_color = self._check_color_type(kwargs.pop("text_color")) - require_redraw = True - - if "scrollbar_button_color" in kwargs: - self._scrollbar_button_color = self._check_color_type(kwargs.pop("scrollbar_button_color")) - self._x_scrollbar.configure(button_color=self._scrollbar_button_color) - self._y_scrollbar.configure(button_color=self._scrollbar_button_color) - - if "scrollbar_button_hover_color" in kwargs: - self._scrollbar_button_hover_color = self._check_color_type(kwargs.pop("scrollbar_button_hover_color")) - self._x_scrollbar.configure(button_hover_color=self._scrollbar_button_hover_color) - self._y_scrollbar.configure(button_hover_color=self._scrollbar_button_hover_color) - - if "corner_radius" in kwargs: - self._corner_radius = kwargs.pop("corner_radius") - self._create_grid_for_text_and_scrollbars(re_grid_textbox=True, re_grid_x_scrollbar=True, re_grid_y_scrollbar=True) - require_redraw = True - - if "border_width" in kwargs: - self._border_width = kwargs.pop("border_width") - self._create_grid_for_text_and_scrollbars(re_grid_textbox=True, re_grid_x_scrollbar=True, re_grid_y_scrollbar=True) - require_redraw = True - - if "border_spacing" in kwargs: - self._border_spacing = kwargs.pop("border_spacing") - self._create_grid_for_text_and_scrollbars(re_grid_textbox=True, re_grid_x_scrollbar=True, re_grid_y_scrollbar=True) - require_redraw = True - - if "font" in kwargs: - if isinstance(self._font, CTkFont): - self._font.remove_size_configure_callback(self._update_font) - self._font = self._check_font_type(kwargs.pop("font")) - if isinstance(self._font, CTkFont): - self._font.add_size_configure_callback(self._update_font) - - self._update_font() - - self._textbox.configure(**pop_from_dict_by_set(kwargs, self._valid_tk_text_attributes)) - super().configure(require_redraw=require_redraw, **kwargs) - - def cget(self, attribute_name: str) -> any: - if attribute_name == "corner_radius": - return self._corner_radius - elif attribute_name == "border_width": - return self._border_width - elif attribute_name == "border_spacing": - return self._border_spacing - - elif attribute_name == "fg_color": - return self._fg_color - elif attribute_name == "border_color": - return self._border_color - elif attribute_name == "text_color": - return self._text_color - - elif attribute_name == "font": - return self._font - - else: - return super().cget(attribute_name) - - def bind(self, sequence: str = None, command: Callable = None, add: Union[str, bool] = True): - """ called on the tkinter.Canvas """ - if not (add == "+" or add is True): - raise ValueError("'add' argument can only be '+' or True to preserve internal callbacks") - self._textbox.bind(sequence, command, add=True) - - def unbind(self, sequence: str = None, funcid: str = None): - """ called on the tkinter.Label and tkinter.Canvas """ - if funcid is not None: - raise ValueError("'funcid' argument can only be None, because there is a bug in" + - " tkinter and its not clear whether the internal callbacks will be unbinded or not") - self._textbox.unbind(sequence, None) - - def focus(self): - return self._textbox.focus() - - def focus_set(self): - return self._textbox.focus_set() - - def focus_force(self): - return self._textbox.focus_force() - - def insert(self, index, text, tags=None): - return self._textbox.insert(index, text, tags) - - def get(self, index1, index2=None): - return self._textbox.get(index1, index2) - - def bbox(self, index): - return self._textbox.bbox(index) - - def compare(self, index, op, index2): - return self._textbox.compare(index, op, index2) - - def delete(self, index1, index2=None): - return self._textbox.delete(index1, index2) - - def dlineinfo(self, index): - return self._textbox.dlineinfo(index) - - def edit_modified(self, arg=None): - return self._textbox.edit_modified(arg) - - def edit_redo(self): - self._check_if_scrollbars_needed() - return self._textbox.edit_redo() - - def edit_reset(self): - return self._textbox.edit_reset() - - def edit_separator(self): - return self._textbox.edit_separator() - - def edit_undo(self): - self._check_if_scrollbars_needed() - return self._textbox.edit_undo() - - def image_create(self, index, **kwargs): - raise AttributeError("embedding images is forbidden, because would be incompatible with scaling") - - def image_cget(self, index, option): - raise AttributeError("embedding images is forbidden, because would be incompatible with scaling") - - def image_configure(self, index): - raise AttributeError("embedding images is forbidden, because would be incompatible with scaling") - - def image_names(self): - raise AttributeError("embedding images is forbidden, because would be incompatible with scaling") - - def index(self, i): - return self._textbox.index(i) - - def mark_gravity(self, mark, gravity=None): - return self._textbox.mark_gravity(mark, gravity) - - def mark_names(self): - return self._textbox.mark_names() - - def mark_next(self, index): - return self._textbox.mark_next(index) - - def mark_previous(self, index): - return self._textbox.mark_previous(index) - - def mark_set(self, mark, index): - return self._textbox.mark_set(mark, index) - - def mark_unset(self, mark): - return self._textbox.mark_unset(mark) - - def scan_dragto(self, x, y): - return self._textbox.scan_dragto(x, y) - - def scan_mark(self, x, y): - return self._textbox.scan_mark(x, y) - - def search(self, pattern, index, *args, **kwargs): - return self._textbox.search(pattern, index, *args, **kwargs) - - def see(self, index): - return self._textbox.see(index) - - def tag_add(self, tagName, index1, index2=None): - return self._textbox.tag_add(tagName, index1, index2) - - def tag_bind(self, tagName, sequence, func, add=None): - return self._textbox.tag_bind(tagName, sequence, func, add) - - def tag_cget(self, tagName, option): - return self._textbox.tag_cget(tagName, option) - - def tag_config(self, tagName, **kwargs): - if "font" in kwargs: - raise AttributeError("'font' option forbidden, because would be incompatible with scaling") - return self._textbox.tag_config(tagName, **kwargs) - - def tag_delete(self, *tagName): - return self._textbox.tag_delete(*tagName) - - def tag_lower(self, tagName, belowThis=None): - return self._textbox.tag_lower(tagName, belowThis) - - def tag_names(self, index=None): - return self._textbox.tag_names(index) - - def tag_nextrange(self, tagName, index1, index2=None): - return self._textbox.tag_nextrange(tagName, index1, index2) - - def tag_prevrange(self, tagName, index1, index2=None): - return self._textbox.tag_prevrange(tagName, index1, index2) - - def tag_raise(self, tagName, aboveThis=None): - return self._textbox.tag_raise(tagName, aboveThis) - - def tag_ranges(self, tagName): - return self._textbox.tag_ranges(tagName) - - def tag_remove(self, tagName, index1, index2=None): - return self._textbox.tag_remove(tagName, index1, index2) - - def tag_unbind(self, tagName, sequence, funcid=None): - return self._textbox.tag_unbind(tagName, sequence, funcid) - - def window_cget(self, index, option): - raise AttributeError("embedding widgets is forbidden, would probably cause all kinds of problems ;)") - - def window_configure(self, index, option): - raise AttributeError("embedding widgets is forbidden, would probably cause all kinds of problems ;)") - - def window_create(self, index, **kwargs): - raise AttributeError("embedding widgets is forbidden, would probably cause all kinds of problems ;)") - - def window_names(self): - raise AttributeError("embedding widgets is forbidden, would probably cause all kinds of problems ;)") - - def xview(self, *args): - return self._textbox.xview(*args) - - def xview_moveto(self, fraction): - return self._textbox.xview_moveto(fraction) - - def xview_scroll(self, n, what): - return self._textbox.xview_scroll(n, what) - - def yview(self, *args): - return self._textbox.yview(*args) - - def yview_moveto(self, fraction): - return self._textbox.yview_moveto(fraction) - - def yview_scroll(self, n, what): - return self._textbox.yview_scroll(n, what) diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/font/__init__.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/font/__init__.py deleted file mode 100644 index 64a49f1..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/font/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -import os -import sys - -from .ctk_font import CTkFont -from .font_manager import FontManager - -# import DrawEngine to set preferred_drawing_method if loading shapes font fails -from ..core_rendering import DrawEngine - -FontManager.init_font_manager() - -# load Roboto fonts (used on Windows/Linux) -customtkinter_directory = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) -FontManager.load_font(os.path.join(customtkinter_directory, "assets", "fonts", "Roboto", "Roboto-Regular.ttf")) -FontManager.load_font(os.path.join(customtkinter_directory, "assets", "fonts", "Roboto", "Roboto-Medium.ttf")) - -# load font necessary for rendering the widgets (used on Windows/Linux) -if FontManager.load_font(os.path.join(customtkinter_directory, "assets", "fonts", "CustomTkinter_shapes_font.otf")) is False: - # change draw method if font loading failed - if DrawEngine.preferred_drawing_method == "font_shapes": - sys.stderr.write("customtkinter.windows.widgets.font warning: " + - "Preferred drawing method 'font_shapes' can not be used because the font file could not be loaded.\n" + - "Using 'circle_shapes' instead. The rendering quality will be bad!\n") - DrawEngine.preferred_drawing_method = "circle_shapes" diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/font/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/font/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 95bf8c1a188c37e4b6052bd53be42a1f7357f587..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1919 zcmc&yOK2oT7_OdIPi8XNO=KqzH>QoOVAQ00?)ISatAe3Oh~PkHoh3V>Sx0w`EO=}JKnU<#(Kl$}=60$_T^%Gg;Y z%k(VFSvgx&L;<7#$~N-};2u-%CmSFD1eycM_HN80*(LIS@JOOgD8v#C?g@-LTix-b zJEat7WGKPui|g zBsR|`=WwXSdJF)30SV3F#Cmrm(N0Tv=I^n?vq;qb!V*?kr*_xO@G-x7s;-a z4s<(&N!VZvs@zrT=-4rx#)9+~Ms)ZY8(5HNBe!rbkq zr&}i7k~*ek@yBX9e6|pk`Yz8r6{TDfrO6hF@&;|idBD6mqQRK7-7N#=-5m`XE=Jm) zFJO@yhfT+%@jb2Q9A(-%U5`X)Vn?@8Bt;2|5y~RPQMQ9kioOJo7#r|-*H}>32*N}~7$RG;J)+mt8)%an zmg_-v$!&QyVx?DCsK=W^UAp?}+v@5|b8~a*{JgZ{)+wtfQs?HS*Vo=qDL>E}o~c$h zkh7t_Y1UN2-n-b=jTY-rqV|O%_gaL>xJ6{1MOoA0Bx%+5*5mxkwhKKAUBVLM%e$X^ z$o?m3K@g6>z)t)ffx=GwJp_|}|2zU0{Qh~81HubFsGOec-cB(DlL43t!ITfCnA6jf zcPhK`ZTa5x*OhPNujKvd?<+sZ-^mBlKUaQ{f0BJg4Hf-?Vje1{-^77JLWKm^Xn2hV z3tqV31+yFB>_#xr2`4%}7(D{#_#5Xwu6@?HWqoS-&n@g<{jqVd>AzzKWhX2<0dPa$ z`oR4cS1TynVc8CV69UHv4kMZw-&qXPW1o-Q8Qnd9`@H}BEBl)VqyF;EU>t|zI7pK) zP5jP#ewxpR;&3R=-m?$IMPFPz$`?N>Jjjn7=EqJzYC;o!1F3;`h2P^pvoM{#AYb~R X5awU><9Sj7nfHYli6h`=SWW%_D1rC} diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/font/__pycache__/ctk_font.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/font/__pycache__/ctk_font.cpython-311.pyc deleted file mode 100644 index 06d54e2cc02f23b27cb57741a715536409f82bdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6684 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 diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/font/__pycache__/font_manager.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/font/__pycache__/font_manager.cpython-311.pyc deleted file mode 100644 index 2c81bb13131433bd582609640d2b3d3d674044f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4074 zcmcImTTC1275-<&V|)!J=3*RZhmb7s5-^u06gI6yxNOiSq~a2^tR>5M#$>>r@%}Rt z1F|Eu;voALn~1=NvX0AJf>AErP)60Lo0dENT5-XB31j4H?PvFt337mW8(|i z?d4(rvCn_zod2BvcFs5FH(sv`K@+-un)sUop}&)t<7O){ug8ITfOy1HNwiq(sYS|q zrx$7H=_He~E!rqVqxTWdY$4wEghuEo{EKao<*8W|VqcNh=@4bI^O7h_@sir=tc3vg z`V$}zkbuY(;GSA!1RGCpp(h}JY7Hf1kp-!TX9c@ZCpZ#xYgxnF1t(tze}~{qIC$q4 zd&1HMmaI@`>217g%XUKV=H0MZuj!tYCG|#3iY*Ix!+AH{n}ByE9H+`tAyfxE1OL~5 z0qFyzR;gCX<95miQKg3Cd;%k$mPg?~JCSOyj959o0JOtaq!sR4##VW#jLo7IvQn$n z&RYAXTvp5D5L$tdD7NonE(!u?7Ih-^^zkeRokRFXIjZIqkK+RExGUo-9M7ngt4G-r zXSx9cc^jd%`=ro^5Xd>|F2%F6B`!l{&>Hh0%1~roA^Wt+CPhhGn|tH03ItBTSjHpV z8_G2aF~TV8is?uvV`@UiDbuB>F{~;XQN3-_vSQlOG2mEH;YDn^gtc@`;x$FUX1(P) zN+K#+9FtllW1JIfaUrcja+r2Sa^F#aRhn_LU4?ob)UpLNQ*IRBF zEjJ2?YM7*s8k_H5`{m3p77p6O`|aU9#^@W<+sBRealLWEXq?D5P8_zJ*;c%hnD`?!3^e5)e6N7tq2@>2N zjx8kx(~bpI!&1DA4B(FByM;iig+M$+ZxW@boGnG?*c6kqr);@8$TcSC;B7glT9rjv zO7(zssntR@4$vrDcQT)HuB@$sBo%zfxuq*7JXdA)H+Z)H7tiIa2ha6t%kdf^o7vh- z{)EcXn9e#Ril?%SLT892o8kt5{2}_Y`xhhr~gTDD@mC*FPSvi zrFASM%%(UNAZntTB*tZ4h%RY~1i(#WNembwO3NkbD<8Oc#R1uPryO_$KU8i>;N%3S zuBQcVX1PB*)^J>ySR2L7#N=(og6W)t872tUnzkibPMSXAUZTVbcJYR$*Tv}9ASTor~GPbOk^^ka$ zQi;Mafmcq!JX}q~>7m!U~M-M4U$ElsWMYI`5);ZY+z`ux%t9eVJ(5xjn{{;1yn^Rb8ZyA66{ zx6#yt*nX*HOQ>P^_i`AVFuf|FMn=WYJDJvyW{_p9O5>na^ys zxj*~=Rc$Bm2X8^u=B&)JQm)l%(Y1n_JLRgXVg+kMD`hXW2vdtb<*KQ%Vr^ATbj_KS zQGTZi;VTxry$0jx+8M2?sqR~=Ci*U%qE$5kS5-BEEaaFr83^~e$q-$YpyYNj*)}G7 zge)fTj>#G^SsuO&1nQmJnkptuTU<`BV=s}Dgu?`-a04NJLdd>x6CngULQEARkguyk zZXR;9n3>K>Mm7=XDOK~mWpO_-F@c<{GcM`wkl_v$&?#r@p}+aSe_`K$VYl_!_!ske z{{`JYYxrmLo>?ePPBnZQIq;s__nzBX(7io|x2J$y&ej6WLUH12zVCiG^%y_O9CQuu zcMU)5G)8XdUDHO_wC=lU_-^KXH^0lGqjmd|RdoC*Fm$y6y=ZWa1(+9S2FCo%=YAIW z=@1QfH(WvQ)MpH7cB?<3|MnBeK$)d)(1JfN(#uOzbsJCSv2jSo_IdJPP zaENfdgpdoxSAhH$;UU5koWvwGEJETz`3%Tr`FYvgv3c_)>nqS+Hc&u7zG9HQVe6x! z;CsLqXg>>Q3uO2F9MNw|i+Fg~^5tV&cRC9Qy4`bD zS0UxmpsYxX8zFlL*^2>e#pnnKOgnrJ;lo-y3u~LBAg*lvjpIu3P=AcaKtT{q;eiww rilPpYYtwoTk#o~}4v}}$dJa(_U;8WA-=knrZ>uBtuvYPJX=b+3 diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/font/ctk_font.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/font/ctk_font.py deleted file mode 100644 index e0eca0d..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/font/ctk_font.py +++ /dev/null @@ -1,94 +0,0 @@ -from tkinter.font import Font -import copy -from typing import List, Callable, Tuple, Optional -try: - from typing import Literal -except ImportError: - from typing_extensions import Literal - -from ..theme import ThemeManager - - -class CTkFont(Font): - """ - Font object with size in pixel, independent of scaling. - To get scaled tuple representation use create_scaled_tuple() method. - - family The font family name as a string. - size The font height as an integer in pixel. - weight 'bold' for boldface, 'normal' for regular weight. - slant 'italic' for italic, 'roman' for unslanted. - underline 1 for underlined text, 0 for normal. - overstrike 1 for overstruck text, 0 for normal. - - Tkinter Font: https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/fonts.html - """ - - def __init__(self, - family: Optional[str] = None, - size: Optional[int] = None, - weight: Literal["normal", "bold"] = None, - slant: Literal["italic", "roman"] = "roman", - underline: bool = False, - overstrike: bool = False): - - self._size_configure_callback_list: List[Callable] = [] - - self._size = ThemeManager.theme["CTkFont"]["size"] if size is None else size - - super().__init__(family=ThemeManager.theme["CTkFont"]["family"] if family is None else family, - size=-abs(self._size), - weight=ThemeManager.theme["CTkFont"]["weight"] if weight is None else weight, - slant=slant, - underline=underline, - overstrike=overstrike) - - self._family = super().cget("family") - self._tuple_style_string = f"{super().cget('weight')} {slant} {'underline' if underline else ''} {'overstrike' if overstrike else ''}" - - def add_size_configure_callback(self, callback: Callable): - """ add function, that gets called when font got configured """ - self._size_configure_callback_list.append(callback) - - def remove_size_configure_callback(self, callback: Callable): - """ remove function, that gets called when font got configured """ - try: - self._size_configure_callback_list.remove(callback) - except ValueError: - pass - - def create_scaled_tuple(self, font_scaling: float) -> Tuple[str, int, str]: - """ return scaled tuple representation of font in the form (family: str, size: int, style: str)""" - return self._family, round(-abs(self._size) * font_scaling), self._tuple_style_string - - def config(self, *args, **kwargs): - raise AttributeError("'config' is not implemented for CTk widgets. For consistency, always use 'configure' instead.") - - def configure(self, **kwargs): - if "size" in kwargs: - self._size = kwargs.pop("size") - super().configure(size=-abs(self._size)) - - if "family" in kwargs: - super().configure(family=kwargs.pop("family")) - self._family = super().cget("family") - - super().configure(**kwargs) - - # update style string for create_scaled_tuple() method - self._tuple_style_string = f"{super().cget('weight')} {super().cget('slant')} {'underline' if super().cget('underline') else ''} {'overstrike' if super().cget('overstrike') else ''}" - - # call all functions registered with add_size_configure_callback() - for callback in self._size_configure_callback_list: - callback() - - def cget(self, attribute_name: str) -> any: - if attribute_name == "size": - return self._size - if attribute_name == "family": - return self._family - else: - return super().cget(attribute_name) - - def copy(self) -> "CTkFont": - return copy.deepcopy(self) diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/font/font_manager.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/font/font_manager.py deleted file mode 100644 index b3ef369..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/font/font_manager.py +++ /dev/null @@ -1,66 +0,0 @@ -import sys -import os -import shutil -from typing import Union - - -class FontManager: - - linux_font_path = "~/.fonts/" - - @classmethod - def init_font_manager(cls): - # Linux - if sys.platform.startswith("linux"): - try: - if not os.path.isdir(os.path.expanduser(cls.linux_font_path)): - os.mkdir(os.path.expanduser(cls.linux_font_path)) - return True - except Exception as err: - sys.stderr.write("FontManager error: " + str(err) + "\n") - return False - - # other platforms - else: - return True - - @classmethod - def windows_load_font(cls, font_path: Union[str, bytes], private: bool = True, enumerable: bool = False) -> bool: - """ Function taken from: https://stackoverflow.com/questions/11993290/truly-custom-font-in-tkinter/30631309#30631309 """ - - from ctypes import windll, byref, create_unicode_buffer, create_string_buffer - - FR_PRIVATE = 0x10 - FR_NOT_ENUM = 0x20 - - if isinstance(font_path, bytes): - path_buffer = create_string_buffer(font_path) - add_font_resource_ex = windll.gdi32.AddFontResourceExA - elif isinstance(font_path, str): - path_buffer = create_unicode_buffer(font_path) - add_font_resource_ex = windll.gdi32.AddFontResourceExW - else: - raise TypeError('font_path must be of type bytes or str') - - flags = (FR_PRIVATE if private else 0) | (FR_NOT_ENUM if not enumerable else 0) - num_fonts_added = add_font_resource_ex(byref(path_buffer), flags, 0) - return bool(min(num_fonts_added, 1)) - - @classmethod - def load_font(cls, font_path: str) -> bool: - # Windows - if sys.platform.startswith("win"): - return cls.windows_load_font(font_path, private=True, enumerable=False) - - # Linux - elif sys.platform.startswith("linux"): - try: - shutil.copy(font_path, os.path.expanduser(cls.linux_font_path)) - return True - except Exception as err: - sys.stderr.write("FontManager error: " + str(err) + "\n") - return False - - # macOS and others - else: - return False diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/image/__init__.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/image/__init__.py deleted file mode 100644 index b712c89..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/image/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .ctk_image import CTkImage diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/image/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/image/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 3b7d776a20056059855224d4ff3ba86a94ccdde9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 325 zcmZusJxjzu5Zz5cqHvA9m`+l7Ni0Py^gs{fn%p7CK*(k1!jf$E*pG|;3@ckZ@!wd= zwN`e*byv9&?R*ULW_ZKQo0q|0k2v7b<05qY(Kmnaev8e%E1n1=j5b8jJ4y-jG7|Zp z)Cmz?2ba@&EQ$&zk+S7KPyfH07p?2KFH&g6huK)l5 diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/image/__pycache__/ctk_image.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/image/__pycache__/ctk_image.cpython-311.pyc deleted file mode 100644 index 38dcde0864192a97556fe02b69cc4b4340d792b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7638 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 Y{rHM5GXCfEJ9h)Q?`*UGk!iF43zqBlBme*a diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/image/ctk_image.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/image/ctk_image.py deleted file mode 100644 index 0247cdd..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/image/ctk_image.py +++ /dev/null @@ -1,122 +0,0 @@ -from typing import Tuple, Dict, Callable, List -try: - from PIL import Image, ImageTk -except ImportError: - pass - - -class CTkImage: - """ - Class to store one or two PIl.Image.Image objects and display size independent of scaling: - - light_image: PIL.Image.Image for light mode - dark_image: PIL.Image.Image for dark mode - size: tuple (, ) with display size for both images - - One of the two images can be None and will be replaced by the other image. - """ - - _checked_PIL_import = False - - def __init__(self, - light_image: "Image.Image" = None, - dark_image: "Image.Image" = None, - size: Tuple[int, int] = (20, 20)): - - if not self._checked_PIL_import: - self._check_pil_import() - - self._light_image = light_image - self._dark_image = dark_image - self._check_images() - self._size = size - - self._configure_callback_list: List[Callable] = [] - self._scaled_light_photo_images: Dict[Tuple[int, int], ImageTk.PhotoImage] = {} - self._scaled_dark_photo_images: Dict[Tuple[int, int], ImageTk.PhotoImage] = {} - - @classmethod - def _check_pil_import(cls): - try: - _, _ = Image, ImageTk - except NameError: - raise ImportError("PIL.Image and PIL.ImageTk couldn't be imported") - - def add_configure_callback(self, callback: Callable): - """ add function, that gets called when image got configured """ - self._configure_callback_list.append(callback) - - def remove_configure_callback(self, callback: Callable): - """ remove function, that gets called when image got configured """ - self._configure_callback_list.remove(callback) - - def configure(self, **kwargs): - if "light_image" in kwargs: - self._light_image = kwargs.pop("light_image") - self._scaled_light_photo_images = {} - self._check_images() - if "dark_image" in kwargs: - self._dark_image = kwargs.pop("dark_image") - self._scaled_dark_photo_images = {} - self._check_images() - if "size" in kwargs: - self._size = kwargs.pop("size") - - # call all functions registered with add_configure_callback() - for callback in self._configure_callback_list: - callback() - - def cget(self, attribute_name: str) -> any: - if attribute_name == "light_image": - return self._light_image - if attribute_name == "dark_image": - return self._dark_image - if attribute_name == "size": - return self._size - - def _check_images(self): - # check types - if self._light_image is not None and not isinstance(self._light_image, Image.Image): - raise ValueError(f"CTkImage: light_image must be instance if PIL.Image.Image, not {type(self._light_image)}") - if self._dark_image is not None and not isinstance(self._dark_image, Image.Image): - raise ValueError(f"CTkImage: dark_image must be instance if PIL.Image.Image, not {type(self._dark_image)}") - - # check values - if self._light_image is None and self._dark_image is None: - raise ValueError("CTkImage: No image given, light_image is None and dark_image is None.") - - # check sizes - if self._light_image is not None and self._dark_image is not None and self._light_image.size != self._dark_image.size: - raise ValueError(f"CTkImage: light_image size {self._light_image.size} must be the same as dark_image size {self._dark_image.size}.") - - def _get_scaled_size(self, widget_scaling: float) -> Tuple[int, int]: - return round(self._size[0] * widget_scaling), round(self._size[1] * widget_scaling) - - def _get_scaled_light_photo_image(self, scaled_size: Tuple[int, int]) -> "ImageTk.PhotoImage": - if scaled_size in self._scaled_light_photo_images: - return self._scaled_light_photo_images[scaled_size] - else: - self._scaled_light_photo_images[scaled_size] = ImageTk.PhotoImage(self._light_image.resize(scaled_size)) - return self._scaled_light_photo_images[scaled_size] - - def _get_scaled_dark_photo_image(self, scaled_size: Tuple[int, int]) -> "ImageTk.PhotoImage": - if scaled_size in self._scaled_dark_photo_images: - return self._scaled_dark_photo_images[scaled_size] - else: - self._scaled_dark_photo_images[scaled_size] = ImageTk.PhotoImage(self._dark_image.resize(scaled_size)) - return self._scaled_dark_photo_images[scaled_size] - - def create_scaled_photo_image(self, widget_scaling: float, appearance_mode: str) -> "ImageTk.PhotoImage": - scaled_size = self._get_scaled_size(widget_scaling) - - if appearance_mode == "light" and self._light_image is not None: - return self._get_scaled_light_photo_image(scaled_size) - elif appearance_mode == "light" and self._light_image is None: - return self._get_scaled_dark_photo_image(scaled_size) - - elif appearance_mode == "dark" and self._dark_image is not None: - return self._get_scaled_dark_photo_image(scaled_size) - elif appearance_mode == "dark" and self._dark_image is None: - return self._get_scaled_light_photo_image(scaled_size) - - diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/scaling/__init__.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/scaling/__init__.py deleted file mode 100644 index 8fc0db8..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/scaling/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -import sys - -from .scaling_base_class import CTkScalingBaseClass -from .scaling_tracker import ScalingTracker - -if sys.platform.startswith("win") and sys.getwindowsversion().build < 9000: # No automatic scaling on Windows < 8.1 - ScalingTracker.deactivate_automatic_dpi_awareness = True diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/scaling/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/scaling/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c1e1e9aa054ed676aaa9d8ed2fade9e0673bd30f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 734 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 Aga7~l diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/scaling/__pycache__/scaling_tracker.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/scaling/__pycache__/scaling_tracker.cpython-311.pyc deleted file mode 100644 index 66a5a65b5ae997fec3fa1b2424cf216c2dad5958..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9868 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 float: - return self.__widget_scaling - - def _get_window_scaling(self) -> float: - return self.__window_scaling - - def _apply_widget_scaling(self, value: Union[int, float]) -> Union[float]: - assert self.__scaling_type == "widget" - return value * self.__widget_scaling - - def _reverse_widget_scaling(self, value: Union[int, float]) -> Union[float]: - assert self.__scaling_type == "widget" - return value / self.__widget_scaling - - def _apply_window_scaling(self, value: Union[int, float]) -> int: - assert self.__scaling_type == "window" - return int(value * self.__window_scaling) - - def _reverse_window_scaling(self, scaled_value: Union[int, float]) -> int: - assert self.__scaling_type == "window" - return int(scaled_value / self.__window_scaling) - - def _apply_font_scaling(self, font: Union[Tuple, CTkFont]) -> tuple: - """ Takes CTkFont object and returns tuple font with scaled size, has to be called again for every change of font object """ - assert self.__scaling_type == "widget" - - if type(font) == tuple: - if len(font) == 1: - return font - elif len(font) == 2: - return font[0], -abs(round(font[1] * self.__widget_scaling)) - elif 3 <= len(font) <= 6: - return font[0], -abs(round(font[1] * self.__widget_scaling)), font[2:] - else: - raise ValueError(f"Can not scale font {font}. font needs to be tuple of len 1, 2 or 3") - - elif isinstance(font, CTkFont): - return font.create_scaled_tuple(self.__widget_scaling) - else: - raise ValueError(f"Can not scale font '{font}' of type {type(font)}. font needs to be tuple or instance of CTkFont") - - def _apply_argument_scaling(self, kwargs: dict) -> dict: - assert self.__scaling_type == "widget" - - scaled_kwargs = copy.copy(kwargs) - - # scale padding values - if "pady" in scaled_kwargs: - if isinstance(scaled_kwargs["pady"], (int, float)): - scaled_kwargs["pady"] = self._apply_widget_scaling(scaled_kwargs["pady"]) - elif isinstance(scaled_kwargs["pady"], tuple): - scaled_kwargs["pady"] = tuple([self._apply_widget_scaling(v) for v in scaled_kwargs["pady"]]) - if "padx" in kwargs: - if isinstance(scaled_kwargs["padx"], (int, float)): - scaled_kwargs["padx"] = self._apply_widget_scaling(scaled_kwargs["padx"]) - elif isinstance(scaled_kwargs["padx"], tuple): - scaled_kwargs["padx"] = tuple([self._apply_widget_scaling(v) for v in scaled_kwargs["padx"]]) - - # scaled x, y values for place geometry manager - if "x" in scaled_kwargs: - scaled_kwargs["x"] = self._apply_widget_scaling(scaled_kwargs["x"]) - if "y" in scaled_kwargs: - scaled_kwargs["y"] = self._apply_widget_scaling(scaled_kwargs["y"]) - - return scaled_kwargs - - @staticmethod - def _parse_geometry_string(geometry_string: str) -> tuple: - # index: 1 2 3 4 5 6 - # regex group structure: ('x', '', '', '+-+-', '-', '-') - result = re.search(r"((\d+)x(\d+)){0,1}(\+{0,1}([+-]{0,1}\d+)\+{0,1}([+-]{0,1}\d+)){0,1}", geometry_string) - - width = int(result.group(2)) if result.group(2) is not None else None - height = int(result.group(3)) if result.group(3) is not None else None - x = int(result.group(5)) if result.group(5) is not None else None - y = int(result.group(6)) if result.group(6) is not None else None - - return width, height, x, y - - def _apply_geometry_scaling(self, geometry_string: str) -> str: - assert self.__scaling_type == "window" - - width, height, x, y = self._parse_geometry_string(geometry_string) - - if x is None and y is None: # no and in geometry_string - return f"{round(width * self.__window_scaling)}x{round(height * self.__window_scaling)}" - - elif width is None and height is None: # no and in geometry_string - return f"+{x}+{y}" - - else: - return f"{round(width * self.__window_scaling)}x{round(height * self.__window_scaling)}+{x}+{y}" - - def _reverse_geometry_scaling(self, scaled_geometry_string: str) -> str: - assert self.__scaling_type == "window" - - width, height, x, y = self._parse_geometry_string(scaled_geometry_string) - - if x is None and y is None: # no and in geometry_string - return f"{round(width / self.__window_scaling)}x{round(height / self.__window_scaling)}" - - elif width is None and height is None: # no and in geometry_string - return f"+{x}+{y}" - - else: - return f"{round(width / self.__window_scaling)}x{round(height / self.__window_scaling)}+{x}+{y}" diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/scaling/scaling_tracker.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/scaling/scaling_tracker.py deleted file mode 100644 index d3627c2..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/scaling/scaling_tracker.py +++ /dev/null @@ -1,206 +0,0 @@ -import tkinter -import sys -from typing import Callable - - -class ScalingTracker: - deactivate_automatic_dpi_awareness = False - - window_widgets_dict = {} # contains window objects as keys with list of widget callbacks as elements - window_dpi_scaling_dict = {} # contains window objects as keys and corresponding scaling factors - - widget_scaling = 1 # user values which multiply to detected window scaling factor - window_scaling = 1 - - update_loop_running = False - update_loop_interval = 100 # ms - loop_pause_after_new_scaling = 1500 # ms - - @classmethod - def get_widget_scaling(cls, widget) -> float: - window_root = cls.get_window_root_of_widget(widget) - return cls.window_dpi_scaling_dict[window_root] * cls.widget_scaling - - @classmethod - def get_window_scaling(cls, window) -> float: - window_root = cls.get_window_root_of_widget(window) - return cls.window_dpi_scaling_dict[window_root] * cls.window_scaling - - @classmethod - def set_widget_scaling(cls, widget_scaling_factor: float): - cls.widget_scaling = max(widget_scaling_factor, 0.4) - cls.update_scaling_callbacks_all() - - @classmethod - def set_window_scaling(cls, window_scaling_factor: float): - cls.window_scaling = max(window_scaling_factor, 0.4) - cls.update_scaling_callbacks_all() - - @classmethod - def get_window_root_of_widget(cls, widget): - current_widget = widget - - while isinstance(current_widget, tkinter.Tk) is False and\ - isinstance(current_widget, tkinter.Toplevel) is False: - current_widget = current_widget.master - - return current_widget - - @classmethod - def update_scaling_callbacks_all(cls): - for window, callback_list in cls.window_widgets_dict.items(): - for set_scaling_callback in callback_list: - if not cls.deactivate_automatic_dpi_awareness: - set_scaling_callback(cls.window_dpi_scaling_dict[window] * cls.widget_scaling, - cls.window_dpi_scaling_dict[window] * cls.window_scaling) - else: - set_scaling_callback(cls.widget_scaling, - cls.window_scaling) - - @classmethod - def update_scaling_callbacks_for_window(cls, window): - for set_scaling_callback in cls.window_widgets_dict[window]: - if not cls.deactivate_automatic_dpi_awareness: - set_scaling_callback(cls.window_dpi_scaling_dict[window] * cls.widget_scaling, - cls.window_dpi_scaling_dict[window] * cls.window_scaling) - else: - set_scaling_callback(cls.widget_scaling, - cls.window_scaling) - - @classmethod - def add_widget(cls, widget_callback: Callable, widget): - window_root = cls.get_window_root_of_widget(widget) - - if window_root not in cls.window_widgets_dict: - cls.window_widgets_dict[window_root] = [widget_callback] - else: - cls.window_widgets_dict[window_root].append(widget_callback) - - if window_root not in cls.window_dpi_scaling_dict: - cls.window_dpi_scaling_dict[window_root] = cls.get_window_dpi_scaling(window_root) - - if not cls.update_loop_running: - window_root.after(100, cls.check_dpi_scaling) - cls.update_loop_running = True - - @classmethod - def remove_widget(cls, widget_callback, widget): - window_root = cls.get_window_root_of_widget(widget) - try: - cls.window_widgets_dict[window_root].remove(widget_callback) - except: - pass - - @classmethod - def remove_window(cls, window_callback, window): - try: - del cls.window_widgets_dict[window] - except: - pass - - @classmethod - def add_window(cls, window_callback, window): - if window not in cls.window_widgets_dict: - cls.window_widgets_dict[window] = [window_callback] - else: - cls.window_widgets_dict[window].append(window_callback) - - if window not in cls.window_dpi_scaling_dict: - cls.window_dpi_scaling_dict[window] = cls.get_window_dpi_scaling(window) - - @classmethod - def activate_high_dpi_awareness(cls): - """ make process DPI aware, customtkinter elements will get scaled automatically, - only gets activated when CTk object is created """ - - if not cls.deactivate_automatic_dpi_awareness: - if sys.platform == "darwin": - pass # high DPI scaling works automatically on macOS - - elif sys.platform.startswith("win"): - import ctypes - - # Values for SetProcessDpiAwareness and SetProcessDpiAwarenessContext: - # internal enum PROCESS_DPI_AWARENESS - # { - # Process_DPI_Unaware = 0, - # Process_System_DPI_Aware = 1, - # Process_Per_Monitor_DPI_Aware = 2 - # } - # - # internal enum DPI_AWARENESS_CONTEXT - # { - # DPI_AWARENESS_CONTEXT_UNAWARE = 16, - # DPI_AWARENESS_CONTEXT_SYSTEM_AWARE = 17, - # DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = 18, - # DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = 34 - # } - - # ctypes.windll.user32.SetProcessDpiAwarenessContext(34) # Non client area scaling at runtime (titlebar) - # does not work with resizable(False, False), window starts growing on monitor with different scaling (weird tkinter bug...) - # ctypes.windll.user32.EnableNonClientDpiScaling(hwnd) does not work for some reason (tested on Windows 11) - - # It's too bad, that these Windows API methods don't work properly with tkinter. But I tested days with multiple monitor setups, - # and I don't think there is anything left to do. So this is the best option at the moment: - - ctypes.windll.shcore.SetProcessDpiAwareness(2) # Titlebar does not scale at runtime - else: - pass # DPI awareness on Linux not implemented - - @classmethod - def get_window_dpi_scaling(cls, window) -> float: - if not cls.deactivate_automatic_dpi_awareness: - if sys.platform == "darwin": - return 1 # scaling works automatically on macOS - - elif sys.platform.startswith("win"): - from ctypes import windll, pointer, wintypes - - DPI100pc = 96 # DPI 96 is 100% scaling - DPI_type = 0 # MDT_EFFECTIVE_DPI = 0, MDT_ANGULAR_DPI = 1, MDT_RAW_DPI = 2 - window_hwnd = wintypes.HWND(window.winfo_id()) - monitor_handle = windll.user32.MonitorFromWindow(window_hwnd, wintypes.DWORD(2)) # MONITOR_DEFAULTTONEAREST = 2 - x_dpi, y_dpi = wintypes.UINT(), wintypes.UINT() - windll.shcore.GetDpiForMonitor(monitor_handle, DPI_type, pointer(x_dpi), pointer(y_dpi)) - return (x_dpi.value + y_dpi.value) / (2 * DPI100pc) - - else: - return 1 # DPI awareness on Linux not implemented - else: - return 1 - - @classmethod - def check_dpi_scaling(cls): - new_scaling_detected = False - - # check for every window if scaling value changed - for window in cls.window_widgets_dict: - if window.winfo_exists() and not window.state() == "iconic": - current_dpi_scaling_value = cls.get_window_dpi_scaling(window) - if current_dpi_scaling_value != cls.window_dpi_scaling_dict[window]: - cls.window_dpi_scaling_dict[window] = current_dpi_scaling_value - - if sys.platform.startswith("win"): - window.attributes("-alpha", 0.15) - - window.block_update_dimensions_event() - cls.update_scaling_callbacks_for_window(window) - window.unblock_update_dimensions_event() - - if sys.platform.startswith("win"): - window.attributes("-alpha", 1) - - new_scaling_detected = True - - # find an existing tkinter object for the next call of .after() - for app in cls.window_widgets_dict.keys(): - try: - if new_scaling_detected: - app.after(cls.loop_pause_after_new_scaling, cls.check_dpi_scaling) - else: - app.after(cls.update_loop_interval, cls.check_dpi_scaling) - return - except Exception: - continue - - cls.update_loop_running = False diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/theme/__init__.py b/.venv/Lib/site-packages/customtkinter/windows/widgets/theme/__init__.py deleted file mode 100644 index 8931f35..0000000 --- a/.venv/Lib/site-packages/customtkinter/windows/widgets/theme/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from .theme_manager import ThemeManager - -# load default blue theme -try: - ThemeManager.load_theme("blue") -except FileNotFoundError as err: - raise FileNotFoundError(f"{err}\nThe .json theme file for CustomTkinter could not be found.\n" + - f"If packaging with pyinstaller was used, have a look at the wiki:\n" + - f"https://github.com/TomSchimansky/CustomTkinter/wiki/Packaging#windows-pyinstaller-auto-py-to-exe") diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/theme/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/theme/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 762e64cce17f59ac2f36ba49391e8e7bbef8c8ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 831 zcmY*W&1(}u6rb6TR@W9Pcu>>AK!j2-*;Fr5iWsfcLM=j4#JaG~?o5(tc6Y+gY_`os z@#IPHWKl#eoPgWy?@#of;ni z(LZX$=qL~|GkZ4c6(kc|#xo;@DcI4Uf)p-H{>^GG!2VRVK|}foN4QSozTpK4?JQgB z5*4=vkC4p5sKx?ic#Q5PLh`WMWRavX@_7;v6mf~XESyB7Xm!eKHPpg>6W3W(M=6sH z)Y@f{kT?ibPKpIe1SQu|1Gg!{DB!$_u*^CsbdxPvo#zcHTVlz!>nc0(iarnRDi14u zgM~N}&0YJ<9CnswKOXnYrz|2o6@^o63pkNnT@;k1J9J~g>`xD=xvF4BJ=WDe`c}X( zafgBa#Z^UmgUi*7*Znx=abH)sZ{ScN!SQE*$=MV%77mRG4N;f~>^U2BNBRLzh_k|* zNl4Y2oQg~cOG0Pm;oT=r^+u^wauyd+h1XMVGoD4U6(~nx^A(xdwgy=M(*YMzLDEo{b}U)jeK{kN4?3*1E4F&Y1^}MT`RXIy0hL$d$agJ zhjSkMJ^SLo)aLGJ2SB?}*8UCc0BB}eJ5n;xvr@_tGis#QGgrZT^OpYU(oOw`I{yPM CP5)H@ diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/theme/__pycache__/theme_manager.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/theme/__pycache__/theme_manager.cpython-311.pyc deleted file mode 100644 index 0b90c1055715eabfd91605b951fbf3ac7823160b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4160 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 diff --git a/.venv/Lib/site-packages/customtkinter/windows/widgets/utility/__pycache__/utility_functions.cpython-311.pyc b/.venv/Lib/site-packages/customtkinter/windows/widgets/utility/__pycache__/utility_functions.cpython-311.pyc deleted file mode 100644 index 6bc4f680d2586f2d8733c245906921dd59bf6b2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1450 zcmaJ>&1)M+6rcT&l6J(* ztW+5VOv%BN9^4-4Kq;6)6N)c6=FhN#pk^Up2tD+s;ucB{rEkWzB9*p-_PsanW8TO7 zM)yZXh7m0K;@AFPCPGit=4d4kh5eU6*hB8rHb@qH`(FatL;<>ON~32*Ewt6Q zd#1k!;&yL)4}7+JezWMa^S7;*)iUacpMewl^Yvm{)?if2Y*|;q`qhP&30)Ygw=kzw zR;Snv3HCU3CB-3aVAULM1abvKQyAKdD6Y8y7nu3lc+mM2ZmdvFwNoH)5GvQhN#L9n z+m%4b*w%xwYOI#CxvG<^VZ&&OEJcBn zuhX#Z%m>Sk2qb-_=6YqfM1|u;Lb9qX2XH9A)CfYt8Ui>eQ7JA(GN=TydBlr;6zcmI z`C2p1KyO8#v#Rc=xZErXD*18fMYSug16f0Rr^eS7ei@rEYr)^7U5#>+eDbMV`poVuU?A^%{kJz3~X7SiywEcEj8svFOD2vaq=4CHd8YqAV19>)`Mo)q?F)lg zi-_0&xy0%MKu*07ftNU-D)4a`?x`d&To$I)nru$tIkzGxW)i^F2n3zN+yy2u<(zR9 z5;A$jI0qKB4X$W1a>UpY&F!S1um<>h^dB3?uLf zAIKW|BZ-F6>ur&hDhn?xs(7k#+3MB$n2-TAv88`{;nzLN9N7FvGI-9_eL}85m)&Za>iUP5!>p`#nur*V|$sg ziZ1FWr2TZ|Plv8n8HpW@c!3Z!cphS9Z$jOVtNx(L_ dict: - """ remove and create new dict with key value pairs of dictionary, where key is in valid_keys """ - new_dictionary = {} - - for key in list(dictionary.keys()): - if key in valid_keys: - new_dictionary[key] = dictionary.pop(key) - - return new_dictionary - - -def check_kwargs_empty(kwargs_dict, raise_error=False) -> bool: - """ returns True if kwargs are empty, False otherwise, raises error if not empty """ - - if len(kwargs_dict) > 0: - if raise_error: - raise ValueError(f"{list(kwargs_dict.keys())} are not supported arguments. Look at the documentation for supported arguments.") - else: - return True - else: - return False diff --git a/.venv/Lib/site-packages/cycler-0.12.1.dist-info/INSTALLER b/.venv/Lib/site-packages/cycler-0.12.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/cycler-0.12.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/cycler-0.12.1.dist-info/LICENSE b/.venv/Lib/site-packages/cycler-0.12.1.dist-info/LICENSE deleted file mode 100644 index d41d808..0000000 --- a/.venv/Lib/site-packages/cycler-0.12.1.dist-info/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2015, matplotlib project -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the matplotlib project nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/.venv/Lib/site-packages/cycler-0.12.1.dist-info/METADATA b/.venv/Lib/site-packages/cycler-0.12.1.dist-info/METADATA deleted file mode 100644 index e81ab4f..0000000 --- a/.venv/Lib/site-packages/cycler-0.12.1.dist-info/METADATA +++ /dev/null @@ -1,78 +0,0 @@ -Metadata-Version: 2.1 -Name: cycler -Version: 0.12.1 -Summary: Composable style cycles -Author-email: Thomas A Caswell -License: Copyright (c) 2015, matplotlib project - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of the matplotlib project nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -Project-URL: homepage, https://matplotlib.org/cycler/ -Project-URL: repository, https://github.com/matplotlib/cycler -Keywords: cycle kwargs -Classifier: License :: OSI Approved :: BSD License -Classifier: Development Status :: 4 - Beta -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3 :: Only -Requires-Python: >=3.8 -Description-Content-Type: text/x-rst -License-File: LICENSE -Provides-Extra: docs -Requires-Dist: ipython ; extra == 'docs' -Requires-Dist: matplotlib ; extra == 'docs' -Requires-Dist: numpydoc ; extra == 'docs' -Requires-Dist: sphinx ; extra == 'docs' -Provides-Extra: tests -Requires-Dist: pytest ; extra == 'tests' -Requires-Dist: pytest-cov ; extra == 'tests' -Requires-Dist: pytest-xdist ; extra == 'tests' - -|PyPi|_ |Conda|_ |Supported Python versions|_ |GitHub Actions|_ |Codecov|_ - -.. |PyPi| image:: https://img.shields.io/pypi/v/cycler.svg?style=flat -.. _PyPi: https://pypi.python.org/pypi/cycler - -.. |Conda| image:: https://img.shields.io/conda/v/conda-forge/cycler -.. _Conda: https://anaconda.org/conda-forge/cycler - -.. |Supported Python versions| image:: https://img.shields.io/pypi/pyversions/cycler.svg -.. _Supported Python versions: https://pypi.python.org/pypi/cycler - -.. |GitHub Actions| image:: https://github.com/matplotlib/cycler/actions/workflows/tests.yml/badge.svg -.. _GitHub Actions: https://github.com/matplotlib/cycler/actions - -.. |Codecov| image:: https://codecov.io/github/matplotlib/cycler/badge.svg?branch=main&service=github -.. _Codecov: https://codecov.io/github/matplotlib/cycler?branch=main - -cycler: composable cycles -========================= - -Docs: https://matplotlib.org/cycler/ diff --git a/.venv/Lib/site-packages/cycler-0.12.1.dist-info/RECORD b/.venv/Lib/site-packages/cycler-0.12.1.dist-info/RECORD deleted file mode 100644 index f4f9f7d..0000000 --- a/.venv/Lib/site-packages/cycler-0.12.1.dist-info/RECORD +++ /dev/null @@ -1,9 +0,0 @@ -cycler-0.12.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -cycler-0.12.1.dist-info/LICENSE,sha256=8SGBQ9dm2j_qZvEzlrfxXfRqgzA_Kb-Wum6Y601C9Ag,1497 -cycler-0.12.1.dist-info/METADATA,sha256=IyieGbdvHgE5Qidpbmryts0c556JcxIJv5GVFIsY7TY,3779 -cycler-0.12.1.dist-info/RECORD,, -cycler-0.12.1.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92 -cycler-0.12.1.dist-info/top_level.txt,sha256=D8BVVDdAAelLb2FOEz7lDpc6-AL21ylKPrMhtG6yzyE,7 -cycler/__init__.py,sha256=1JdRgv5Zzxo-W1ev7B_LWquysWP6LZH6CHk_COtIaXE,16709 -cycler/__pycache__/__init__.cpython-311.pyc,, -cycler/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/.venv/Lib/site-packages/cycler-0.12.1.dist-info/WHEEL b/.venv/Lib/site-packages/cycler-0.12.1.dist-info/WHEEL deleted file mode 100644 index 7e68873..0000000 --- a/.venv/Lib/site-packages/cycler-0.12.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.41.2) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/Lib/site-packages/cycler-0.12.1.dist-info/top_level.txt b/.venv/Lib/site-packages/cycler-0.12.1.dist-info/top_level.txt deleted file mode 100644 index 2254644..0000000 --- a/.venv/Lib/site-packages/cycler-0.12.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -cycler diff --git a/.venv/Lib/site-packages/cycler/__init__.py b/.venv/Lib/site-packages/cycler/__init__.py deleted file mode 100644 index 9794954..0000000 --- a/.venv/Lib/site-packages/cycler/__init__.py +++ /dev/null @@ -1,573 +0,0 @@ -""" -Cycler -====== - -Cycling through combinations of values, producing dictionaries. - -You can add cyclers:: - - from cycler import cycler - cc = (cycler(color=list('rgb')) + - cycler(linestyle=['-', '--', '-.'])) - for d in cc: - print(d) - -Results in:: - - {'color': 'r', 'linestyle': '-'} - {'color': 'g', 'linestyle': '--'} - {'color': 'b', 'linestyle': '-.'} - - -You can multiply cyclers:: - - from cycler import cycler - cc = (cycler(color=list('rgb')) * - cycler(linestyle=['-', '--', '-.'])) - for d in cc: - print(d) - -Results in:: - - {'color': 'r', 'linestyle': '-'} - {'color': 'r', 'linestyle': '--'} - {'color': 'r', 'linestyle': '-.'} - {'color': 'g', 'linestyle': '-'} - {'color': 'g', 'linestyle': '--'} - {'color': 'g', 'linestyle': '-.'} - {'color': 'b', 'linestyle': '-'} - {'color': 'b', 'linestyle': '--'} - {'color': 'b', 'linestyle': '-.'} -""" - - -from __future__ import annotations - -from collections.abc import Hashable, Iterable, Generator -import copy -from functools import reduce -from itertools import product, cycle -from operator import mul, add -# Dict, List, Union required for runtime cast calls -from typing import TypeVar, Generic, Callable, Union, Dict, List, Any, overload, cast - -__version__ = "0.12.1" - -K = TypeVar("K", bound=Hashable) -L = TypeVar("L", bound=Hashable) -V = TypeVar("V") -U = TypeVar("U") - - -def _process_keys( - left: Cycler[K, V] | Iterable[dict[K, V]], - right: Cycler[K, V] | Iterable[dict[K, V]] | None, -) -> set[K]: - """ - Helper function to compose cycler keys. - - Parameters - ---------- - left, right : iterable of dictionaries or None - The cyclers to be composed. - - Returns - ------- - keys : set - The keys in the composition of the two cyclers. - """ - l_peek: dict[K, V] = next(iter(left)) if left != [] else {} - r_peek: dict[K, V] = next(iter(right)) if right is not None else {} - l_key: set[K] = set(l_peek.keys()) - r_key: set[K] = set(r_peek.keys()) - if l_key & r_key: - raise ValueError("Can not compose overlapping cycles") - return l_key | r_key - - -def concat(left: Cycler[K, V], right: Cycler[K, U]) -> Cycler[K, V | U]: - r""" - Concatenate `Cycler`\s, as if chained using `itertools.chain`. - - The keys must match exactly. - - Examples - -------- - >>> num = cycler('a', range(3)) - >>> let = cycler('a', 'abc') - >>> num.concat(let) - cycler('a', [0, 1, 2, 'a', 'b', 'c']) - - Returns - ------- - `Cycler` - The concatenated cycler. - """ - if left.keys != right.keys: - raise ValueError( - "Keys do not match:\n" - "\tIntersection: {both!r}\n" - "\tDisjoint: {just_one!r}".format( - both=left.keys & right.keys, just_one=left.keys ^ right.keys - ) - ) - _l = cast(Dict[K, List[Union[V, U]]], left.by_key()) - _r = cast(Dict[K, List[Union[V, U]]], right.by_key()) - return reduce(add, (_cycler(k, _l[k] + _r[k]) for k in left.keys)) - - -class Cycler(Generic[K, V]): - """ - Composable cycles. - - This class has compositions methods: - - ``+`` - for 'inner' products (zip) - - ``+=`` - in-place ``+`` - - ``*`` - for outer products (`itertools.product`) and integer multiplication - - ``*=`` - in-place ``*`` - - and supports basic slicing via ``[]``. - - Parameters - ---------- - left, right : Cycler or None - The 'left' and 'right' cyclers. - op : func or None - Function which composes the 'left' and 'right' cyclers. - """ - - def __call__(self): - return cycle(self) - - def __init__( - self, - left: Cycler[K, V] | Iterable[dict[K, V]] | None, - right: Cycler[K, V] | None = None, - op: Any = None, - ): - """ - Semi-private init. - - Do not use this directly, use `cycler` function instead. - """ - if isinstance(left, Cycler): - self._left: Cycler[K, V] | list[dict[K, V]] = Cycler( - left._left, left._right, left._op - ) - elif left is not None: - # Need to copy the dictionary or else that will be a residual - # mutable that could lead to strange errors - self._left = [copy.copy(v) for v in left] - else: - self._left = [] - - if isinstance(right, Cycler): - self._right: Cycler[K, V] | None = Cycler( - right._left, right._right, right._op - ) - else: - self._right = None - - self._keys: set[K] = _process_keys(self._left, self._right) - self._op: Any = op - - def __contains__(self, k): - return k in self._keys - - @property - def keys(self) -> set[K]: - """The keys this Cycler knows about.""" - return set(self._keys) - - def change_key(self, old: K, new: K) -> None: - """ - Change a key in this cycler to a new name. - Modification is performed in-place. - - Does nothing if the old key is the same as the new key. - Raises a ValueError if the new key is already a key. - Raises a KeyError if the old key isn't a key. - """ - if old == new: - return - if new in self._keys: - raise ValueError( - f"Can't replace {old} with {new}, {new} is already a key" - ) - if old not in self._keys: - raise KeyError( - f"Can't replace {old} with {new}, {old} is not a key" - ) - - self._keys.remove(old) - self._keys.add(new) - - if self._right is not None and old in self._right.keys: - self._right.change_key(old, new) - - # self._left should always be non-None - # if self._keys is non-empty. - elif isinstance(self._left, Cycler): - self._left.change_key(old, new) - else: - # It should be completely safe at this point to - # assume that the old key can be found in each - # iteration. - self._left = [{new: entry[old]} for entry in self._left] - - @classmethod - def _from_iter(cls, label: K, itr: Iterable[V]) -> Cycler[K, V]: - """ - Class method to create 'base' Cycler objects - that do not have a 'right' or 'op' and for which - the 'left' object is not another Cycler. - - Parameters - ---------- - label : hashable - The property key. - - itr : iterable - Finite length iterable of the property values. - - Returns - ------- - `Cycler` - New 'base' cycler. - """ - ret: Cycler[K, V] = cls(None) - ret._left = list({label: v} for v in itr) - ret._keys = {label} - return ret - - def __getitem__(self, key: slice) -> Cycler[K, V]: - # TODO : maybe add numpy style fancy slicing - if isinstance(key, slice): - trans = self.by_key() - return reduce(add, (_cycler(k, v[key]) for k, v in trans.items())) - else: - raise ValueError("Can only use slices with Cycler.__getitem__") - - def __iter__(self) -> Generator[dict[K, V], None, None]: - if self._right is None: - for left in self._left: - yield dict(left) - else: - if self._op is None: - raise TypeError( - "Operation cannot be None when both left and right are defined" - ) - for a, b in self._op(self._left, self._right): - out = {} - out.update(a) - out.update(b) - yield out - - def __add__(self, other: Cycler[L, U]) -> Cycler[K | L, V | U]: - """ - Pair-wise combine two equal length cyclers (zip). - - Parameters - ---------- - other : Cycler - """ - if len(self) != len(other): - raise ValueError( - f"Can only add equal length cycles, not {len(self)} and {len(other)}" - ) - return Cycler( - cast(Cycler[Union[K, L], Union[V, U]], self), - cast(Cycler[Union[K, L], Union[V, U]], other), - zip - ) - - @overload - def __mul__(self, other: Cycler[L, U]) -> Cycler[K | L, V | U]: - ... - - @overload - def __mul__(self, other: int) -> Cycler[K, V]: - ... - - def __mul__(self, other): - """ - Outer product of two cyclers (`itertools.product`) or integer - multiplication. - - Parameters - ---------- - other : Cycler or int - """ - if isinstance(other, Cycler): - return Cycler( - cast(Cycler[Union[K, L], Union[V, U]], self), - cast(Cycler[Union[K, L], Union[V, U]], other), - product - ) - elif isinstance(other, int): - trans = self.by_key() - return reduce( - add, (_cycler(k, v * other) for k, v in trans.items()) - ) - else: - return NotImplemented - - @overload - def __rmul__(self, other: Cycler[L, U]) -> Cycler[K | L, V | U]: - ... - - @overload - def __rmul__(self, other: int) -> Cycler[K, V]: - ... - - def __rmul__(self, other): - return self * other - - def __len__(self) -> int: - op_dict: dict[Callable, Callable[[int, int], int]] = {zip: min, product: mul} - if self._right is None: - return len(self._left) - l_len = len(self._left) - r_len = len(self._right) - return op_dict[self._op](l_len, r_len) - - # iadd and imul do not exapand the the type as the returns must be consistent with - # self, thus they flag as inconsistent with add/mul - def __iadd__(self, other: Cycler[K, V]) -> Cycler[K, V]: # type: ignore[misc] - """ - In-place pair-wise combine two equal length cyclers (zip). - - Parameters - ---------- - other : Cycler - """ - if not isinstance(other, Cycler): - raise TypeError("Cannot += with a non-Cycler object") - # True shallow copy of self is fine since this is in-place - old_self = copy.copy(self) - self._keys = _process_keys(old_self, other) - self._left = old_self - self._op = zip - self._right = Cycler(other._left, other._right, other._op) - return self - - def __imul__(self, other: Cycler[K, V] | int) -> Cycler[K, V]: # type: ignore[misc] - """ - In-place outer product of two cyclers (`itertools.product`). - - Parameters - ---------- - other : Cycler - """ - if not isinstance(other, Cycler): - raise TypeError("Cannot *= with a non-Cycler object") - # True shallow copy of self is fine since this is in-place - old_self = copy.copy(self) - self._keys = _process_keys(old_self, other) - self._left = old_self - self._op = product - self._right = Cycler(other._left, other._right, other._op) - return self - - def __eq__(self, other: object) -> bool: - if not isinstance(other, Cycler): - return False - if len(self) != len(other): - return False - if self.keys ^ other.keys: - return False - return all(a == b for a, b in zip(self, other)) - - __hash__ = None # type: ignore - - def __repr__(self) -> str: - op_map = {zip: "+", product: "*"} - if self._right is None: - lab = self.keys.pop() - itr = list(v[lab] for v in self) - return f"cycler({lab!r}, {itr!r})" - else: - op = op_map.get(self._op, "?") - msg = "({left!r} {op} {right!r})" - return msg.format(left=self._left, op=op, right=self._right) - - def _repr_html_(self) -> str: - # an table showing the value of each key through a full cycle - output = "" - sorted_keys = sorted(self.keys, key=repr) - for key in sorted_keys: - output += f"" - for d in iter(self): - output += "" - for k in sorted_keys: - output += f"" - output += "" - output += "
    {key!r}
    {d[k]!r}
    " - return output - - def by_key(self) -> dict[K, list[V]]: - """ - Values by key. - - This returns the transposed values of the cycler. Iterating - over a `Cycler` yields dicts with a single value for each key, - this method returns a `dict` of `list` which are the values - for the given key. - - The returned value can be used to create an equivalent `Cycler` - using only `+`. - - Returns - ------- - transpose : dict - dict of lists of the values for each key. - """ - - # TODO : sort out if this is a bottle neck, if there is a better way - # and if we care. - - keys = self.keys - out: dict[K, list[V]] = {k: list() for k in keys} - - for d in self: - for k in keys: - out[k].append(d[k]) - return out - - # for back compatibility - _transpose = by_key - - def simplify(self) -> Cycler[K, V]: - """ - Simplify the cycler into a sum (but no products) of cyclers. - - Returns - ------- - simple : Cycler - """ - # TODO: sort out if it is worth the effort to make sure this is - # balanced. Currently it is is - # (((a + b) + c) + d) vs - # ((a + b) + (c + d)) - # I would believe that there is some performance implications - trans = self.by_key() - return reduce(add, (_cycler(k, v) for k, v in trans.items())) - - concat = concat - - -@overload -def cycler(arg: Cycler[K, V]) -> Cycler[K, V]: - ... - - -@overload -def cycler(**kwargs: Iterable[V]) -> Cycler[str, V]: - ... - - -@overload -def cycler(label: K, itr: Iterable[V]) -> Cycler[K, V]: - ... - - -def cycler(*args, **kwargs): - """ - Create a new `Cycler` object from a single positional argument, - a pair of positional arguments, or the combination of keyword arguments. - - cycler(arg) - cycler(label1=itr1[, label2=iter2[, ...]]) - cycler(label, itr) - - Form 1 simply copies a given `Cycler` object. - - Form 2 composes a `Cycler` as an inner product of the - pairs of keyword arguments. In other words, all of the - iterables are cycled simultaneously, as if through zip(). - - Form 3 creates a `Cycler` from a label and an iterable. - This is useful for when the label cannot be a keyword argument - (e.g., an integer or a name that has a space in it). - - Parameters - ---------- - arg : Cycler - Copy constructor for Cycler (does a shallow copy of iterables). - label : name - The property key. In the 2-arg form of the function, - the label can be any hashable object. In the keyword argument - form of the function, it must be a valid python identifier. - itr : iterable - Finite length iterable of the property values. - Can be a single-property `Cycler` that would - be like a key change, but as a shallow copy. - - Returns - ------- - cycler : Cycler - New `Cycler` for the given property - - """ - if args and kwargs: - raise TypeError( - "cycler() can only accept positional OR keyword arguments -- not both." - ) - - if len(args) == 1: - if not isinstance(args[0], Cycler): - raise TypeError( - "If only one positional argument given, it must " - "be a Cycler instance." - ) - return Cycler(args[0]) - elif len(args) == 2: - return _cycler(*args) - elif len(args) > 2: - raise TypeError( - "Only a single Cycler can be accepted as the lone " - "positional argument. Use keyword arguments instead." - ) - - if kwargs: - return reduce(add, (_cycler(k, v) for k, v in kwargs.items())) - - raise TypeError("Must have at least a positional OR keyword arguments") - - -def _cycler(label: K, itr: Iterable[V]) -> Cycler[K, V]: - """ - Create a new `Cycler` object from a property name and iterable of values. - - Parameters - ---------- - label : hashable - The property key. - itr : iterable - Finite length iterable of the property values. - - Returns - ------- - cycler : Cycler - New `Cycler` for the given property - """ - if isinstance(itr, Cycler): - keys = itr.keys - if len(keys) != 1: - msg = "Can not create Cycler from a multi-property Cycler" - raise ValueError(msg) - - lab = keys.pop() - # Doesn't need to be a new list because - # _from_iter() will be creating that new list anyway. - itr = (v[lab] for v in itr) - - return Cycler._from_iter(label, itr) diff --git a/.venv/Lib/site-packages/cycler/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/cycler/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 84f12b06d036d02ff7147cdcbee23ac41bf03fa9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25692 zcmeHvd2k%pd1v=rm<#tooMaP#1Plm{2#TaciiAkvkVue_EgrT(vcTc=5EybW1N96@ z0Rn7DW|f9q>;_`M5VFbgcuQ0uo2t->lgKG0ai#XkuCq0xoh_rL3bm~4YB%2f2P)aM zE^gKC{=WCRd%6ch9g$PcA88C;zkdDh{@!=L_xq)#ZUNWWe?N9%;E*8vS9;K{5*`sh znHL4&mLLlwf-K6Gh&W*xv4|A6MywOI5!-})#6IB|aj-O7q-3N7@9Yuhglojb(i{=@ zglEJv;T`d^=aNY2MA=B$MEOWLdv-=DCMriNC#puOCaOoOCu&A&CTd4&C+bG(CN_<1 zny4SCpJ*6qKwj5KqeTc+%I=Wup64BlAp8*j{2FOuZ@fj`G_yCQ?_eB1#J`%qg{77i zq;8fw7ar+c&1mk6lG6d7Jz=deA1@jtjo-zzsCy?wbxqLW=tUyWH$C z937Jq<4SC5Y+MS)CeDYWfkZeKjZ3i$(&a#8DirUQCY6{x6{MVUI7n{;N;nkvyWQW2 zO-aE(R0_zl6l8VB_w94LC0rMj*o2xUg(oIsN-@%Ce$-kU=(L_ucMgfNs!jcU6 zEV&ZCIukiNTTV!^0>E-stVy3MS8`%{GIT1S~Sr0|0bI#c1kP?Xn%*2!uedvgXP|ew( zj;}FocKidWiJu%~6lPW!6D~1qsx&8bJS_+b9m5L3tYF61=BKC_7UnFo;%kpCFPcl3 zpICWog8HRivzC;hbuCp8%oyHW%bd+rgZ1xGgMHREYoEa!DCG%PzE#;`Zs~QAthV|R0}E4=tT1&94FOtA zb+Kd+h6L5iY6=q>qkd3Q;tEE{$(Ns%8=h(H16jk8)Ebu9ng~oz5*1{5<34-N77e|E zr98AX1q3%bP}$U=jc zq=(-Q?mKfbjyXLOQsmHtG%*zqoIf*+#)6U9lzgT?c4=xN6itNA98XNi;i-u;{VzQC zwKFGn?%1*8Oizz=Ja!>*C7^`P?C6o6KY92}f?kY{O@+_+FNdO+&m0Y(KNClU_#%RNVZBxG@4Wxg4@Oo- z?$q3oQ@h@}c>7|e!Iy3Dr5k+jzcfF%>VGorf0n)6{nn-1mog1q*@mukL)TC7a;;|5 zvg3Q6?|9xSy&=$+rk%a3o{GiY z*AAp@^`D?m!b7hSvlyRFo_$zhcn9oq(u_--D9&)n3&1dMSl+PS0lvY0YrCau^b>!7vysQPETf^g4b=1vROZ9?U)si6e*UA+>FALkDV)T3RAGA)Mu z6^3|KK5pbp^E|3Cbyi3j>d%)fz-E|}Yw`1k0mHL)o_sziN0p0p&b7c8>% zs?+$@`U~;6Y2?7Ew!m=>r}o97!9XGe<~k&uRi56_E%kIu zJHbv<3muH{34%xG#Dj-O|q8zMw6#~6xcGqKO@It+xU#6yf| z?UPxXTw8EYw?&1_8H!VYg z2q|_}INLTS8o7&E@ftXW{Cc@&H9pOtta&A$5^jm2u+T1p=DsTqzbocSM)~ylY&na6 zM^3zyvy4XYuf%OAElKn9N*5vzUHiwt0KPJ*^v*Q!iSh4`#DalHyw|V4N+4%^FM?nH zo$zBWJiBOjJ*PM2&3{$ICPN<02X$M%1Dd9}7-=^Lrq zw;MCH+wRLh4*&GAf7O-Qb9CJ*boxIQES+V)q~PNcN4fi#0)lnH;d1|~OmLU|bNOb^ zP5I95yOnnjrD|?JldbDWS9fH~I#=5NVA~J2y}SM1_KfT4tn2Cd=hj@MkIwzrA9Vkq z`(6J%f5x>p>)MOlp30kT#@R&t{aqjI#VxaGAdAp5nDq>%ZG&u@gBYiNsf?od$u5B5 zEg>X~h)|kXWO2kQTOiQeT!KrG_sCDl?yFFl$R4CQLM8Ika@htIfK%QpS3~%Bh1~K! zxqicYkNk|>g!f)~KPenWO63EjU>GS2l_S==A%6wZdyA+VDwwK)-X0)jgP9PFRI*YX z8`I@Z^u1DkR`#LID*2$?g?qJpNbbhHMt)9y0{2?kI#MV1$vuc~!hI+1^>V+w3-^Xl z!$_k%An!)JDbzgDEL(wY2XhXNSp%Qs(Jt|=B<-k7n~qAuaVZ!H#N*O9P_Tg~j7#8V z$76C_)nlAHx9!|H6)RyONFCuQ#IO!kCjxas=S+A~MQ+G@K+hbGZl8<50!ZIzm0tx^T?sY%ko z#HI6rcsMA&l$gc%&nE>#x znitl^WG3TUVv`E-VL`(8+NBG(uQP05>b;mSFq>xbqC9S7OTo74IT2Se3|LR`qTZHS z2{|i_>LsF05QVD<_soigtd1#P$ruP@zMQGAme1W+i=nR;LtibQ(pP;%Q7Dbk2mLug z#7Dirvgu<&T+d^kIg};=j9s%nUr}hFI$JB@kA&9v6c$cHEaT60)uMeLiQkX3mOh^ zAa!OACZ~NCQoKJwHqhVGooc-pg`_I1JT+Oqb6Ih z!0wx-UTH95T-kC>{H`EduUQbF*c?a0Z$+u9EO{-#E$6 zQh+3KvN_J5Cw_ zs0fJv0r>LfI6D+a?W91USJWDMl5gy#Ksb&X0#aTVsa2!qr7i>_3aHOCA4ZYFL!oJ= z#?*@Ddl2nN6qXvEDTCG&=}L%mzB3N#N;oktJ+yR7GnE_Kn<=FvQnIpHG+`BjBu4n! z5xI$V$Vi`ej)~jXtR!vnD=dP{l>z}C#xn~*J{Xy^LqV!cD_^5@65>??qRP|CQ6$Yg zrlJq%S@1Q9`WS?2o#H*9(ya&}lcpQ``R~4c`N@<$6@1&BZrrA)a+>Gi80#?<$vL$- zBxA+|sga2{QC_5g2A6Z^8&{4|>M#Wd5%{bekyG#4IO0~sz_2r>R2jv?Oy!0V`~{NZ z#{jELgsu|2<%@0C_a*nOdaIIytDdsO_NA`0ry0Mss^-;-!>Q_Y#bNwb`uP3+ll+bl z6s(#kSasRDU@0vFNknDx(#5n#!f&mrakXNAiVxsN#pzDP>5gAvai`!aU2y;0+3=yW zVYw~i+?;i826b6=dKcWkQ+B;(MV->;lPS^cu@w)^g2rgU4jbQ_8M10oeV@^kOj54~Gc zZK-(1yDjV8mezjjZlQ5N)IT61@7H|Lh+C$iKikmHX@2qu`>;7XEN3AY*TM6&T3?qftKJQ0kmW(L`LRPv({0a ztX>nxMLaVCg@%M#5`?XRADB=TlXJOP%Zxc#^Wa=NAPR;$Bo04P?EFPAs$6qO_$@IW zNN5VS@xW!mbebebQgCdNOLrv2GD%HmU=4yAuTx*-gv}tsssPJnQ);R}=Aff@kn%;iYsn2{u^TJL@x)b{nVOz#O;6Ig;99M1TzsBI z%BzxYzJRSj@i{xGKSCyBGI26&x#kd|zIb* z%UO$&^qN^R6)HF9p>j9sREe=dvIqywFk&hxHo>MwibqGsLJ5H81gwyG=~DyF|3{^% zVhuRA97}IG_M^o8m*3xdw`4_J=~+2`Z%;Tz#*BO!9tuf zD%$eMcfnV}X);M$$^i;=-FD7Sy^J#@xkjmJa5;Mdc9pnFt5pS($1tp!s*UaZ9~6ue zK?kUlWEs4(JLB1!^=w@iY_6l?YEAvEp&LVQ9$Pw=99XMvxYK4F+51y}`Rbp&`jfd2 z=8&4%ax9CmdN^A>oc0cXRMnhrIg+Uw%2o}fy+dpU9&TmMAmmG8aM0*xHh3PMH8EpE z%i4&RbpaYQe3X|z=ZW>#;iO+UTMZ3`0h9~%5-OzB5Tu|a;X8KCo4pkZXeGQAgyMpZ zv310?>Iy6`=+|xr)s{Ic{5)*4w&KfecB2UNsGL?aU52n^Q^&T4#^$pO&m4FWG>Iu| z$x)7YT{tt4+zF}~ib`aF0{yuF78pue?k54ey(EV&kUr8TDASa%Ov^$lE(`O*+qk4wzHtoCLK-q&>g?JI$>vi%C=XEHy) zBbIvzg6acgb!V6QvvGo|^HQ0S6Z14kI;ys9?l0raBZ76%6yI z&0`^p53ZY5u6mjLkVr$oMFj(!ujMSP=QBlx=6p%wR%Y($nCL~LVVb!~=3OME&Z1^& zC<0U~wO)(aTKy%lBw32lfL^(YL)GP&ehkSV$22}#j+p_JnZL2hyEWzULU9R(;ZCBn zV5^MM^;R8ovc+3Odg&!(YLs4T2h+8KKeF8y@AupsTMncuQzyUQkg402t=ond1wV!a zeC1pqIf(W@9p5YD7^qyOz$~~Z6G+RI4aX9P$y&!96*V_c-5I#M_3l?w?YD>Ct9|d~Ki;~MxYv|!-j%K0eLs<@ z*q^P~|5@3lG8G516$jQTHUY=iKqHBO*u}D6xk=+^zZ1`twq;9U;B&ZI3uUFXifZFT zzHk3a&!2gIQu;wDQZu!K+1f!+C#n^+k|vL~S&>%4r&7Y=jSQiYIMp&Qtd>_VhOW&*Z_DS5 z#-LraP#DqupNN31*3xk|A$Q8BUPfXPw#<>WOn*CHQ()WI36+^eh9-pc?COOY9+3~o z)|^jo$z0!@6$)JHiEi0y&?*;ZEwffLDp9A?=TyFlT-cEjj`HP5=%34Ua}*=Nj)`=t z%{x~Tn;a!M51M8e$)n^Oj+>@0QKdNWYDhFOChU2bzQ`F=315`nL;w28zbX08UpJV+Uei8Du`UOFI<843k0W6(VWH0jm$@(Y8)btKGT9hNl++?;rr=!I;g1N zjA{N7@Z`|h3A{CUc^I9dk*>Q@8`&dx%II)|xZV=tdVVuIfSU5Tm=a*-x=ynWYd&F< zzby%)6%q!C5ZexLjTh{cvFLVAxKtZ}&uySEaRSgI6l|k_6uTT~39cFBGH8BRwNw%H z!2Y3#Jjy(%02M?ebswrQ7cufaR6OD91hRsg zNMo{35;1@SsUjpca|MqZ1KLmwmQWlM~3s!QFjSX`n1G4ID-Zu*py1 zrc68hvRl8OIc>{%9X?7?Hfk6|jP zgO5?W2Pt6uLpx&F>KTbJK4YT_!@>J7Q>u$5)TLQ!UqMmwS#2<5+lJNZ`o-OAp0Z+! z9`=rSiM@+cOEWM~5PnumlvnXC-wm#`-?wKT-;;fu#*wLdDvPlEsciXEY3EaH9M~(D zP)uJ%N3mpKc*AaH6J-+?MOUx|EoKrQQ5e0jNg=`x}PKL!~yB|)ZG?Nmlk@}cN^C_X#W z(D^EvNU&!|dNnqQfZ0iC3lCOfBl0PO6p%IpybEJY81Bxy*jOjwVH(2woE64J&bI8Q zGQ@vlRrS#;2Uzckz$CL(vl_v+$Hx?coc!L*gE}w62W}L-*i5`Z!+r~8AQZ1v)h@>G zJfAwAuJk1x8V|l&Rk!53wf)BSH=kH~BH6cARcD-uR02<#y6!B(s_tx6cd~D_+P{1} zUG2v&736mcz5WN4n{GAUXoM&03#nkHvMXEJm3(fsYC9FFyS4AezSOR__uX%OzyE`w z#eJFT7qZnaq`fb&i8cWYK`?+u{N&#t0==kc_AmwvVo>}_7*D7U$*Dxn!?W>?veZ^il$psp4>&5%;2C9bGoF};jOOjY`Lr7Z zKEIC|pj)nNOgf0%pSb;v_xjUyJ(;?mY+X;%vs%5G@NO3i@U6X7={g@Eq|V2G8Luxn zm>gWItX-7fY+NG4nhPZmBo86;;)RU28J=LZ5-KQtf(47>YDHbT(GLYw&)YSK@L#6F zzvx(WP@%Dmw}on5b(Sr5Wt`1`=knTQDFdd571}m`ash!ml-Yc&gV*aA7pWXB;?A!* zQfC5*79w7Nk^rFSBv8V=4ZvZUwdKJer30i^6W!srZ^&bo-)Ym`f^XIW(69v7P+aF2 znS&%Y#uPdZogn{xxUAs(0q$eT%=)wqURF;=(e{sXoaLAJu?GowZ0ePhzn>J)w|q*| z;ZQ`TZ2|DL(j+k2^ob2h%*{w5hpJEjJ73_a(ydp+yh~LNF0D(bm8v;My*Nh`e~x=% zNn}7KFD&l2q}M?;Q}S3Cd%z2vq{x4Y*Q*VVo$CTyHC!ZQgVPv1Ct#Ms)(0pY68f<8 zHuwfs=39YXPX?a;CBue&NQ4_)ru4amuNI9;uaPoS0*#Ue$quH;kIpn-d5R$fk3-tGVX;M;?G5?fYivK={d4jelWiprXapVE{o z6#Nkd%*&sKNHfK;4Ab}OJRk22t(bTa+2BgmMK=2Bq-~Y;;C?@v%}9H*(%z)?L1is; zpe}4^Kmc@6+d%jMj|d1!R4*P{a@;DtQ3_^Nye(%c+OidGY4#&0fc6KvtCi^!=qO+T zJs=d2!hPdq{s^E#pi0_hq&ysHqzrGhTwl}%0;|UxI;gcVTCX7BP6H|yy(Z!TanwVmQ zToPH#45rH0)#v#-vN>pco$iWNM0C;kI@U+bgaL##53K)4faFJgs_@d(pKj`ZS6&I+ zuLP@eDE0DN$8H}(Qo)Zyw5^ya0&w1k`nc7>u(Wbcts6R*r6v57Iza;gG&c&BwYNMs zJme+2&L*!%5>LCH(ZfkO1p zkgB#o3NYlDrk68%j#mw-SM^j@n_7-iwQ`hhs9CM;R?*b&=&9eO8r0fShWH;F;;h9M z+IB^o8b(KR?$OZ+919kqI5rlMbAS;L^gzcjr<&~ExIDsJN)I4e#T4V0(IS<=} z%PE^OPFZ6Vyh6b|1wh;avpz8+gmQx(e~$v%xZc1yOKRu3PHt)$4*5P{GQpr+MlQ zhy5rDZU`$%?cn^(!R87(d?U<3JL{Ne_flthpm&TCc*nI@ER*?tt-W5=CU8gq-_Z6y!N_v!5lO< z(cGJZ{X$j!{E>BAnSBt|YzQTxtY&_Y{y3l!ctK60jG1sea2OZ6h&mR!qd;i+w@5Z@ zc*8jfj9@5#jr9M7!kQ0?tz^EBwUcvP!l^%FafWsts*XITp=+U2xq>LAU(~dRSfWQX z{U7k&&@^k31*<5j{Cm9R13O2t00NVik!lBRenjn-yi2&z11aAIap(CqO#P(ZYEiw47?RKz?JAT!Wo>icvnCBDw(#YJ4Wl{IOlV=kGPbV@4OhC0o{35=DW)rPgH|L9+~`zUi2L_(|6JsS%ylKE$a-BGTgMk(Cz>!F zc*C}&^c=trlb+Mve1pnPJcX2Um8Dpbo%v%CAOvzY@*M31gmlJ^r_fkb8b4$u)(M&qCOmB%q;wem z@W_X)JQzKlN)(A0i_(xtBZ3AXTC&mLLBb)Vs_M2@R-Qd&mQt2B0>^g*hgKLk@=+dSNQUq&?<1O%fpA5tMhUX1fSY-;WKv zGvpuhqkl9v{1gp*d;k~io@Be6=mZcz6wX4U?fmF~*6{*o&Vo%zfQF4sd>{7NuATs9+*x=m@am6}yaB9go26g+F4qfcyUWrXbWPJ!I z5D8zRQWzy2yM>F{Fi`GNF^KE8; zSJCNXsurd*2?T?o$%GMQz4+2bqy*&&a|5Q$1O8tST2)ADn(04$fp2S}?FB{99!D&M zfDB(ug-z{%2LCTuRq~6pJw}^bNzH_%#-^P05^5pL8C!>sXwNU5gbQ^cIMD&T{LBjz zGxQH2@G2i*R*DF@4SeE@$hJ7t*(}=*q?-md%C?kh{4ri=X4f%V27Iq%0)FB+Iu$c$ z_zuOsB|L=U^Z}VQ?-<1nQm}^tBD#FD@C0IXUKv(;Tw%N!eI-rXL;N7)p8giF5Pyg# zNX17*oSn5USncjb2fMA6ZCdrxehfMe3jt|(+;DY+2lKAirg6&Fq1V4T|4p(7wlBYY zyW{SjOnFzf97<-Js|*ep>lU%H^JA-(_5&k8mGHiE!i{@TUhY{MQ_opgb9s{|t~D$) zEC#M`PHtW+uUobyznONnqOn6{drLpsFhU2`Pk9?H6h(l)-o$;6Bj3uGmh@&6+7 zhVAnky_I7yP}4lK3w}lhCa7?ekSwZ3?n)Wki%e`moL;MjP6r|E6jzmpJ4{(`xM)=~ETIDXv7qQMZ zsz(YI!EnzIhU-8v%_>{gmM&{s-kN-Qv3lV$q6I&O+O$oO2T_jeZWy|Hj2_>mfD|`S zPoJZBfP!`k?omKOg1!rlTTeN5BNW$4y_rSi*YNz31ZUM^+s(_FlFiu?*sEOj_SN#L zg;$a`-5X(9yxyDaU9B1ePy_yq9{++0v@3sw8>!JQOu@zkHJU=;kSoWT^bvlDW!#Um zHx)u)3Xw;Jq+jNYmvgbhndyj7MkR7C;vw0Qq1?@s52ZO0({zNf z;-!>Q3d$&eOs$^nSV=Kbd~(fO4PrTLUWFMejuYq5Nv7P~L>cNSATgQy1~TQ^L3(5a ziIK3w^w>>77lMb*{aj_(tE}OXIF~q`v;)h5D6U&NMccYS!6{J?+tNa-@%KR3n|}0f zRq)KSzg3|*ZT_ta?df8_RiPza?Ds%8nf`LW2W55ho(DG1{PW4a#aGfcDPxneHfdg5 zeRSGuN3R~$Gw_FX$0iZh7jv+yS$rNErww86H|!$xVa3Db*A~CJEH0i{IQucn@k?XA uSKNZd4Pq=p(WwPc@LAkfan>d!IKS-s10pFX4dFpcljws=t$4uT<^Ka}tD0~C diff --git a/.venv/Lib/site-packages/cycler/py.typed b/.venv/Lib/site-packages/cycler/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/INSTALLER b/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/LICENSE b/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/LICENSE deleted file mode 100644 index 5d17f5e..0000000 --- a/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -Copyright (c) 2019, Alberto Sottile -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of "darkdetect" nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL "Alberto Sottile" BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/METADATA b/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/METADATA deleted file mode 100644 index 53842e6..0000000 --- a/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/METADATA +++ /dev/null @@ -1,87 +0,0 @@ -Metadata-Version: 2.1 -Name: darkdetect -Version: 0.8.0 -Summary: Detect OS Dark Mode from Python -Author-email: Alberto Sottile -License: BSD-3-Clause -Project-URL: homepage, http://github.com/albertosottile/darkdetect -Project-URL: download, http://github.com/albertosottile/darkdetect/releases -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: MacOS :: MacOS X -Classifier: Operating System :: Microsoft :: Windows :: Windows 10 -Classifier: Operating System :: POSIX :: Linux -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Requires-Python: >=3.6 -Description-Content-Type: text/markdown -License-File: LICENSE -Provides-Extra: macos-listener -Requires-Dist: pyobjc-framework-Cocoa ; (platform_system == "Darwin") and extra == 'macos-listener' - -# Darkdetect - -This package allows to detect if the user is using Dark Mode on: - -- [macOS 10.14+](https://support.apple.com/en-us/HT208976) -- [Windows 10 1607+](https://blogs.windows.com/windowsexperience/2016/08/08/windows-10-tip-personalize-your-pc-by-enabling-the-dark-theme/) -- Linux with [a dark GTK theme](https://www.gnome-look.org/browse/cat/135/ord/rating/?tag=dark). - -The main application of this package is to detect the Dark mode from your GUI Python application (Tkinter/wx/pyqt/qt for python (pyside)/...) and apply the needed adjustments to your interface. Darkdetect is particularly useful if your GUI library **does not** provide a public API for this detection (I am looking at you, Qt). In addition, this package does not depend on other modules or packages that are not already included in standard Python distributions. - - -## Usage - -``` -import darkdetect - ->>> darkdetect.theme() -'Dark' - ->>> darkdetect.isDark() -True - ->>> darkdetect.isLight() -False -``` -It's that easy. - -You can create a dark mode switch listener daemon thread with `darkdetect.listener` and pass a callback function. The function will be called with string "Dark" or "Light" when the OS switches the dark mode setting. - -``` python -import threading -import darkdetect - -# def listener(callback: typing.Callable[[str], None]) -> None: ... - -t = threading.Thread(target=darkdetect.listener, args=(print,)) -t.daemon = True -t.start() -``` - -## Install - -The preferred channel is PyPI: -``` -pip install darkdetect -``` - -Alternatively, you are free to vendor directly a copy of Darkdetect in your app. Further information on vendoring can be found [here](https://medium.com/underdog-io-engineering/vendoring-python-dependencies-with-pip-b9eb6078b9c0). - -## Optional Installs - -To enable the macOS listener, additional components are required, these can be installed via: -```bash -pip install darkdetect[macos-listener] -``` - -## Notes - -- This software is licensed under the terms of the 3-clause BSD License. -- This package can be installed on any operative system, but it will always return `None` unless executed on a OS that supports Dark Mode, including older versions of macOS and Windows. -- On macOS, detection of the dark menu bar and dock option (available from macOS 10.10) is not supported. -- [Details](https://stackoverflow.com/questions/25207077/how-to-detect-if-os-x-is-in-dark-mode) on the detection method used on macOS. -- [Details](https://askubuntu.com/questions/1261366/detecting-dark-mode#comment2132694_1261366) on the experimental detection method used on Linux. diff --git a/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/RECORD b/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/RECORD deleted file mode 100644 index 39b20a4..0000000 --- a/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/RECORD +++ /dev/null @@ -1,18 +0,0 @@ -darkdetect-0.8.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -darkdetect-0.8.0.dist-info/LICENSE,sha256=abuEZk7_kzrdyycchm1nYi2cLFOlvaMbGnUjVpwlCv4,1495 -darkdetect-0.8.0.dist-info/METADATA,sha256=NkgDlZffAhLrmov8qk_CcvNff5Rg-chv3fQ6sJAk4UA,3590 -darkdetect-0.8.0.dist-info/RECORD,, -darkdetect-0.8.0.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92 -darkdetect-0.8.0.dist-info/top_level.txt,sha256=lIG2Q43uQniIc4b-ukidPntGpjQzuFfQCYrgxeM4RVQ,11 -darkdetect/__init__.py,sha256=q2BLQUpYqbfFzsXHVoQL38IKzwXH50aEFAMy4rBuh50,1412 -darkdetect/__main__.py,sha256=H1iyyQbJFbpOtKpSEmmV9H5ZjcrAI3zPWcCv1min5Ww,332 -darkdetect/__pycache__/__init__.cpython-311.pyc,, -darkdetect/__pycache__/__main__.cpython-311.pyc,, -darkdetect/__pycache__/_dummy.cpython-311.pyc,, -darkdetect/__pycache__/_linux_detect.cpython-311.pyc,, -darkdetect/__pycache__/_mac_detect.cpython-311.pyc,, -darkdetect/__pycache__/_windows_detect.cpython-311.pyc,, -darkdetect/_dummy.py,sha256=vKv_XK2dpvIGXZAjlNRuXiCH-vrRy7DBVCQKpbflrsM,473 -darkdetect/_linux_detect.py,sha256=nfyc7rpVNqMfbfGoXLsB7bPPSMG2cP1AauON73dCiKE,1584 -darkdetect/_mac_detect.py,sha256=XQfJ9gcbEFWoZxFrrnrsh-AVwIWHV-_oMpk3UCVBMWA,3745 -darkdetect/_windows_detect.py,sha256=8CCrPeTqNno1zVDXU5CP8D0AzOfqtcYOViHFnK3_WfA,4172 diff --git a/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/WHEEL b/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/WHEEL deleted file mode 100644 index 57e3d84..0000000 --- a/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.38.4) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/top_level.txt b/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/top_level.txt deleted file mode 100644 index 70fb6ee..0000000 --- a/.venv/Lib/site-packages/darkdetect-0.8.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -darkdetect diff --git a/.venv/Lib/site-packages/darkdetect/__init__.py b/.venv/Lib/site-packages/darkdetect/__init__.py deleted file mode 100644 index 73d92de..0000000 --- a/.venv/Lib/site-packages/darkdetect/__init__.py +++ /dev/null @@ -1,44 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (C) 2019 Alberto Sottile -# -# Distributed under the terms of the 3-clause BSD License. -#----------------------------------------------------------------------------- - -__version__ = '0.8.0' - -import sys -import platform - -def macos_supported_version(): - sysver = platform.mac_ver()[0] #typically 10.14.2 or 12.3 - major = int(sysver.split('.')[0]) - if major < 10: - return False - elif major >= 11: - return True - else: - minor = int(sysver.split('.')[1]) - if minor < 14: - return False - else: - return True - -if sys.platform == "darwin": - if macos_supported_version(): - from ._mac_detect import * - else: - from ._dummy import * -elif sys.platform == "win32" and platform.release().isdigit() and int(platform.release()) >= 10: - # Checks if running Windows 10 version 10.0.14393 (Anniversary Update) OR HIGHER. The getwindowsversion method returns a tuple. - # The third item is the build number that we can use to check if the user has a new enough version of Windows. - winver = int(platform.version().split('.')[2]) - if winver >= 14393: - from ._windows_detect import * - else: - from ._dummy import * -elif sys.platform == "linux": - from ._linux_detect import * -else: - from ._dummy import * - -del sys, platform diff --git a/.venv/Lib/site-packages/darkdetect/__main__.py b/.venv/Lib/site-packages/darkdetect/__main__.py deleted file mode 100644 index 1cb260b..0000000 --- a/.venv/Lib/site-packages/darkdetect/__main__.py +++ /dev/null @@ -1,9 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (C) 2019 Alberto Sottile -# -# Distributed under the terms of the 3-clause BSD License. -#----------------------------------------------------------------------------- - -import darkdetect - -print('Current theme: {}'.format(darkdetect.theme())) diff --git a/.venv/Lib/site-packages/darkdetect/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/darkdetect/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 86575414f85947927a8690c38425e9053c533b6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1705 zcmbVL&1)M+6rcUl%9hsB)=FdJ#L-%HTNSEGb_=fa0X3=Gg7HPpm$P9}G;4RQ&(7}J zv2hv^3>7)4xwwZGL=R~~{t5pHyJjKFLcmaZ&`pq=Pn}tN6)A-rI{W6$ym|A!esA_K zK^O&isGt10zRv;hHxYt?Wq-W+odVzhK(GcN1?dX4M)@nfMnh&FtT8IJNe4!dE&F?v zpn=Lf!^bZJ6+j&1V5q{bg4&<{j>Ee@hOGHB>z}bTy%`Ejhy8T;;Cyf$zJu;z58?ND zd4{WciRbBn;j&*Z`lfF;66l6KcYMSGU9iHDcl?b`1}ZSDS&OI<7&(h}ibxdWFxf{W zF@#9;43X2D0=~%xH}6t+X-F49TG-{XnT1TYOG2)c`hoF=6vg2AChRxS=obvYW`93i zAf(=={ty_!Gr&&vK!^DH&w%uBiGv=7H4mvh3NmHi1EL{Y09fYEz@TBM@c-iRZ!>-; z9=%87)(*rYG14O|h`iDhD$^z1%y%Q0uXYI_-7(D4tQT%nipF{!RXx61EGb(m@))gV zc%0s-XhxdxLi&zQPPuAvvrZPRR!2I)Cz(v1{8Cz!Z|Ex0WfeiSnyi|7@xHvGJ}^p^ zx(Vg$^|D!2YlbQp3=?W*RlffH(k*#)E}PBDxm>bPUpKakNR_j>zbi{-YAyJ#SK-LVG)&~YN#dS3q{dtnxQC}#*TL$XJ6M9-E1`K$WS4v zMAzyyB;rh?c8I z6P;~->+;bSdc51*bz_N^>5h!GXP!*8rrg+g%lIcg-p(H^KV9yO+lg5xG21CRiBIi# z+KH!IoEwR^=bkLK7TxiQ_E*Q_=i6Vt!8rggglpK=YKZ*bY09HM^EfQd&mr;#5sO)u zv`zbZ0bk}STFrcr9`hnfP?Mr~4DJddf39C2){*9&!s3M#XjZE`9*@+DTGUmK*L0|D zXa*wf_xJ!Af{GWykx6@F3f{o_wjOv96hH8p_yV90NVGU+C*dpAIy5WlHI%|4c}@B? z%zF$)QN1w``>+`~2BS^?b3v@>e?2xzP4qyYT>vbx{8&Dsl$|& zzj^qhlfP-_Z#((h_R<|^>5g?zIa*SzC8ZYvV`8gdiBfyQ5hYtpIb!OSm_8EI&r`OT zam38?pByn~3v-Sz*UY=T&_4J0QS*@-{@5Cz_hsm^No#3fA2O$sJOKr&bl?mk zfC`NaB4OL#ReEp{4R?l;j6wlJnLm0SCZ2#swm2A6_hm}Qp=I5m4M>mh!Vc+CZXg!8iD>X5knKF1KygSp9Td*zJcL{5o4mAR_R#8* zy8TU`b-ZN;8d#kexQ{FZU9C$FXy<^4q7LFF$IrbRY(s*O3-jV+zfy_FDV-utnFgGZr^D3d$Sw(+ylhRXjvIJ{sWwAe9=jG(}(|uzv+2?yt S4$ocFcb)fU_WLVja=rtNMYl}= diff --git a/.venv/Lib/site-packages/darkdetect/__pycache__/_linux_detect.cpython-311.pyc b/.venv/Lib/site-packages/darkdetect/__pycache__/_linux_detect.cpython-311.pyc deleted file mode 100644 index 8c269f94604a21ad27f811e83e16813c68af68c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2467 zcmb_d-)|E~5Z*oC`A6a;IEe#+q;W$Muu0OSDgr^NLPjCjnSLln4Z+xfDyY+Q}lcg+l{ek+O!y* z)Gae@na_FggEHeMfhipLjyF7UGcjQDIkqyU#;=>t{{h)h21t}8YcK&Ro84Ksb?s&6~km|I_R(+;LLWxg0>vW+uvLWN0|>`Gs>4lfRgZTWVx*hH5jBF?A|ps3sjqM`MX-oEj0n zF+xomGe4S4s+u)BS}`hE*$vTHU0*;jmlDkvin)%o&~Ms{URquXwH$r5B>K^kz>%l(zPz%d7srg1;~CKUnl1%$`|aU#o8|BdqLx4W*{GY$ls2 zJHWcWz7F#mT7De6J9cM$VSLpaD0l;TZ+Fq#y*#}9~(3!6-HPvonA4P)0Ls_PdjZPaZ{o9IYF1I-V*Ru!cl90SFT5gNFw-6tb-ea6*s; zkdZXb8o>K87G-^mUV?(y9st{^8vJ;%PEfkwGJF8H(OUhkJ4Y6dEKV2dJ92Ud>j3Nf zNP|-V+sk1e2OhSPhf6iY$!9!?Zn(B35--$u=H$*wB2@|lKQ~;W9%sN>TaVY2O0WrT zTk@Jj1rF2a- zbtZU<@rFDflqww3Y-#EYa7HvasnHBHF*TSM9Bz86Y<4VgU;`fzXOHnOA9S-uxY^2t zo(8ItC(ccr7QvXGo4t&t^ck9FbXuL=(hO@FG}g+eJ8X9>noLdsi`Y1A%VJUfser^P z$H<*j4U=k=u|r_yEn>LgT)=_$v=lwhh937n>0b?+iwk@q@YR1To2k9k z!rAAo4wbipU>=_A8)5%5p0PuB<{o#+^{lEpTG|0arJ{?Si%|qc@}I`hNlKm=SCM diff --git a/.venv/Lib/site-packages/darkdetect/__pycache__/_mac_detect.cpython-311.pyc b/.venv/Lib/site-packages/darkdetect/__pycache__/_mac_detect.cpython-311.pyc deleted file mode 100644 index d591551d422e20dfc78d4f1648f3bde6cb4a94e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6793 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 diff --git a/.venv/Lib/site-packages/darkdetect/__pycache__/_windows_detect.cpython-311.pyc b/.venv/Lib/site-packages/darkdetect/__pycache__/_windows_detect.cpython-311.pyc deleted file mode 100644 index 4143c4684e0c08b1de7dc3cce0cf5a725b021078..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5307 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 diff --git a/.venv/Lib/site-packages/darkdetect/_dummy.py b/.venv/Lib/site-packages/darkdetect/_dummy.py deleted file mode 100644 index 1e82117..0000000 --- a/.venv/Lib/site-packages/darkdetect/_dummy.py +++ /dev/null @@ -1,19 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (C) 2019 Alberto Sottile -# -# Distributed under the terms of the 3-clause BSD License. -#----------------------------------------------------------------------------- - -import typing - -def theme(): - return None - -def isDark(): - return None - -def isLight(): - return None - -def listener(callback: typing.Callable[[str], None]) -> None: - raise NotImplementedError() diff --git a/.venv/Lib/site-packages/darkdetect/_linux_detect.py b/.venv/Lib/site-packages/darkdetect/_linux_detect.py deleted file mode 100644 index 0570e6a..0000000 --- a/.venv/Lib/site-packages/darkdetect/_linux_detect.py +++ /dev/null @@ -1,45 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (C) 2019 Alberto Sottile, Eric Larson -# -# Distributed under the terms of the 3-clause BSD License. -#----------------------------------------------------------------------------- - -import subprocess - -def theme(): - try: - #Using the freedesktop specifications for checking dark mode - out = subprocess.run( - ['gsettings', 'get', 'org.gnome.desktop.interface', 'color-scheme'], - capture_output=True) - stdout = out.stdout.decode() - #If not found then trying older gtk-theme method - if len(stdout)<1: - out = subprocess.run( - ['gsettings', 'get', 'org.gnome.desktop.interface', 'gtk-theme'], - capture_output=True) - stdout = out.stdout.decode() - except Exception: - return 'Light' - # we have a string, now remove start and end quote - theme = stdout.lower().strip()[1:-1] - if '-dark' in theme.lower(): - return 'Dark' - else: - return 'Light' - -def isDark(): - return theme() == 'Dark' - -def isLight(): - return theme() == 'Light' - -# def listener(callback: typing.Callable[[str], None]) -> None: -def listener(callback): - with subprocess.Popen( - ('gsettings', 'monitor', 'org.gnome.desktop.interface', 'gtk-theme'), - stdout=subprocess.PIPE, - universal_newlines=True, - ) as p: - for line in p.stdout: - callback('Dark' if '-dark' in line.strip().removeprefix("gtk-theme: '").removesuffix("'").lower() else 'Light') diff --git a/.venv/Lib/site-packages/darkdetect/_mac_detect.py b/.venv/Lib/site-packages/darkdetect/_mac_detect.py deleted file mode 100644 index 8d44bc7..0000000 --- a/.venv/Lib/site-packages/darkdetect/_mac_detect.py +++ /dev/null @@ -1,124 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (C) 2019 Alberto Sottile -# -# Distributed under the terms of the 3-clause BSD License. -#----------------------------------------------------------------------------- - -import ctypes -import ctypes.util -import subprocess -import sys -import os -from pathlib import Path -from typing import Callable - -try: - from Foundation import NSObject, NSKeyValueObservingOptionNew, NSKeyValueChangeNewKey, NSUserDefaults - from PyObjCTools import AppHelper - _can_listen = True -except ModuleNotFoundError: - _can_listen = False - - -try: - # macOS Big Sur+ use "a built-in dynamic linker cache of all system-provided libraries" - appkit = ctypes.cdll.LoadLibrary('AppKit.framework/AppKit') - objc = ctypes.cdll.LoadLibrary('libobjc.dylib') -except OSError: - # revert to full path for older OS versions and hardened programs - appkit = ctypes.cdll.LoadLibrary(ctypes.util.find_library('AppKit')) - objc = ctypes.cdll.LoadLibrary(ctypes.util.find_library('objc')) - -void_p = ctypes.c_void_p -ull = ctypes.c_uint64 - -objc.objc_getClass.restype = void_p -objc.sel_registerName.restype = void_p - -# See https://docs.python.org/3/library/ctypes.html#function-prototypes for arguments description -MSGPROTOTYPE = ctypes.CFUNCTYPE(void_p, void_p, void_p, void_p) -msg = MSGPROTOTYPE(('objc_msgSend', objc), ((1 ,'', None), (1, '', None), (1, '', None))) - -def _utf8(s): - if not isinstance(s, bytes): - s = s.encode('utf8') - return s - -def n(name): - return objc.sel_registerName(_utf8(name)) - -def C(classname): - return objc.objc_getClass(_utf8(classname)) - -def theme(): - NSAutoreleasePool = objc.objc_getClass('NSAutoreleasePool') - pool = msg(NSAutoreleasePool, n('alloc')) - pool = msg(pool, n('init')) - - NSUserDefaults = C('NSUserDefaults') - stdUserDef = msg(NSUserDefaults, n('standardUserDefaults')) - - NSString = C('NSString') - - key = msg(NSString, n("stringWithUTF8String:"), _utf8('AppleInterfaceStyle')) - appearanceNS = msg(stdUserDef, n('stringForKey:'), void_p(key)) - appearanceC = msg(appearanceNS, n('UTF8String')) - - if appearanceC is not None: - out = ctypes.string_at(appearanceC) - else: - out = None - - msg(pool, n('release')) - - if out is not None: - return out.decode('utf-8') - else: - return 'Light' - -def isDark(): - return theme() == 'Dark' - -def isLight(): - return theme() == 'Light' - - -def _listen_child(): - """ - Run by a child process, install an observer and print theme on change - """ - import signal - signal.signal(signal.SIGINT, signal.SIG_IGN) - - OBSERVED_KEY = "AppleInterfaceStyle" - - class Observer(NSObject): - def observeValueForKeyPath_ofObject_change_context_( - self, path, object, changeDescription, context - ): - result = changeDescription[NSKeyValueChangeNewKey] - try: - print(f"{'Light' if result is None else result}", flush=True) - except IOError: - os._exit(1) - - observer = Observer.new() # Keep a reference alive after installing - defaults = NSUserDefaults.standardUserDefaults() - defaults.addObserver_forKeyPath_options_context_( - observer, OBSERVED_KEY, NSKeyValueObservingOptionNew, 0 - ) - - AppHelper.runConsoleEventLoop() - - -def listener(callback: Callable[[str], None]) -> None: - if not _can_listen: - raise NotImplementedError() - with subprocess.Popen( - (sys.executable, "-c", "import _mac_detect as m; m._listen_child()"), - stdout=subprocess.PIPE, - universal_newlines=True, - cwd=Path(__file__).parent, - ) as p: - for line in p.stdout: - callback(line.strip()) diff --git a/.venv/Lib/site-packages/darkdetect/_windows_detect.py b/.venv/Lib/site-packages/darkdetect/_windows_detect.py deleted file mode 100644 index 2363f18..0000000 --- a/.venv/Lib/site-packages/darkdetect/_windows_detect.py +++ /dev/null @@ -1,122 +0,0 @@ -from winreg import HKEY_CURRENT_USER as hkey, QueryValueEx as getSubkeyValue, OpenKey as getKey - -import ctypes -import ctypes.wintypes - -advapi32 = ctypes.windll.advapi32 - -# LSTATUS RegOpenKeyExA( -# HKEY hKey, -# LPCSTR lpSubKey, -# DWORD ulOptions, -# REGSAM samDesired, -# PHKEY phkResult -# ); -advapi32.RegOpenKeyExA.argtypes = ( - ctypes.wintypes.HKEY, - ctypes.wintypes.LPCSTR, - ctypes.wintypes.DWORD, - ctypes.wintypes.DWORD, - ctypes.POINTER(ctypes.wintypes.HKEY), -) -advapi32.RegOpenKeyExA.restype = ctypes.wintypes.LONG - -# LSTATUS RegQueryValueExA( -# HKEY hKey, -# LPCSTR lpValueName, -# LPDWORD lpReserved, -# LPDWORD lpType, -# LPBYTE lpData, -# LPDWORD lpcbData -# ); -advapi32.RegQueryValueExA.argtypes = ( - ctypes.wintypes.HKEY, - ctypes.wintypes.LPCSTR, - ctypes.wintypes.LPDWORD, - ctypes.wintypes.LPDWORD, - ctypes.wintypes.LPBYTE, - ctypes.wintypes.LPDWORD, -) -advapi32.RegQueryValueExA.restype = ctypes.wintypes.LONG - -# LSTATUS RegNotifyChangeKeyValue( -# HKEY hKey, -# WINBOOL bWatchSubtree, -# DWORD dwNotifyFilter, -# HANDLE hEvent, -# WINBOOL fAsynchronous -# ); -advapi32.RegNotifyChangeKeyValue.argtypes = ( - ctypes.wintypes.HKEY, - ctypes.wintypes.BOOL, - ctypes.wintypes.DWORD, - ctypes.wintypes.HANDLE, - ctypes.wintypes.BOOL, -) -advapi32.RegNotifyChangeKeyValue.restype = ctypes.wintypes.LONG - -def theme(): - """ Uses the Windows Registry to detect if the user is using Dark Mode """ - # Registry will return 0 if Windows is in Dark Mode and 1 if Windows is in Light Mode. This dictionary converts that output into the text that the program is expecting. - valueMeaning = {0: "Dark", 1: "Light"} - # In HKEY_CURRENT_USER, get the Personalisation Key. - try: - key = getKey(hkey, "Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize") - # In the Personalisation Key, get the AppsUseLightTheme subkey. This returns a tuple. - # The first item in the tuple is the result we want (0 or 1 indicating Dark Mode or Light Mode); the other value is the type of subkey e.g. DWORD, QWORD, String, etc. - subkey = getSubkeyValue(key, "AppsUseLightTheme")[0] - except FileNotFoundError: - # some headless Windows instances (e.g. GitHub Actions or Docker images) do not have this key - return None - return valueMeaning[subkey] - -def isDark(): - if theme() is not None: - return theme() == 'Dark' - -def isLight(): - if theme() is not None: - return theme() == 'Light' - -#def listener(callback: typing.Callable[[str], None]) -> None: -def listener(callback): - hKey = ctypes.wintypes.HKEY() - advapi32.RegOpenKeyExA( - ctypes.wintypes.HKEY(0x80000001), # HKEY_CURRENT_USER - ctypes.wintypes.LPCSTR(b'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize'), - ctypes.wintypes.DWORD(), - ctypes.wintypes.DWORD(0x00020019), # KEY_READ - ctypes.byref(hKey), - ) - - dwSize = ctypes.wintypes.DWORD(ctypes.sizeof(ctypes.wintypes.DWORD)) - queryValueLast = ctypes.wintypes.DWORD() - queryValue = ctypes.wintypes.DWORD() - advapi32.RegQueryValueExA( - hKey, - ctypes.wintypes.LPCSTR(b'AppsUseLightTheme'), - ctypes.wintypes.LPDWORD(), - ctypes.wintypes.LPDWORD(), - ctypes.cast(ctypes.byref(queryValueLast), ctypes.wintypes.LPBYTE), - ctypes.byref(dwSize), - ) - - while True: - advapi32.RegNotifyChangeKeyValue( - hKey, - ctypes.wintypes.BOOL(True), - ctypes.wintypes.DWORD(0x00000004), # REG_NOTIFY_CHANGE_LAST_SET - ctypes.wintypes.HANDLE(None), - ctypes.wintypes.BOOL(False), - ) - advapi32.RegQueryValueExA( - hKey, - ctypes.wintypes.LPCSTR(b'AppsUseLightTheme'), - ctypes.wintypes.LPDWORD(), - ctypes.wintypes.LPDWORD(), - ctypes.cast(ctypes.byref(queryValue), ctypes.wintypes.LPBYTE), - ctypes.byref(dwSize), - ) - if queryValueLast.value != queryValue.value: - queryValueLast.value = queryValue.value - callback('Light' if queryValue.value else 'Dark') diff --git a/.venv/Lib/site-packages/dateutil/__init__.py b/.venv/Lib/site-packages/dateutil/__init__.py deleted file mode 100644 index a2c19c0..0000000 --- a/.venv/Lib/site-packages/dateutil/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -import sys - -try: - from ._version import version as __version__ -except ImportError: - __version__ = 'unknown' - -__all__ = ['easter', 'parser', 'relativedelta', 'rrule', 'tz', - 'utils', 'zoneinfo'] - -def __getattr__(name): - import importlib - - if name in __all__: - return importlib.import_module("." + name, __name__) - raise AttributeError( - "module {!r} has not attribute {!r}".format(__name__, name) - ) - - -def __dir__(): - # __dir__ should include all the lazy-importable modules as well. - return [x for x in globals() if x not in sys.modules] + __all__ diff --git a/.venv/Lib/site-packages/dateutil/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/dateutil/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index ac6eab7af61be30ae08af20a158beec7be19aeb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1441 zcmZux-)q}e6h2pyB_*Ecl9nZqu(@3b7&gyYUz%Y8X)@ZfE-!93=4lAoy79E=N4UDS z6VIh)bYqMaR@m0pY!6vSHuhB5OaBL_1Zo6>z+lifkL)4jY3JIOlXg40`gG4dN8hq(nwt5Fjs;wbvHYq|@e=4X~pAy6@iL^Rpp%eI#R`b{Wpy6k= zNTpWDDT~w%i-q`1G3r{}sZ*P}+=>#6)m$1$ycs2G+;PK5Zw5Yf{I#GWSYuPMBjbJe z00GxPY;fTgX#vO8##RURa*J%A8i^x-Yi&UjT`ri0wu70wqwFH^u{eVH@^<3HJL#Q% zzXi`S?BI-dN3;HnWR+DW=#NRRdBF>8TxsUh^XyjUV=K(~0nb>RGpAhRgW;?ijXB;% zz_{y_Bh54|*EP*3H5fAo1d(oq5IHbRHf*Eg)nx>cp2VOyMv6Me%p9pB-m zncLWklBQXuTrAr(*(6Tw1u@6>5ZcgH&UNB;pe64%+PB-cyXmPX>AA=0x$W@5jUSp1 zFYToZ`{_bQFZ?k+)zx2nqF;QhUwnA=cY9A?-q)A^mZhZn45*f2@&;$ zbQwEBNOypbjtpQ2M|a~~Sb5GrEjA%0`~;-cXLKsQwX=91<`C{f6t~SvFLS{~&J2BmUM_htq=IH3Cr;=m_<3ng`Jyjzpsu7%%$O=J`{V#?> Q*I%e9xT{Ud-;+uCUv=1G`~Uy| diff --git a/.venv/Lib/site-packages/dateutil/__pycache__/_common.cpython-311.pyc b/.venv/Lib/site-packages/dateutil/__pycache__/_common.cpython-311.pyc deleted file mode 100644 index be9559df51d6661f02b725c5defda45223e1a80a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2057 zcmZuy%TF6e7@yf)KQY*JX@NGawmgy;DCN;aRTCi*9wBO>QVflPR$7^z0UZ1wJG+oj zBcY0eRdGO3B{=lJff6AusLG*-{t-@;gSAp6q^dnTA_tUHzuC1HTr!q_`@LpozTbS` z?DP8iFoLo0@8tZxh|u3$sSaO7IK2wO4kBn43Fs~&coPwU;sc03g1Z zRwN-JZsJ*qNSkQZM|^;O;s*?n0AP>=0YgN94TSB$Dy2&#`P9bQDc##&Wf88QwmFOB zaUN+Pxg#%thN~Ju33Q034h4fxFeHGuXiJQy=g%#S`xHfax2b=l&M;~)l^TR*AX%22 zQ>W+?Q%~nCqK@X4tPIVXR85!`Nm&_nbmGnfb$Xz$uTSmoR}#5-b2VvDwXa{fJ9AGp zxkFp9QfluC&9125rRG$YGU*q~Nqs4~K$%LCCbi5|`b$lB$nIT!Y6mqfl}(wNwic@} z&|9^HV56)FU;~w!KPyOEky7Ia@bDMlcM5i-S5JT|JY9#V`ylKfPShiAcgB(vX#iab zlt+6WWmP|aLcI6BJU#&V$kP+Z@Iy#kbXc`Rnx?0djA@!fY+Nvc;B|bA&ruYE@1AF; zC)4TL>|9Gd_}O&;$gVE3E&byE`BvdpNp3EDdm=aQ3_Tm#>)7u(#xLc8*YZFyGGNp} z@cT1f2G0%(@eDw6M;@QcOPm+PV&L~O2frt~enTKQfwGP5$mCpBMhB#Y(L<=|1X@K; z#D{1VJ2fj#jZXs~Ua8p)!=`DZ<}8zr8Ai^4GUTM#zMQ!TRd$gUzoya0KuW{;k#k*! zaP|Yh1}Y0usI?T8xAMEzuj{X(J;i9xvGl_KN9Ui{UiA$Z`-V%+SGKLPi2Co~vwxzW zmJtrMoebfVwFgW~UaP}DsFz~Pn8*P!em^MbF2 zwhKivFC0MBkr(L|i7hQA+2T1haqLjRc;tCy@R-`la4nxe6l(|AKz~K$Qn+EOhr`vf zPy8_a28pq{w;aky4AosO3eL0B1~Cwz4WJR+;*UV-J4Jkmj7Gl1|4t-JYfpshpYymV z02FCc%kJ2-$zrsv7;JNw^%92wzNEA4I0$g<)^uMh*xa$s?cO{l}aum-&b zx1u-|57@%w_qH%SV+#+);5lIn55Ifb1eSkIfhP*OAcz=4H3S+3haLO@)aQ`N|&N`)dE@?vF3!u41IiN#4B< z!o0(?$qZ0shc(UpOn@BGw8vI5UGcze!O}UC-xmD4Wi)W$#cq7WfwN=q^EO&I@HTgD z54V0esr>3;>i`?xuhjVQ?np7FY}_kLf=@1^S_n$M!7}n7;`cR`kq0r!2j$~I1pC^d zb*kX^`MS&KGPpbA`RvlzB@KAzD&ekdq3O z_TVo7RgNoI~d%-wngmA^P_a`RJ4b5iY!cz~{A1ma=^ mAn}2jk&*EO8-t|U1qRgy?vC^uD!LaKfJktHF9;Taf)@ads%&fk diff --git a/.venv/Lib/site-packages/dateutil/__pycache__/easter.cpython-311.pyc b/.venv/Lib/site-packages/dateutil/__pycache__/easter.cpython-311.pyc deleted file mode 100644 index 92059e8b1e9155f8e57e9a4d99be8fb6eba67977..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2983 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 diff --git a/.venv/Lib/site-packages/dateutil/zoneinfo/rebuild.py b/.venv/Lib/site-packages/dateutil/zoneinfo/rebuild.py deleted file mode 100644 index 684c658..0000000 --- a/.venv/Lib/site-packages/dateutil/zoneinfo/rebuild.py +++ /dev/null @@ -1,75 +0,0 @@ -import logging -import os -import tempfile -import shutil -import json -from subprocess import check_call, check_output -from tarfile import TarFile - -from dateutil.zoneinfo import METADATA_FN, ZONEFILENAME - - -def rebuild(filename, tag=None, format="gz", zonegroups=[], metadata=None): - """Rebuild the internal timezone info in dateutil/zoneinfo/zoneinfo*tar* - - filename is the timezone tarball from ``ftp.iana.org/tz``. - - """ - tmpdir = tempfile.mkdtemp() - zonedir = os.path.join(tmpdir, "zoneinfo") - moduledir = os.path.dirname(__file__) - try: - with TarFile.open(filename) as tf: - for name in zonegroups: - tf.extract(name, tmpdir) - filepaths = [os.path.join(tmpdir, n) for n in zonegroups] - - _run_zic(zonedir, filepaths) - - # write metadata file - with open(os.path.join(zonedir, METADATA_FN), 'w') as f: - json.dump(metadata, f, indent=4, sort_keys=True) - target = os.path.join(moduledir, ZONEFILENAME) - with TarFile.open(target, "w:%s" % format) as tf: - for entry in os.listdir(zonedir): - entrypath = os.path.join(zonedir, entry) - tf.add(entrypath, entry) - finally: - shutil.rmtree(tmpdir) - - -def _run_zic(zonedir, filepaths): - """Calls the ``zic`` compiler in a compatible way to get a "fat" binary. - - Recent versions of ``zic`` default to ``-b slim``, while older versions - don't even have the ``-b`` option (but default to "fat" binaries). The - current version of dateutil does not support Version 2+ TZif files, which - causes problems when used in conjunction with "slim" binaries, so this - function is used to ensure that we always get a "fat" binary. - """ - - try: - help_text = check_output(["zic", "--help"]) - except OSError as e: - _print_on_nosuchfile(e) - raise - - if b"-b " in help_text: - bloat_args = ["-b", "fat"] - else: - bloat_args = [] - - check_call(["zic"] + bloat_args + ["-d", zonedir] + filepaths) - - -def _print_on_nosuchfile(e): - """Print helpful troubleshooting message - - e is an exception raised by subprocess.check_call() - - """ - if e.errno == 2: - logging.error( - "Could not find zic. Perhaps you need to install " - "libc-bin or some other package that provides it, " - "or it's not in your PATH?") diff --git a/.venv/Lib/site-packages/distutils-precedence.pth b/.venv/Lib/site-packages/distutils-precedence.pth deleted file mode 100644 index 7f009fe..0000000 --- a/.venv/Lib/site-packages/distutils-precedence.pth +++ /dev/null @@ -1 +0,0 @@ -import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'local') == 'local'; enabled and __import__('_distutils_hack').add_shim(); diff --git a/.venv/Lib/site-packages/fontTools/__init__.py b/.venv/Lib/site-packages/fontTools/__init__.py deleted file mode 100644 index 5621f39..0000000 --- a/.venv/Lib/site-packages/fontTools/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -import logging -from fontTools.misc.loggingTools import configLogger - -log = logging.getLogger(__name__) - -version = __version__ = "4.51.0" - -__all__ = ["version", "log", "configLogger"] diff --git a/.venv/Lib/site-packages/fontTools/__main__.py b/.venv/Lib/site-packages/fontTools/__main__.py deleted file mode 100644 index 7c74ad3..0000000 --- a/.venv/Lib/site-packages/fontTools/__main__.py +++ /dev/null @@ -1,35 +0,0 @@ -import sys - - -def main(args=None): - if args is None: - args = sys.argv[1:] - - # TODO Handle library-wide options. Eg.: - # --unicodedata - # --verbose / other logging stuff - - # TODO Allow a way to run arbitrary modules? Useful for setting - # library-wide options and calling another library. Eg.: - # - # $ fonttools --unicodedata=... fontmake ... - # - # This allows for a git-like command where thirdparty commands - # can be added. Should we just try importing the fonttools - # module first and try without if it fails? - - if len(sys.argv) < 2: - sys.argv.append("help") - if sys.argv[1] == "-h" or sys.argv[1] == "--help": - sys.argv[1] = "help" - mod = "fontTools." + sys.argv[1] - sys.argv[1] = sys.argv[0] + " " + sys.argv[1] - del sys.argv[0] - - import runpy - - runpy.run_module(mod, run_name="__main__") - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/.venv/Lib/site-packages/fontTools/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 4d326f11d913b349f0b838218ad588afe1d67ffa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 514 zcmY*V&1w`u5U$?Yo!LZJj}g2~j*B|ZN^%kL5CZHzBv2?AdGttE#KMt}4Fjt}lbZDmdZ4UQWKd__MuSiMIsj z&mH&x3>e8FX=5iRMJMSH=m3Y;SAD>{p9#P>cP=IAG4F&Vei8^^-A^RxGctx@?{{0? z9TIyzQ{_a89VGox&jwSjE2&EB?eZ(>?IHK-38r^lyUPD|CK(qm3n&*gL;oQ~W;$8NT?pJO;<(ly# zEb1yfpu7CUWVxyt-ByQn!AryG*wjqc1>JtS^@{F2h~t=!M&VdZ%yFtYjYr{={b$s) z1r)WU(Ug}{x+4#0B@MrKlxByi;1&J%o%@Kglm;<6dUMf#R47*G{IS02p4INOdg0t3 zj}USOH=2c>!N%-=oBL~xIQ7>)_J8>6r~Z25&2NP>2%F&jo%!nB*}|HjRXuQge*w|W BlzadH diff --git a/.venv/Lib/site-packages/fontTools/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/__pycache__/__main__.cpython-311.pyc deleted file mode 100644 index 388ac3931b1a298668ddb4280dfba6fb44795af0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1350 zcmaJ>%}X0W6rb50vumQY##H<$n$jK`iqW(PMQjgMsHIjYQCnmo#LTEMpYCpKOcRI@ zODvJ*Aee(f4%S-QKcfFYAqhgmf*=$M-UR8zQ)f0NDww{RdCYt7H}7NK?0#u(HUdiI z&#So~JOIC$P$hJ}Ii04PEr0=relPG=v#3GUJDx2gi{ zK`PNzAxJ$r^<`@~W~vEK%|;~_m-#wH)cY2QgQP{JVwDzaSPU^(<2tJbkN|2!O#s)Q zxta;)eEI>o_j+``R?~%F05E^m3#=0h!;9Q7s@#>*eto1X*oO0aZNYp!^e{~b8|qmv z;>IX00qfv|3mg_1vJUQ29sfhIoa%TGo&YRh;718A&gCz4i5@wpIK++LjeE4`-}G0- z)bynQC$O0&j#<->nO;K+#2=1veG4%|U!T4=&V_>NWGLiU>@tI#L8~UZTmiQ?=yKVh zCd!eZE9edon?d816-7gCd45^r{UoRv+~F_@Vy%H=b;}ngjvV4R3 zRoH8=TCHavJVVlyLS#iEGA03QAfmWur3n&MJ^oMxOQRuQBtU{Hk(_D-dm{m9bnMw1 zY4YK~z<}g%Se>Cc^_^QL(tyMIeCmayGJ|VA;+5>nB)BY%duJuZtCGI3+v9W36Gf_3 z*k7&7PP0XU|cMgsy_nwd2`d$S-aC_TQFz1`9od z<@Vbfd`8T+uA9on_MNuvj{KeN?xOKta^%o_Yx922vH2j+7tMD+dv+K0mv((cvtw-} zHI{z8`ce;=ZB3hw(9PsH8%L<|7qXO)CF{%&6_BNf><7qRsLoSb5RgU6Y;eMcWcIJp z%Vq6l4RyIRM512xE08VBW~S^+9IiC*soX(D_HdLb%1(F)VHp^c`ZzIk!~PR+l??;b ol#Z47&H~?AMomeU_hfo;ggl+5WyWoDoS$xw+em?H?VDKF)d0Ip6u7=X~=Q4GnG%m-0VO&Gzo)xc^QG^KzCS zKL5zZakn{{JIl$uY@6rL@-|N4FCo{sWc#~3$Gwk#<2q}vDRawLGY2%i)xtQD5%0A3zrA787kf^OM+fH-lf1oww1`(f%$xHK!G#gVT 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

    q=MC?ZEZJ3iAtvHq7qX(V8qW&%VfG_b0 ze)M`czO-sz@^0wbPm#r>lkT__i$q}wlI6e-8q^!~^zQ&PnjN`bhR8`%K7k+7f|3NQ zSkSw>^R9gb*S?}_A1y-QbL(KI6FUddrpVFLc*iP7 z;9C$A?&~i4gR$W4N~_C>eAmuG({QnA__~NZw?Eyo+_h?Ja5jBrZ*tpy%>i7mTkW$- zoKDYY_IfG-KuH_d)S14pd$L^rsILJ^cmGK+!XBeX>;VS>>9XJ*CFxbU4#@BeEPx+e=L?2+;F1-a2^m zAmWxi+ln5%k9Tdu#(Vl`rZ*$61Ymv^nfX})x~TGf&z5^01S^}C`)1XJhO{#sUVg10 zbQOiJywHVH3YK%JAaoXm&b-ix-F(WqHGgydMszu9o$+8jU5!+7!@cZIyGw%Smg}Y~ g)0b_3GguJ1i$ZtayjKS}M;GS4DqwPKhD_i6ABqTpqW}N^ diff --git a/.venv/Lib/site-packages/fontTools/__pycache__/agl.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/__pycache__/agl.cpython-311.pyc deleted file mode 100644 index 0834167668ac7bab56e6819b563cd406806cfe40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114276 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

    3A+n>1*x=`eKfJv_0C0cx$}oh`nSgqCp(z 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 LID9vLa6JA$4$9`r diff --git a/.venv/Lib/site-packages/fontTools/__pycache__/fontBuilder.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/__pycache__/fontBuilder.cpython-311.pyc deleted file mode 100644 index ecb0ca482be28816646bca82ba7766e22d31247a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38663 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

    +}3m=;_Ohz?g8MXPfv9 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 diff --git a/.venv/Lib/site-packages/fontTools/__pycache__/help.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/__pycache__/help.cpython-311.pyc deleted file mode 100644 index 9e5862e22fb226435c57f511bf8f858cd254a960..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2302 zcmZ`4OKcNY@a@m`+D_tNVv;nprWlG-Y8;}flvv^C5K>aqDv%0y(aP~|oORY8?XHs$ z*~o1<_>cqYB}f!0mD&`PRBF{$%7Gpz7mjvh32UWDNEKCkbCn)YPMx=l?Kl$icIVB! z`MjBVvu}TBYqKK&@vo1kkJ1SJiJ3Y8Z@~6ln3j=%1VTm;b0#8$!IKfvn5hV5%yfi? znUtBNC1N3vK;1?Wt7sGGSrYqFj*>`Z1x6$j#=dxM(E|Gu2?wSztXoz=cg@hpJb}Q* zx(d`9W(@$(#Dwwst^eSaD}F+!KZ$BHF;l_BR+uPww{L;BWu)zrC5SqcM-s{t8dK*H z_`QuZZ2Jll^-8?PgFyDwRZ*M}sCBwEgD`51eiim!YwRCJH-5>JEYcbkKqyCQZ4H-u zthJ8UNdzWNtU|17jd=4^>cC;7xtbO}q}cQHbtG8w^euX6*qrByd9*-XNAm=Wa#Vt? z>o-p+&*T_oG)J!Nin6W+6{7@eYtFCHv+dQ(lR0L^+4R(;T5Gnu#yKKKhCp%YKIGQh zwAho|`rh1f#7cWpyGga~1n2P%2mO*K^NjXZQ%hiTq+q|t2#y?ckGM~3-liX zt#u&K(lNm@f&6WY?GrQUd9OAjsooh;&cqrW0JgZ>2jSiJ0lEx5zl?I|h9ghphy<*d zFo~84@aGf|_#=##PeqfWpVY}fP^Xe6CUgotD)TIJZFN<_;T*iz#s-qYN(|NJgbp zAS9<_QCS@hGz7TE)l-1}hEYH@M0qR*dhYC~QHXUe*=kgMtto9%+qf_aPI}Sah#&xW zfhD7e)6#-YV&8}c8e_#f!6>9f96I+2Ev^B6*Of5y>RTW zI1U!VRd-ime5<3YS@0L`-irI!kN!%3XyemL|Cy5i?9;xId$R1Fthgs@3>?A5xN)lN30FMf;%IU7; z4G}EtTt`*s{^BKbyacFGAiy(iWjm|AhrT&p=?xSwSFs({c9y7mdX{Iuo?SWq6Iu2Q zRy>2xJVTqFp^eK=_mw^470>t`>bdX4GvDb=-|4b1RPo__d}r=B?@p9mhh9Pe2l3tz zbRAWlu4336^#D47c;0vHSzlnYFHr6aR{DaV&wNCfxNPe#QpL}=Y;8qmC1#EXLl1^Z z?H~Ledz2{I#>%#_ifs%Ccp#&OrFsMofpwXU)ctr74|EtI*QWK)@*YKWVln zc*NHV&nt(pfrIDg;3k3Af|bLt@(?NbCt$SCjx7Y&PF5C&l>u18SDLy42$CU)Drzqn zql)YWV^oo=RDW7&wqT4Z>MpfDHA@$P3%Uyj5$!B4Zc;rZs;5e`g^`l|jk{9i&B3yL laO3c!{t`V>rbjCD2oP1;RtSG_@%F`nF=`B=d%?`e;D5vVFYN#T diff --git a/.venv/Lib/site-packages/fontTools/__pycache__/tfmLib.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/__pycache__/tfmLib.cpython-311.pyc deleted file mode 100644 index a6212ab5f6ffbb129a997d7be950c7997b6edbfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19679 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 diff --git a/.venv/Lib/site-packages/fontTools/__pycache__/ttx.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/__pycache__/ttx.cpython-311.pyc deleted file mode 100644 index d11857f171e7b9d971a75c5b46a74384835e821e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20198 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 diff --git a/.venv/Lib/site-packages/fontTools/__pycache__/unicode.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/__pycache__/unicode.cpython-311.pyc deleted file mode 100644 index e1f1099d61a99ca2951885657f3bd71cf8508faf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2835 zcmZuz|7%lM6ugnBAoR!@ytnQ#%3+4+?{^fxkuSp!BDm^U@?u<9&Ibci%bZo_Fs# zpL1`1@p@eZn)>g>S-VKc-}q8(@NTuOFW|9E6!L&f6OK#}g+3q(r_xoPkTtj~ZJM)m zJm`cb9nTS!Uj@UpsyUGbMFfwcVw)midz97`gy5Ia@77-c%f#5DOOwK$H&E}kM&GMo zvsSaq&=|>ZX*y0mpUCiOUZ;yN*{6uY9K!8*Po|W}cycb4P&Gr1Oc^O9mP$m%&y9T+xiT^| zG!z*g?wv}`8VfR0BSXWz6Iahi3{*%rQnAS3ZB@G+`7|~Y(P7H(&&$y{`G%@TW|Nw6 zC7F!tM|USUIDgmlN(p&Rte=vwik?vRY{}P_ zJy&XNFB7}iV?jZV7uAUmha26NAbmYjxPnfbB?_KkvHcpx&7HoTQCI@MX0taiMBdHvP@Jm zO%*cDVF^t03I`}CJS0&tTcoR%B%Dd_+WESj#E9@BI~)}lZ>-C(AWoL4m~ucm0R5~-}K@mc19p(Z!0ux{w+=nI+2 z-a@fMl44rSkfeJZjgcIzDzGZ_?*V`%?)JR=gMY)_Q*;9%1n1$+Hjq5-Sn2>$c#o`% zZ3Yh)W;TN1VlbQ+%RI;|g$1wBb)HL~qLM4DJm`vud#2l5|5gpjHzQ z@6M)p*K|P`qaO#zk}}6TJ4^nKrIRZ+i~fOi&%pMk52NkutV79vAb&i69OCWlgy`v* z@cSMg`OekDKczi9@&yu&JCh`tE=fuxl~f%29!dH#CC4io7J_lCAK*D*0qi41*xOa` zK}R0}$kwhhXA`^1qz0{m2=i)&iaYf5<~ql(HP<;*IB)u@aT-g-;zmqsNNerP`q6UW zgfuB64kfAun$l>e6)l(Ht`kkDCKIT@6_6TD&2ZL5`?rC{qPIw6o#~YkHPXOIQ~geu zpJX^)b_f8@5zp>ktjLBuV!F>K=9A2@NMySAs2FnFAEJzQ)-20yu~xthYkk; zbX-BTs;wN}>)IDMsOTEQdU43t0LU=W87kX|_vpH3u=WF%Sp*9q%PLUv99(bwA>l$; zu7X9nR*0Y5s=6_#%3>5T}aJlsEo%^4gZEP zo_KHJhxY#)YRtY2oSPyHs}|}XNp9MAPo*%mc3&M2wA~%IMOTeo?Kq^KeE_N?@SMuB*C>> from fontTools.afmLib import AFM - >>> f = AFM("Tests/afmLib/data/TestAFM.afm") - >>> - >>> # Accessing a pair gets you the kern value - >>> f[("V","A")] - -60 - >>> - >>> # Accessing a glyph name gets you metrics - >>> f["A"] - (65, 668, (8, -25, 660, 666)) - >>> # (charnum, width, bounding box) - >>> - >>> # Accessing an attribute gets you metadata - >>> f.FontName - 'TestFont-Regular' - >>> f.FamilyName - 'TestFont' - >>> f.Weight - 'Regular' - >>> f.XHeight - 500 - >>> f.Ascender - 750 - >>> - >>> # Attributes and items can also be set - >>> f[("A","V")] = -150 # Tighten kerning - >>> f.FontName = "TestFont Squished" - >>> - >>> # And the font written out again (remove the # in front) - >>> #f.write("testfont-squished.afm") - -.. rubric:: Footnotes - -.. [#f1] `Adobe Technote 5004 `_, - Adobe Font Metrics File Format Specification. - -""" - -import re - -# every single line starts with a "word" -identifierRE = re.compile(r"^([A-Za-z]+).*") - -# regular expression to parse char lines -charRE = re.compile( - r"(-?\d+)" # charnum - r"\s*;\s*WX\s+" # ; WX - r"(-?\d+)" # width - r"\s*;\s*N\s+" # ; N - r"([.A-Za-z0-9_]+)" # charname - r"\s*;\s*B\s+" # ; B - r"(-?\d+)" # left - r"\s+" - r"(-?\d+)" # bottom - r"\s+" - r"(-?\d+)" # right - r"\s+" - r"(-?\d+)" # top - r"\s*;\s*" # ; -) - -# regular expression to parse kerning lines -kernRE = re.compile( - r"([.A-Za-z0-9_]+)" # leftchar - r"\s+" - r"([.A-Za-z0-9_]+)" # rightchar - r"\s+" - r"(-?\d+)" # value - r"\s*" -) - -# regular expressions to parse composite info lines of the form: -# Aacute 2 ; PCC A 0 0 ; PCC acute 182 211 ; -compositeRE = re.compile( - r"([.A-Za-z0-9_]+)" # char name - r"\s+" - r"(\d+)" # number of parts - r"\s*;\s*" -) -componentRE = re.compile( - r"PCC\s+" # PPC - r"([.A-Za-z0-9_]+)" # base char name - r"\s+" - r"(-?\d+)" # x offset - r"\s+" - r"(-?\d+)" # y offset - r"\s*;\s*" -) - -preferredAttributeOrder = [ - "FontName", - "FullName", - "FamilyName", - "Weight", - "ItalicAngle", - "IsFixedPitch", - "FontBBox", - "UnderlinePosition", - "UnderlineThickness", - "Version", - "Notice", - "EncodingScheme", - "CapHeight", - "XHeight", - "Ascender", - "Descender", -] - - -class error(Exception): - pass - - -class AFM(object): - _attrs = None - - _keywords = [ - "StartFontMetrics", - "EndFontMetrics", - "StartCharMetrics", - "EndCharMetrics", - "StartKernData", - "StartKernPairs", - "EndKernPairs", - "EndKernData", - "StartComposites", - "EndComposites", - ] - - def __init__(self, path=None): - """AFM file reader. - - Instantiating an object with a path name will cause the file to be opened, - read, and parsed. Alternatively the path can be left unspecified, and a - file can be parsed later with the :meth:`read` method.""" - self._attrs = {} - self._chars = {} - self._kerning = {} - self._index = {} - self._comments = [] - self._composites = {} - if path is not None: - self.read(path) - - def read(self, path): - """Opens, reads and parses a file.""" - lines = readlines(path) - for line in lines: - if not line.strip(): - continue - m = identifierRE.match(line) - if m is None: - raise error("syntax error in AFM file: " + repr(line)) - - pos = m.regs[1][1] - word = line[:pos] - rest = line[pos:].strip() - if word in self._keywords: - continue - if word == "C": - self.parsechar(rest) - elif word == "KPX": - self.parsekernpair(rest) - elif word == "CC": - self.parsecomposite(rest) - else: - self.parseattr(word, rest) - - def parsechar(self, rest): - m = charRE.match(rest) - if m is None: - raise error("syntax error in AFM file: " + repr(rest)) - things = [] - for fr, to in m.regs[1:]: - things.append(rest[fr:to]) - charname = things[2] - del things[2] - charnum, width, l, b, r, t = (int(thing) for thing in things) - self._chars[charname] = charnum, width, (l, b, r, t) - - def parsekernpair(self, rest): - m = kernRE.match(rest) - if m is None: - raise error("syntax error in AFM file: " + repr(rest)) - things = [] - for fr, to in m.regs[1:]: - things.append(rest[fr:to]) - leftchar, rightchar, value = things - value = int(value) - self._kerning[(leftchar, rightchar)] = value - - def parseattr(self, word, rest): - if word == "FontBBox": - l, b, r, t = [int(thing) for thing in rest.split()] - self._attrs[word] = l, b, r, t - elif word == "Comment": - self._comments.append(rest) - else: - try: - value = int(rest) - except (ValueError, OverflowError): - self._attrs[word] = rest - else: - self._attrs[word] = value - - def parsecomposite(self, rest): - m = compositeRE.match(rest) - if m is None: - raise error("syntax error in AFM file: " + repr(rest)) - charname = m.group(1) - ncomponents = int(m.group(2)) - rest = rest[m.regs[0][1] :] - components = [] - while True: - m = componentRE.match(rest) - if m is None: - raise error("syntax error in AFM file: " + repr(rest)) - basechar = m.group(1) - xoffset = int(m.group(2)) - yoffset = int(m.group(3)) - components.append((basechar, xoffset, yoffset)) - rest = rest[m.regs[0][1] :] - if not rest: - break - assert len(components) == ncomponents - self._composites[charname] = components - - def write(self, path, sep="\r"): - """Writes out an AFM font to the given path.""" - import time - - lines = [ - "StartFontMetrics 2.0", - "Comment Generated by afmLib; at %s" - % (time.strftime("%m/%d/%Y %H:%M:%S", time.localtime(time.time()))), - ] - - # write comments, assuming (possibly wrongly!) they should - # all appear at the top - for comment in self._comments: - lines.append("Comment " + comment) - - # write attributes, first the ones we know about, in - # a preferred order - attrs = self._attrs - for attr in preferredAttributeOrder: - if attr in attrs: - value = attrs[attr] - if attr == "FontBBox": - value = "%s %s %s %s" % value - lines.append(attr + " " + str(value)) - # then write the attributes we don't know about, - # in alphabetical order - items = sorted(attrs.items()) - for attr, value in items: - if attr in preferredAttributeOrder: - continue - lines.append(attr + " " + str(value)) - - # write char metrics - lines.append("StartCharMetrics " + repr(len(self._chars))) - items = [ - (charnum, (charname, width, box)) - for charname, (charnum, width, box) in self._chars.items() - ] - - def myKey(a): - """Custom key function to make sure unencoded chars (-1) - end up at the end of the list after sorting.""" - if a[0] == -1: - a = (0xFFFF,) + a[1:] # 0xffff is an arbitrary large number - return a - - items.sort(key=myKey) - - for charnum, (charname, width, (l, b, r, t)) in items: - lines.append( - "C %d ; WX %d ; N %s ; B %d %d %d %d ;" - % (charnum, width, charname, l, b, r, t) - ) - lines.append("EndCharMetrics") - - # write kerning info - lines.append("StartKernData") - lines.append("StartKernPairs " + repr(len(self._kerning))) - items = sorted(self._kerning.items()) - for (leftchar, rightchar), value in items: - lines.append("KPX %s %s %d" % (leftchar, rightchar, value)) - lines.append("EndKernPairs") - lines.append("EndKernData") - - if self._composites: - composites = sorted(self._composites.items()) - lines.append("StartComposites %s" % len(self._composites)) - for charname, components in composites: - line = "CC %s %s ;" % (charname, len(components)) - for basechar, xoffset, yoffset in components: - line = line + " PCC %s %s %s ;" % (basechar, xoffset, yoffset) - lines.append(line) - lines.append("EndComposites") - - lines.append("EndFontMetrics") - - writelines(path, lines, sep) - - def has_kernpair(self, pair): - """Returns `True` if the given glyph pair (specified as a tuple) exists - in the kerning dictionary.""" - return pair in self._kerning - - def kernpairs(self): - """Returns a list of all kern pairs in the kerning dictionary.""" - return list(self._kerning.keys()) - - def has_char(self, char): - """Returns `True` if the given glyph exists in the font.""" - return char in self._chars - - def chars(self): - """Returns a list of all glyph names in the font.""" - return list(self._chars.keys()) - - def comments(self): - """Returns all comments from the file.""" - return self._comments - - def addComment(self, comment): - """Adds a new comment to the file.""" - self._comments.append(comment) - - def addComposite(self, glyphName, components): - """Specifies that the glyph `glyphName` is made up of the given components. - The components list should be of the following form:: - - [ - (glyphname, xOffset, yOffset), - ... - ] - - """ - self._composites[glyphName] = components - - def __getattr__(self, attr): - if attr in self._attrs: - return self._attrs[attr] - else: - raise AttributeError(attr) - - def __setattr__(self, attr, value): - # all attrs *not* starting with "_" are consider to be AFM keywords - if attr[:1] == "_": - self.__dict__[attr] = value - else: - self._attrs[attr] = value - - def __delattr__(self, attr): - # all attrs *not* starting with "_" are consider to be AFM keywords - if attr[:1] == "_": - try: - del self.__dict__[attr] - except KeyError: - raise AttributeError(attr) - else: - try: - del self._attrs[attr] - except KeyError: - raise AttributeError(attr) - - def __getitem__(self, key): - if isinstance(key, tuple): - # key is a tuple, return the kernpair - return self._kerning[key] - else: - # return the metrics instead - return self._chars[key] - - def __setitem__(self, key, value): - if isinstance(key, tuple): - # key is a tuple, set kernpair - self._kerning[key] = value - else: - # set char metrics - self._chars[key] = value - - def __delitem__(self, key): - if isinstance(key, tuple): - # key is a tuple, del kernpair - del self._kerning[key] - else: - # del char metrics - del self._chars[key] - - def __repr__(self): - if hasattr(self, "FullName"): - return "" % self.FullName - else: - return "" % id(self) - - -def readlines(path): - with open(path, "r", encoding="ascii") as f: - data = f.read() - return data.splitlines() - - -def writelines(path, lines, sep="\r"): - with open(path, "w", encoding="ascii", newline=sep) as f: - f.write("\n".join(lines) + "\n") - - -if __name__ == "__main__": - import EasyDialogs - - path = EasyDialogs.AskFileForOpen() - if path: - afm = AFM(path) - char = "A" - if afm.has_char(char): - print(afm[char]) # print charnum, width and boundingbox - pair = ("A", "V") - if afm.has_kernpair(pair): - print(afm[pair]) # print kerning value for pair - print(afm.Version) # various other afm entries have become attributes - print(afm.Weight) - # afm.comments() returns a list of all Comment lines found in the AFM - print(afm.comments()) - # print afm.chars() - # print afm.kernpairs() - print(afm) - afm.write(path + ".muck") diff --git a/.venv/Lib/site-packages/fontTools/agl.py b/.venv/Lib/site-packages/fontTools/agl.py deleted file mode 100644 index d699462..0000000 --- a/.venv/Lib/site-packages/fontTools/agl.py +++ /dev/null @@ -1,5233 +0,0 @@ -# -*- coding: utf-8 -*- -# The tables below are taken from -# https://github.com/adobe-type-tools/agl-aglfn/raw/4036a9ca80a62f64f9de4f7321a9a045ad0ecfd6/glyphlist.txt -# and -# https://github.com/adobe-type-tools/agl-aglfn/raw/4036a9ca80a62f64f9de4f7321a9a045ad0ecfd6/aglfn.txt -""" -Interface to the Adobe Glyph List - -This module exists to convert glyph names from the Adobe Glyph List -to their Unicode equivalents. Example usage: - - >>> from fontTools.agl import toUnicode - >>> toUnicode("nahiragana") - 'な' - -It also contains two dictionaries, ``UV2AGL`` and ``AGL2UV``, which map from -Unicode codepoints to AGL names and vice versa: - - >>> import fontTools - >>> fontTools.agl.UV2AGL[ord("?")] - 'question' - >>> fontTools.agl.AGL2UV["wcircumflex"] - 373 - -This is used by fontTools when it has to construct glyph names for a font which -doesn't include any (e.g. format 3.0 post tables). -""" - -from fontTools.misc.textTools import tostr -import re - - -_aglText = """\ -# ----------------------------------------------------------- -# Copyright 2002-2019 Adobe (http://www.adobe.com/). -# -# Redistribution and use in source and binary forms, with or -# without modification, are permitted provided that the -# following conditions are met: -# -# Redistributions of source code must retain the above -# copyright notice, this list of conditions and the following -# disclaimer. -# -# Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following -# disclaimer in the documentation and/or other materials -# provided with the distribution. -# -# Neither the name of Adobe nor the names of its contributors -# may be used to endorse or promote products derived from this -# software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# ----------------------------------------------------------- -# Name: Adobe Glyph List -# Table version: 2.0 -# Date: September 20, 2002 -# URL: https://github.com/adobe-type-tools/agl-aglfn -# -# Format: two semicolon-delimited fields: -# (1) glyph name--upper/lowercase letters and digits -# (2) Unicode scalar value--four uppercase hexadecimal digits -# -A;0041 -AE;00C6 -AEacute;01FC -AEmacron;01E2 -AEsmall;F7E6 -Aacute;00C1 -Aacutesmall;F7E1 -Abreve;0102 -Abreveacute;1EAE -Abrevecyrillic;04D0 -Abrevedotbelow;1EB6 -Abrevegrave;1EB0 -Abrevehookabove;1EB2 -Abrevetilde;1EB4 -Acaron;01CD -Acircle;24B6 -Acircumflex;00C2 -Acircumflexacute;1EA4 -Acircumflexdotbelow;1EAC -Acircumflexgrave;1EA6 -Acircumflexhookabove;1EA8 -Acircumflexsmall;F7E2 -Acircumflextilde;1EAA -Acute;F6C9 -Acutesmall;F7B4 -Acyrillic;0410 -Adblgrave;0200 -Adieresis;00C4 -Adieresiscyrillic;04D2 -Adieresismacron;01DE -Adieresissmall;F7E4 -Adotbelow;1EA0 -Adotmacron;01E0 -Agrave;00C0 -Agravesmall;F7E0 -Ahookabove;1EA2 -Aiecyrillic;04D4 -Ainvertedbreve;0202 -Alpha;0391 -Alphatonos;0386 -Amacron;0100 -Amonospace;FF21 -Aogonek;0104 -Aring;00C5 -Aringacute;01FA -Aringbelow;1E00 -Aringsmall;F7E5 -Asmall;F761 -Atilde;00C3 -Atildesmall;F7E3 -Aybarmenian;0531 -B;0042 -Bcircle;24B7 -Bdotaccent;1E02 -Bdotbelow;1E04 -Becyrillic;0411 -Benarmenian;0532 -Beta;0392 -Bhook;0181 -Blinebelow;1E06 -Bmonospace;FF22 -Brevesmall;F6F4 -Bsmall;F762 -Btopbar;0182 -C;0043 -Caarmenian;053E -Cacute;0106 -Caron;F6CA -Caronsmall;F6F5 -Ccaron;010C -Ccedilla;00C7 -Ccedillaacute;1E08 -Ccedillasmall;F7E7 -Ccircle;24B8 -Ccircumflex;0108 -Cdot;010A -Cdotaccent;010A -Cedillasmall;F7B8 -Chaarmenian;0549 -Cheabkhasiancyrillic;04BC -Checyrillic;0427 -Chedescenderabkhasiancyrillic;04BE -Chedescendercyrillic;04B6 -Chedieresiscyrillic;04F4 -Cheharmenian;0543 -Chekhakassiancyrillic;04CB -Cheverticalstrokecyrillic;04B8 -Chi;03A7 -Chook;0187 -Circumflexsmall;F6F6 -Cmonospace;FF23 -Coarmenian;0551 -Csmall;F763 -D;0044 -DZ;01F1 -DZcaron;01C4 -Daarmenian;0534 -Dafrican;0189 -Dcaron;010E -Dcedilla;1E10 -Dcircle;24B9 -Dcircumflexbelow;1E12 -Dcroat;0110 -Ddotaccent;1E0A -Ddotbelow;1E0C -Decyrillic;0414 -Deicoptic;03EE -Delta;2206 -Deltagreek;0394 -Dhook;018A -Dieresis;F6CB -DieresisAcute;F6CC -DieresisGrave;F6CD -Dieresissmall;F7A8 -Digammagreek;03DC -Djecyrillic;0402 -Dlinebelow;1E0E -Dmonospace;FF24 -Dotaccentsmall;F6F7 -Dslash;0110 -Dsmall;F764 -Dtopbar;018B -Dz;01F2 -Dzcaron;01C5 -Dzeabkhasiancyrillic;04E0 -Dzecyrillic;0405 -Dzhecyrillic;040F -E;0045 -Eacute;00C9 -Eacutesmall;F7E9 -Ebreve;0114 -Ecaron;011A -Ecedillabreve;1E1C -Echarmenian;0535 -Ecircle;24BA -Ecircumflex;00CA -Ecircumflexacute;1EBE -Ecircumflexbelow;1E18 -Ecircumflexdotbelow;1EC6 -Ecircumflexgrave;1EC0 -Ecircumflexhookabove;1EC2 -Ecircumflexsmall;F7EA -Ecircumflextilde;1EC4 -Ecyrillic;0404 -Edblgrave;0204 -Edieresis;00CB -Edieresissmall;F7EB -Edot;0116 -Edotaccent;0116 -Edotbelow;1EB8 -Efcyrillic;0424 -Egrave;00C8 -Egravesmall;F7E8 -Eharmenian;0537 -Ehookabove;1EBA -Eightroman;2167 -Einvertedbreve;0206 -Eiotifiedcyrillic;0464 -Elcyrillic;041B -Elevenroman;216A -Emacron;0112 -Emacronacute;1E16 -Emacrongrave;1E14 -Emcyrillic;041C -Emonospace;FF25 -Encyrillic;041D -Endescendercyrillic;04A2 -Eng;014A -Enghecyrillic;04A4 -Enhookcyrillic;04C7 -Eogonek;0118 -Eopen;0190 -Epsilon;0395 -Epsilontonos;0388 -Ercyrillic;0420 -Ereversed;018E -Ereversedcyrillic;042D -Escyrillic;0421 -Esdescendercyrillic;04AA -Esh;01A9 -Esmall;F765 -Eta;0397 -Etarmenian;0538 -Etatonos;0389 -Eth;00D0 -Ethsmall;F7F0 -Etilde;1EBC -Etildebelow;1E1A -Euro;20AC -Ezh;01B7 -Ezhcaron;01EE -Ezhreversed;01B8 -F;0046 -Fcircle;24BB -Fdotaccent;1E1E -Feharmenian;0556 -Feicoptic;03E4 -Fhook;0191 -Fitacyrillic;0472 -Fiveroman;2164 -Fmonospace;FF26 -Fourroman;2163 -Fsmall;F766 -G;0047 -GBsquare;3387 -Gacute;01F4 -Gamma;0393 -Gammaafrican;0194 -Gangiacoptic;03EA -Gbreve;011E -Gcaron;01E6 -Gcedilla;0122 -Gcircle;24BC -Gcircumflex;011C -Gcommaaccent;0122 -Gdot;0120 -Gdotaccent;0120 -Gecyrillic;0413 -Ghadarmenian;0542 -Ghemiddlehookcyrillic;0494 -Ghestrokecyrillic;0492 -Gheupturncyrillic;0490 -Ghook;0193 -Gimarmenian;0533 -Gjecyrillic;0403 -Gmacron;1E20 -Gmonospace;FF27 -Grave;F6CE -Gravesmall;F760 -Gsmall;F767 -Gsmallhook;029B -Gstroke;01E4 -H;0048 -H18533;25CF -H18543;25AA -H18551;25AB -H22073;25A1 -HPsquare;33CB -Haabkhasiancyrillic;04A8 -Hadescendercyrillic;04B2 -Hardsigncyrillic;042A -Hbar;0126 -Hbrevebelow;1E2A -Hcedilla;1E28 -Hcircle;24BD -Hcircumflex;0124 -Hdieresis;1E26 -Hdotaccent;1E22 -Hdotbelow;1E24 -Hmonospace;FF28 -Hoarmenian;0540 -Horicoptic;03E8 -Hsmall;F768 -Hungarumlaut;F6CF -Hungarumlautsmall;F6F8 -Hzsquare;3390 -I;0049 -IAcyrillic;042F -IJ;0132 -IUcyrillic;042E -Iacute;00CD -Iacutesmall;F7ED -Ibreve;012C -Icaron;01CF -Icircle;24BE -Icircumflex;00CE -Icircumflexsmall;F7EE -Icyrillic;0406 -Idblgrave;0208 -Idieresis;00CF -Idieresisacute;1E2E -Idieresiscyrillic;04E4 -Idieresissmall;F7EF -Idot;0130 -Idotaccent;0130 -Idotbelow;1ECA -Iebrevecyrillic;04D6 -Iecyrillic;0415 -Ifraktur;2111 -Igrave;00CC -Igravesmall;F7EC -Ihookabove;1EC8 -Iicyrillic;0418 -Iinvertedbreve;020A -Iishortcyrillic;0419 -Imacron;012A -Imacroncyrillic;04E2 -Imonospace;FF29 -Iniarmenian;053B -Iocyrillic;0401 -Iogonek;012E -Iota;0399 -Iotaafrican;0196 -Iotadieresis;03AA -Iotatonos;038A -Ismall;F769 -Istroke;0197 -Itilde;0128 -Itildebelow;1E2C -Izhitsacyrillic;0474 -Izhitsadblgravecyrillic;0476 -J;004A -Jaarmenian;0541 -Jcircle;24BF -Jcircumflex;0134 -Jecyrillic;0408 -Jheharmenian;054B -Jmonospace;FF2A -Jsmall;F76A -K;004B -KBsquare;3385 -KKsquare;33CD -Kabashkircyrillic;04A0 -Kacute;1E30 -Kacyrillic;041A -Kadescendercyrillic;049A -Kahookcyrillic;04C3 -Kappa;039A -Kastrokecyrillic;049E -Kaverticalstrokecyrillic;049C -Kcaron;01E8 -Kcedilla;0136 -Kcircle;24C0 -Kcommaaccent;0136 -Kdotbelow;1E32 -Keharmenian;0554 -Kenarmenian;053F -Khacyrillic;0425 -Kheicoptic;03E6 -Khook;0198 -Kjecyrillic;040C -Klinebelow;1E34 -Kmonospace;FF2B -Koppacyrillic;0480 -Koppagreek;03DE -Ksicyrillic;046E -Ksmall;F76B -L;004C -LJ;01C7 -LL;F6BF -Lacute;0139 -Lambda;039B -Lcaron;013D -Lcedilla;013B -Lcircle;24C1 -Lcircumflexbelow;1E3C -Lcommaaccent;013B -Ldot;013F -Ldotaccent;013F -Ldotbelow;1E36 -Ldotbelowmacron;1E38 -Liwnarmenian;053C -Lj;01C8 -Ljecyrillic;0409 -Llinebelow;1E3A -Lmonospace;FF2C -Lslash;0141 -Lslashsmall;F6F9 -Lsmall;F76C -M;004D -MBsquare;3386 -Macron;F6D0 -Macronsmall;F7AF -Macute;1E3E -Mcircle;24C2 -Mdotaccent;1E40 -Mdotbelow;1E42 -Menarmenian;0544 -Mmonospace;FF2D -Msmall;F76D -Mturned;019C -Mu;039C -N;004E -NJ;01CA -Nacute;0143 -Ncaron;0147 -Ncedilla;0145 -Ncircle;24C3 -Ncircumflexbelow;1E4A -Ncommaaccent;0145 -Ndotaccent;1E44 -Ndotbelow;1E46 -Nhookleft;019D -Nineroman;2168 -Nj;01CB -Njecyrillic;040A -Nlinebelow;1E48 -Nmonospace;FF2E -Nowarmenian;0546 -Nsmall;F76E -Ntilde;00D1 -Ntildesmall;F7F1 -Nu;039D -O;004F -OE;0152 -OEsmall;F6FA -Oacute;00D3 -Oacutesmall;F7F3 -Obarredcyrillic;04E8 -Obarreddieresiscyrillic;04EA -Obreve;014E -Ocaron;01D1 -Ocenteredtilde;019F -Ocircle;24C4 -Ocircumflex;00D4 -Ocircumflexacute;1ED0 -Ocircumflexdotbelow;1ED8 -Ocircumflexgrave;1ED2 -Ocircumflexhookabove;1ED4 -Ocircumflexsmall;F7F4 -Ocircumflextilde;1ED6 -Ocyrillic;041E -Odblacute;0150 -Odblgrave;020C -Odieresis;00D6 -Odieresiscyrillic;04E6 -Odieresissmall;F7F6 -Odotbelow;1ECC -Ogoneksmall;F6FB -Ograve;00D2 -Ogravesmall;F7F2 -Oharmenian;0555 -Ohm;2126 -Ohookabove;1ECE -Ohorn;01A0 -Ohornacute;1EDA -Ohorndotbelow;1EE2 -Ohorngrave;1EDC -Ohornhookabove;1EDE -Ohorntilde;1EE0 -Ohungarumlaut;0150 -Oi;01A2 -Oinvertedbreve;020E -Omacron;014C -Omacronacute;1E52 -Omacrongrave;1E50 -Omega;2126 -Omegacyrillic;0460 -Omegagreek;03A9 -Omegaroundcyrillic;047A -Omegatitlocyrillic;047C -Omegatonos;038F -Omicron;039F -Omicrontonos;038C -Omonospace;FF2F -Oneroman;2160 -Oogonek;01EA -Oogonekmacron;01EC -Oopen;0186 -Oslash;00D8 -Oslashacute;01FE -Oslashsmall;F7F8 -Osmall;F76F -Ostrokeacute;01FE -Otcyrillic;047E -Otilde;00D5 -Otildeacute;1E4C -Otildedieresis;1E4E -Otildesmall;F7F5 -P;0050 -Pacute;1E54 -Pcircle;24C5 -Pdotaccent;1E56 -Pecyrillic;041F -Peharmenian;054A -Pemiddlehookcyrillic;04A6 -Phi;03A6 -Phook;01A4 -Pi;03A0 -Piwrarmenian;0553 -Pmonospace;FF30 -Psi;03A8 -Psicyrillic;0470 -Psmall;F770 -Q;0051 -Qcircle;24C6 -Qmonospace;FF31 -Qsmall;F771 -R;0052 -Raarmenian;054C -Racute;0154 -Rcaron;0158 -Rcedilla;0156 -Rcircle;24C7 -Rcommaaccent;0156 -Rdblgrave;0210 -Rdotaccent;1E58 -Rdotbelow;1E5A -Rdotbelowmacron;1E5C -Reharmenian;0550 -Rfraktur;211C -Rho;03A1 -Ringsmall;F6FC -Rinvertedbreve;0212 -Rlinebelow;1E5E -Rmonospace;FF32 -Rsmall;F772 -Rsmallinverted;0281 -Rsmallinvertedsuperior;02B6 -S;0053 -SF010000;250C -SF020000;2514 -SF030000;2510 -SF040000;2518 -SF050000;253C -SF060000;252C -SF070000;2534 -SF080000;251C -SF090000;2524 -SF100000;2500 -SF110000;2502 -SF190000;2561 -SF200000;2562 -SF210000;2556 -SF220000;2555 -SF230000;2563 -SF240000;2551 -SF250000;2557 -SF260000;255D -SF270000;255C -SF280000;255B -SF360000;255E -SF370000;255F -SF380000;255A -SF390000;2554 -SF400000;2569 -SF410000;2566 -SF420000;2560 -SF430000;2550 -SF440000;256C -SF450000;2567 -SF460000;2568 -SF470000;2564 -SF480000;2565 -SF490000;2559 -SF500000;2558 -SF510000;2552 -SF520000;2553 -SF530000;256B -SF540000;256A -Sacute;015A -Sacutedotaccent;1E64 -Sampigreek;03E0 -Scaron;0160 -Scarondotaccent;1E66 -Scaronsmall;F6FD -Scedilla;015E -Schwa;018F -Schwacyrillic;04D8 -Schwadieresiscyrillic;04DA -Scircle;24C8 -Scircumflex;015C -Scommaaccent;0218 -Sdotaccent;1E60 -Sdotbelow;1E62 -Sdotbelowdotaccent;1E68 -Seharmenian;054D -Sevenroman;2166 -Shaarmenian;0547 -Shacyrillic;0428 -Shchacyrillic;0429 -Sheicoptic;03E2 -Shhacyrillic;04BA -Shimacoptic;03EC -Sigma;03A3 -Sixroman;2165 -Smonospace;FF33 -Softsigncyrillic;042C -Ssmall;F773 -Stigmagreek;03DA -T;0054 -Tau;03A4 -Tbar;0166 -Tcaron;0164 -Tcedilla;0162 -Tcircle;24C9 -Tcircumflexbelow;1E70 -Tcommaaccent;0162 -Tdotaccent;1E6A -Tdotbelow;1E6C -Tecyrillic;0422 -Tedescendercyrillic;04AC -Tenroman;2169 -Tetsecyrillic;04B4 -Theta;0398 -Thook;01AC -Thorn;00DE -Thornsmall;F7FE -Threeroman;2162 -Tildesmall;F6FE -Tiwnarmenian;054F -Tlinebelow;1E6E -Tmonospace;FF34 -Toarmenian;0539 -Tonefive;01BC -Tonesix;0184 -Tonetwo;01A7 -Tretroflexhook;01AE -Tsecyrillic;0426 -Tshecyrillic;040B -Tsmall;F774 -Twelveroman;216B -Tworoman;2161 -U;0055 -Uacute;00DA -Uacutesmall;F7FA -Ubreve;016C -Ucaron;01D3 -Ucircle;24CA -Ucircumflex;00DB -Ucircumflexbelow;1E76 -Ucircumflexsmall;F7FB -Ucyrillic;0423 -Udblacute;0170 -Udblgrave;0214 -Udieresis;00DC -Udieresisacute;01D7 -Udieresisbelow;1E72 -Udieresiscaron;01D9 -Udieresiscyrillic;04F0 -Udieresisgrave;01DB -Udieresismacron;01D5 -Udieresissmall;F7FC -Udotbelow;1EE4 -Ugrave;00D9 -Ugravesmall;F7F9 -Uhookabove;1EE6 -Uhorn;01AF -Uhornacute;1EE8 -Uhorndotbelow;1EF0 -Uhorngrave;1EEA -Uhornhookabove;1EEC -Uhorntilde;1EEE -Uhungarumlaut;0170 -Uhungarumlautcyrillic;04F2 -Uinvertedbreve;0216 -Ukcyrillic;0478 -Umacron;016A -Umacroncyrillic;04EE -Umacrondieresis;1E7A -Umonospace;FF35 -Uogonek;0172 -Upsilon;03A5 -Upsilon1;03D2 -Upsilonacutehooksymbolgreek;03D3 -Upsilonafrican;01B1 -Upsilondieresis;03AB -Upsilondieresishooksymbolgreek;03D4 -Upsilonhooksymbol;03D2 -Upsilontonos;038E -Uring;016E -Ushortcyrillic;040E -Usmall;F775 -Ustraightcyrillic;04AE -Ustraightstrokecyrillic;04B0 -Utilde;0168 -Utildeacute;1E78 -Utildebelow;1E74 -V;0056 -Vcircle;24CB -Vdotbelow;1E7E -Vecyrillic;0412 -Vewarmenian;054E -Vhook;01B2 -Vmonospace;FF36 -Voarmenian;0548 -Vsmall;F776 -Vtilde;1E7C -W;0057 -Wacute;1E82 -Wcircle;24CC -Wcircumflex;0174 -Wdieresis;1E84 -Wdotaccent;1E86 -Wdotbelow;1E88 -Wgrave;1E80 -Wmonospace;FF37 -Wsmall;F777 -X;0058 -Xcircle;24CD -Xdieresis;1E8C -Xdotaccent;1E8A -Xeharmenian;053D -Xi;039E -Xmonospace;FF38 -Xsmall;F778 -Y;0059 -Yacute;00DD -Yacutesmall;F7FD -Yatcyrillic;0462 -Ycircle;24CE -Ycircumflex;0176 -Ydieresis;0178 -Ydieresissmall;F7FF -Ydotaccent;1E8E -Ydotbelow;1EF4 -Yericyrillic;042B -Yerudieresiscyrillic;04F8 -Ygrave;1EF2 -Yhook;01B3 -Yhookabove;1EF6 -Yiarmenian;0545 -Yicyrillic;0407 -Yiwnarmenian;0552 -Ymonospace;FF39 -Ysmall;F779 -Ytilde;1EF8 -Yusbigcyrillic;046A -Yusbigiotifiedcyrillic;046C -Yuslittlecyrillic;0466 -Yuslittleiotifiedcyrillic;0468 -Z;005A -Zaarmenian;0536 -Zacute;0179 -Zcaron;017D -Zcaronsmall;F6FF -Zcircle;24CF -Zcircumflex;1E90 -Zdot;017B -Zdotaccent;017B -Zdotbelow;1E92 -Zecyrillic;0417 -Zedescendercyrillic;0498 -Zedieresiscyrillic;04DE -Zeta;0396 -Zhearmenian;053A -Zhebrevecyrillic;04C1 -Zhecyrillic;0416 -Zhedescendercyrillic;0496 -Zhedieresiscyrillic;04DC -Zlinebelow;1E94 -Zmonospace;FF3A -Zsmall;F77A -Zstroke;01B5 -a;0061 -aabengali;0986 -aacute;00E1 -aadeva;0906 -aagujarati;0A86 -aagurmukhi;0A06 -aamatragurmukhi;0A3E -aarusquare;3303 -aavowelsignbengali;09BE -aavowelsigndeva;093E -aavowelsigngujarati;0ABE -abbreviationmarkarmenian;055F -abbreviationsigndeva;0970 -abengali;0985 -abopomofo;311A -abreve;0103 -abreveacute;1EAF -abrevecyrillic;04D1 -abrevedotbelow;1EB7 -abrevegrave;1EB1 -abrevehookabove;1EB3 -abrevetilde;1EB5 -acaron;01CE -acircle;24D0 -acircumflex;00E2 -acircumflexacute;1EA5 -acircumflexdotbelow;1EAD -acircumflexgrave;1EA7 -acircumflexhookabove;1EA9 -acircumflextilde;1EAB -acute;00B4 -acutebelowcmb;0317 -acutecmb;0301 -acutecomb;0301 -acutedeva;0954 -acutelowmod;02CF -acutetonecmb;0341 -acyrillic;0430 -adblgrave;0201 -addakgurmukhi;0A71 -adeva;0905 -adieresis;00E4 -adieresiscyrillic;04D3 -adieresismacron;01DF -adotbelow;1EA1 -adotmacron;01E1 -ae;00E6 -aeacute;01FD -aekorean;3150 -aemacron;01E3 -afii00208;2015 -afii08941;20A4 -afii10017;0410 -afii10018;0411 -afii10019;0412 -afii10020;0413 -afii10021;0414 -afii10022;0415 -afii10023;0401 -afii10024;0416 -afii10025;0417 -afii10026;0418 -afii10027;0419 -afii10028;041A -afii10029;041B -afii10030;041C -afii10031;041D -afii10032;041E -afii10033;041F -afii10034;0420 -afii10035;0421 -afii10036;0422 -afii10037;0423 -afii10038;0424 -afii10039;0425 -afii10040;0426 -afii10041;0427 -afii10042;0428 -afii10043;0429 -afii10044;042A -afii10045;042B -afii10046;042C -afii10047;042D -afii10048;042E -afii10049;042F -afii10050;0490 -afii10051;0402 -afii10052;0403 -afii10053;0404 -afii10054;0405 -afii10055;0406 -afii10056;0407 -afii10057;0408 -afii10058;0409 -afii10059;040A -afii10060;040B -afii10061;040C -afii10062;040E -afii10063;F6C4 -afii10064;F6C5 -afii10065;0430 -afii10066;0431 -afii10067;0432 -afii10068;0433 -afii10069;0434 -afii10070;0435 -afii10071;0451 -afii10072;0436 -afii10073;0437 -afii10074;0438 -afii10075;0439 -afii10076;043A -afii10077;043B -afii10078;043C -afii10079;043D -afii10080;043E -afii10081;043F -afii10082;0440 -afii10083;0441 -afii10084;0442 -afii10085;0443 -afii10086;0444 -afii10087;0445 -afii10088;0446 -afii10089;0447 -afii10090;0448 -afii10091;0449 -afii10092;044A -afii10093;044B -afii10094;044C -afii10095;044D -afii10096;044E -afii10097;044F -afii10098;0491 -afii10099;0452 -afii10100;0453 -afii10101;0454 -afii10102;0455 -afii10103;0456 -afii10104;0457 -afii10105;0458 -afii10106;0459 -afii10107;045A -afii10108;045B -afii10109;045C -afii10110;045E -afii10145;040F -afii10146;0462 -afii10147;0472 -afii10148;0474 -afii10192;F6C6 -afii10193;045F -afii10194;0463 -afii10195;0473 -afii10196;0475 -afii10831;F6C7 -afii10832;F6C8 -afii10846;04D9 -afii299;200E -afii300;200F -afii301;200D -afii57381;066A -afii57388;060C -afii57392;0660 -afii57393;0661 -afii57394;0662 -afii57395;0663 -afii57396;0664 -afii57397;0665 -afii57398;0666 -afii57399;0667 -afii57400;0668 -afii57401;0669 -afii57403;061B -afii57407;061F -afii57409;0621 -afii57410;0622 -afii57411;0623 -afii57412;0624 -afii57413;0625 -afii57414;0626 -afii57415;0627 -afii57416;0628 -afii57417;0629 -afii57418;062A -afii57419;062B -afii57420;062C -afii57421;062D -afii57422;062E -afii57423;062F -afii57424;0630 -afii57425;0631 -afii57426;0632 -afii57427;0633 -afii57428;0634 -afii57429;0635 -afii57430;0636 -afii57431;0637 -afii57432;0638 -afii57433;0639 -afii57434;063A -afii57440;0640 -afii57441;0641 -afii57442;0642 -afii57443;0643 -afii57444;0644 -afii57445;0645 -afii57446;0646 -afii57448;0648 -afii57449;0649 -afii57450;064A -afii57451;064B -afii57452;064C -afii57453;064D -afii57454;064E -afii57455;064F -afii57456;0650 -afii57457;0651 -afii57458;0652 -afii57470;0647 -afii57505;06A4 -afii57506;067E -afii57507;0686 -afii57508;0698 -afii57509;06AF -afii57511;0679 -afii57512;0688 -afii57513;0691 -afii57514;06BA -afii57519;06D2 -afii57534;06D5 -afii57636;20AA -afii57645;05BE -afii57658;05C3 -afii57664;05D0 -afii57665;05D1 -afii57666;05D2 -afii57667;05D3 -afii57668;05D4 -afii57669;05D5 -afii57670;05D6 -afii57671;05D7 -afii57672;05D8 -afii57673;05D9 -afii57674;05DA -afii57675;05DB -afii57676;05DC -afii57677;05DD -afii57678;05DE -afii57679;05DF -afii57680;05E0 -afii57681;05E1 -afii57682;05E2 -afii57683;05E3 -afii57684;05E4 -afii57685;05E5 -afii57686;05E6 -afii57687;05E7 -afii57688;05E8 -afii57689;05E9 -afii57690;05EA -afii57694;FB2A -afii57695;FB2B -afii57700;FB4B -afii57705;FB1F -afii57716;05F0 -afii57717;05F1 -afii57718;05F2 -afii57723;FB35 -afii57793;05B4 -afii57794;05B5 -afii57795;05B6 -afii57796;05BB -afii57797;05B8 -afii57798;05B7 -afii57799;05B0 -afii57800;05B2 -afii57801;05B1 -afii57802;05B3 -afii57803;05C2 -afii57804;05C1 -afii57806;05B9 -afii57807;05BC -afii57839;05BD -afii57841;05BF -afii57842;05C0 -afii57929;02BC -afii61248;2105 -afii61289;2113 -afii61352;2116 -afii61573;202C -afii61574;202D -afii61575;202E -afii61664;200C -afii63167;066D -afii64937;02BD -agrave;00E0 -agujarati;0A85 -agurmukhi;0A05 -ahiragana;3042 -ahookabove;1EA3 -aibengali;0990 -aibopomofo;311E -aideva;0910 -aiecyrillic;04D5 -aigujarati;0A90 -aigurmukhi;0A10 -aimatragurmukhi;0A48 -ainarabic;0639 -ainfinalarabic;FECA -aininitialarabic;FECB -ainmedialarabic;FECC -ainvertedbreve;0203 -aivowelsignbengali;09C8 -aivowelsigndeva;0948 -aivowelsigngujarati;0AC8 -akatakana;30A2 -akatakanahalfwidth;FF71 -akorean;314F -alef;05D0 -alefarabic;0627 -alefdageshhebrew;FB30 -aleffinalarabic;FE8E -alefhamzaabovearabic;0623 -alefhamzaabovefinalarabic;FE84 -alefhamzabelowarabic;0625 -alefhamzabelowfinalarabic;FE88 -alefhebrew;05D0 -aleflamedhebrew;FB4F -alefmaddaabovearabic;0622 -alefmaddaabovefinalarabic;FE82 -alefmaksuraarabic;0649 -alefmaksurafinalarabic;FEF0 -alefmaksurainitialarabic;FEF3 -alefmaksuramedialarabic;FEF4 -alefpatahhebrew;FB2E -alefqamatshebrew;FB2F -aleph;2135 -allequal;224C -alpha;03B1 -alphatonos;03AC -amacron;0101 -amonospace;FF41 -ampersand;0026 -ampersandmonospace;FF06 -ampersandsmall;F726 -amsquare;33C2 -anbopomofo;3122 -angbopomofo;3124 -angkhankhuthai;0E5A -angle;2220 -anglebracketleft;3008 -anglebracketleftvertical;FE3F -anglebracketright;3009 -anglebracketrightvertical;FE40 -angleleft;2329 -angleright;232A -angstrom;212B -anoteleia;0387 -anudattadeva;0952 -anusvarabengali;0982 -anusvaradeva;0902 -anusvaragujarati;0A82 -aogonek;0105 -apaatosquare;3300 -aparen;249C -apostrophearmenian;055A -apostrophemod;02BC -apple;F8FF -approaches;2250 -approxequal;2248 -approxequalorimage;2252 -approximatelyequal;2245 -araeaekorean;318E -araeakorean;318D -arc;2312 -arighthalfring;1E9A -aring;00E5 -aringacute;01FB -aringbelow;1E01 -arrowboth;2194 -arrowdashdown;21E3 -arrowdashleft;21E0 -arrowdashright;21E2 -arrowdashup;21E1 -arrowdblboth;21D4 -arrowdbldown;21D3 -arrowdblleft;21D0 -arrowdblright;21D2 -arrowdblup;21D1 -arrowdown;2193 -arrowdownleft;2199 -arrowdownright;2198 -arrowdownwhite;21E9 -arrowheaddownmod;02C5 -arrowheadleftmod;02C2 -arrowheadrightmod;02C3 -arrowheadupmod;02C4 -arrowhorizex;F8E7 -arrowleft;2190 -arrowleftdbl;21D0 -arrowleftdblstroke;21CD -arrowleftoverright;21C6 -arrowleftwhite;21E6 -arrowright;2192 -arrowrightdblstroke;21CF -arrowrightheavy;279E -arrowrightoverleft;21C4 -arrowrightwhite;21E8 -arrowtableft;21E4 -arrowtabright;21E5 -arrowup;2191 -arrowupdn;2195 -arrowupdnbse;21A8 -arrowupdownbase;21A8 -arrowupleft;2196 -arrowupleftofdown;21C5 -arrowupright;2197 -arrowupwhite;21E7 -arrowvertex;F8E6 -asciicircum;005E -asciicircummonospace;FF3E -asciitilde;007E -asciitildemonospace;FF5E -ascript;0251 -ascriptturned;0252 -asmallhiragana;3041 -asmallkatakana;30A1 -asmallkatakanahalfwidth;FF67 -asterisk;002A -asteriskaltonearabic;066D -asteriskarabic;066D -asteriskmath;2217 -asteriskmonospace;FF0A -asterisksmall;FE61 -asterism;2042 -asuperior;F6E9 -asymptoticallyequal;2243 -at;0040 -atilde;00E3 -atmonospace;FF20 -atsmall;FE6B -aturned;0250 -aubengali;0994 -aubopomofo;3120 -audeva;0914 -augujarati;0A94 -augurmukhi;0A14 -aulengthmarkbengali;09D7 -aumatragurmukhi;0A4C -auvowelsignbengali;09CC -auvowelsigndeva;094C -auvowelsigngujarati;0ACC -avagrahadeva;093D -aybarmenian;0561 -ayin;05E2 -ayinaltonehebrew;FB20 -ayinhebrew;05E2 -b;0062 -babengali;09AC -backslash;005C -backslashmonospace;FF3C -badeva;092C -bagujarati;0AAC -bagurmukhi;0A2C -bahiragana;3070 -bahtthai;0E3F -bakatakana;30D0 -bar;007C -barmonospace;FF5C -bbopomofo;3105 -bcircle;24D1 -bdotaccent;1E03 -bdotbelow;1E05 -beamedsixteenthnotes;266C -because;2235 -becyrillic;0431 -beharabic;0628 -behfinalarabic;FE90 -behinitialarabic;FE91 -behiragana;3079 -behmedialarabic;FE92 -behmeeminitialarabic;FC9F -behmeemisolatedarabic;FC08 -behnoonfinalarabic;FC6D -bekatakana;30D9 -benarmenian;0562 -bet;05D1 -beta;03B2 -betasymbolgreek;03D0 -betdagesh;FB31 -betdageshhebrew;FB31 -bethebrew;05D1 -betrafehebrew;FB4C -bhabengali;09AD -bhadeva;092D -bhagujarati;0AAD -bhagurmukhi;0A2D -bhook;0253 -bihiragana;3073 -bikatakana;30D3 -bilabialclick;0298 -bindigurmukhi;0A02 -birusquare;3331 -blackcircle;25CF -blackdiamond;25C6 -blackdownpointingtriangle;25BC -blackleftpointingpointer;25C4 -blackleftpointingtriangle;25C0 -blacklenticularbracketleft;3010 -blacklenticularbracketleftvertical;FE3B -blacklenticularbracketright;3011 -blacklenticularbracketrightvertical;FE3C -blacklowerlefttriangle;25E3 -blacklowerrighttriangle;25E2 -blackrectangle;25AC -blackrightpointingpointer;25BA -blackrightpointingtriangle;25B6 -blacksmallsquare;25AA -blacksmilingface;263B -blacksquare;25A0 -blackstar;2605 -blackupperlefttriangle;25E4 -blackupperrighttriangle;25E5 -blackuppointingsmalltriangle;25B4 -blackuppointingtriangle;25B2 -blank;2423 -blinebelow;1E07 -block;2588 -bmonospace;FF42 -bobaimaithai;0E1A -bohiragana;307C -bokatakana;30DC -bparen;249D -bqsquare;33C3 -braceex;F8F4 -braceleft;007B -braceleftbt;F8F3 -braceleftmid;F8F2 -braceleftmonospace;FF5B -braceleftsmall;FE5B -bracelefttp;F8F1 -braceleftvertical;FE37 -braceright;007D -bracerightbt;F8FE -bracerightmid;F8FD -bracerightmonospace;FF5D -bracerightsmall;FE5C -bracerighttp;F8FC -bracerightvertical;FE38 -bracketleft;005B -bracketleftbt;F8F0 -bracketleftex;F8EF -bracketleftmonospace;FF3B -bracketlefttp;F8EE -bracketright;005D -bracketrightbt;F8FB -bracketrightex;F8FA -bracketrightmonospace;FF3D -bracketrighttp;F8F9 -breve;02D8 -brevebelowcmb;032E -brevecmb;0306 -breveinvertedbelowcmb;032F -breveinvertedcmb;0311 -breveinverteddoublecmb;0361 -bridgebelowcmb;032A -bridgeinvertedbelowcmb;033A -brokenbar;00A6 -bstroke;0180 -bsuperior;F6EA -btopbar;0183 -buhiragana;3076 -bukatakana;30D6 -bullet;2022 -bulletinverse;25D8 -bulletoperator;2219 -bullseye;25CE -c;0063 -caarmenian;056E -cabengali;099A -cacute;0107 -cadeva;091A -cagujarati;0A9A -cagurmukhi;0A1A -calsquare;3388 -candrabindubengali;0981 -candrabinducmb;0310 -candrabindudeva;0901 -candrabindugujarati;0A81 -capslock;21EA -careof;2105 -caron;02C7 -caronbelowcmb;032C -caroncmb;030C -carriagereturn;21B5 -cbopomofo;3118 -ccaron;010D -ccedilla;00E7 -ccedillaacute;1E09 -ccircle;24D2 -ccircumflex;0109 -ccurl;0255 -cdot;010B -cdotaccent;010B -cdsquare;33C5 -cedilla;00B8 -cedillacmb;0327 -cent;00A2 -centigrade;2103 -centinferior;F6DF -centmonospace;FFE0 -centoldstyle;F7A2 -centsuperior;F6E0 -chaarmenian;0579 -chabengali;099B -chadeva;091B -chagujarati;0A9B -chagurmukhi;0A1B -chbopomofo;3114 -cheabkhasiancyrillic;04BD -checkmark;2713 -checyrillic;0447 -chedescenderabkhasiancyrillic;04BF -chedescendercyrillic;04B7 -chedieresiscyrillic;04F5 -cheharmenian;0573 -chekhakassiancyrillic;04CC -cheverticalstrokecyrillic;04B9 -chi;03C7 -chieuchacirclekorean;3277 -chieuchaparenkorean;3217 -chieuchcirclekorean;3269 -chieuchkorean;314A -chieuchparenkorean;3209 -chochangthai;0E0A -chochanthai;0E08 -chochingthai;0E09 -chochoethai;0E0C -chook;0188 -cieucacirclekorean;3276 -cieucaparenkorean;3216 -cieuccirclekorean;3268 -cieuckorean;3148 -cieucparenkorean;3208 -cieucuparenkorean;321C -circle;25CB -circlemultiply;2297 -circleot;2299 -circleplus;2295 -circlepostalmark;3036 -circlewithlefthalfblack;25D0 -circlewithrighthalfblack;25D1 -circumflex;02C6 -circumflexbelowcmb;032D -circumflexcmb;0302 -clear;2327 -clickalveolar;01C2 -clickdental;01C0 -clicklateral;01C1 -clickretroflex;01C3 -club;2663 -clubsuitblack;2663 -clubsuitwhite;2667 -cmcubedsquare;33A4 -cmonospace;FF43 -cmsquaredsquare;33A0 -coarmenian;0581 -colon;003A -colonmonetary;20A1 -colonmonospace;FF1A -colonsign;20A1 -colonsmall;FE55 -colontriangularhalfmod;02D1 -colontriangularmod;02D0 -comma;002C -commaabovecmb;0313 -commaaboverightcmb;0315 -commaaccent;F6C3 -commaarabic;060C -commaarmenian;055D -commainferior;F6E1 -commamonospace;FF0C -commareversedabovecmb;0314 -commareversedmod;02BD -commasmall;FE50 -commasuperior;F6E2 -commaturnedabovecmb;0312 -commaturnedmod;02BB -compass;263C -congruent;2245 -contourintegral;222E -control;2303 -controlACK;0006 -controlBEL;0007 -controlBS;0008 -controlCAN;0018 -controlCR;000D -controlDC1;0011 -controlDC2;0012 -controlDC3;0013 -controlDC4;0014 -controlDEL;007F -controlDLE;0010 -controlEM;0019 -controlENQ;0005 -controlEOT;0004 -controlESC;001B -controlETB;0017 -controlETX;0003 -controlFF;000C -controlFS;001C -controlGS;001D -controlHT;0009 -controlLF;000A -controlNAK;0015 -controlRS;001E -controlSI;000F -controlSO;000E -controlSOT;0002 -controlSTX;0001 -controlSUB;001A -controlSYN;0016 -controlUS;001F -controlVT;000B -copyright;00A9 -copyrightsans;F8E9 -copyrightserif;F6D9 -cornerbracketleft;300C -cornerbracketlefthalfwidth;FF62 -cornerbracketleftvertical;FE41 -cornerbracketright;300D -cornerbracketrighthalfwidth;FF63 -cornerbracketrightvertical;FE42 -corporationsquare;337F -cosquare;33C7 -coverkgsquare;33C6 -cparen;249E -cruzeiro;20A2 -cstretched;0297 -curlyand;22CF -curlyor;22CE -currency;00A4 -cyrBreve;F6D1 -cyrFlex;F6D2 -cyrbreve;F6D4 -cyrflex;F6D5 -d;0064 -daarmenian;0564 -dabengali;09A6 -dadarabic;0636 -dadeva;0926 -dadfinalarabic;FEBE -dadinitialarabic;FEBF -dadmedialarabic;FEC0 -dagesh;05BC -dageshhebrew;05BC -dagger;2020 -daggerdbl;2021 -dagujarati;0AA6 -dagurmukhi;0A26 -dahiragana;3060 -dakatakana;30C0 -dalarabic;062F -dalet;05D3 -daletdagesh;FB33 -daletdageshhebrew;FB33 -dalethatafpatah;05D3 05B2 -dalethatafpatahhebrew;05D3 05B2 -dalethatafsegol;05D3 05B1 -dalethatafsegolhebrew;05D3 05B1 -dalethebrew;05D3 -dalethiriq;05D3 05B4 -dalethiriqhebrew;05D3 05B4 -daletholam;05D3 05B9 -daletholamhebrew;05D3 05B9 -daletpatah;05D3 05B7 -daletpatahhebrew;05D3 05B7 -daletqamats;05D3 05B8 -daletqamatshebrew;05D3 05B8 -daletqubuts;05D3 05BB -daletqubutshebrew;05D3 05BB -daletsegol;05D3 05B6 -daletsegolhebrew;05D3 05B6 -daletsheva;05D3 05B0 -daletshevahebrew;05D3 05B0 -dalettsere;05D3 05B5 -dalettserehebrew;05D3 05B5 -dalfinalarabic;FEAA -dammaarabic;064F -dammalowarabic;064F -dammatanaltonearabic;064C -dammatanarabic;064C -danda;0964 -dargahebrew;05A7 -dargalefthebrew;05A7 -dasiapneumatacyrilliccmb;0485 -dblGrave;F6D3 -dblanglebracketleft;300A -dblanglebracketleftvertical;FE3D -dblanglebracketright;300B -dblanglebracketrightvertical;FE3E -dblarchinvertedbelowcmb;032B -dblarrowleft;21D4 -dblarrowright;21D2 -dbldanda;0965 -dblgrave;F6D6 -dblgravecmb;030F -dblintegral;222C -dbllowline;2017 -dbllowlinecmb;0333 -dbloverlinecmb;033F -dblprimemod;02BA -dblverticalbar;2016 -dblverticallineabovecmb;030E -dbopomofo;3109 -dbsquare;33C8 -dcaron;010F -dcedilla;1E11 -dcircle;24D3 -dcircumflexbelow;1E13 -dcroat;0111 -ddabengali;09A1 -ddadeva;0921 -ddagujarati;0AA1 -ddagurmukhi;0A21 -ddalarabic;0688 -ddalfinalarabic;FB89 -dddhadeva;095C -ddhabengali;09A2 -ddhadeva;0922 -ddhagujarati;0AA2 -ddhagurmukhi;0A22 -ddotaccent;1E0B -ddotbelow;1E0D -decimalseparatorarabic;066B -decimalseparatorpersian;066B -decyrillic;0434 -degree;00B0 -dehihebrew;05AD -dehiragana;3067 -deicoptic;03EF -dekatakana;30C7 -deleteleft;232B -deleteright;2326 -delta;03B4 -deltaturned;018D -denominatorminusonenumeratorbengali;09F8 -dezh;02A4 -dhabengali;09A7 -dhadeva;0927 -dhagujarati;0AA7 -dhagurmukhi;0A27 -dhook;0257 -dialytikatonos;0385 -dialytikatonoscmb;0344 -diamond;2666 -diamondsuitwhite;2662 -dieresis;00A8 -dieresisacute;F6D7 -dieresisbelowcmb;0324 -dieresiscmb;0308 -dieresisgrave;F6D8 -dieresistonos;0385 -dihiragana;3062 -dikatakana;30C2 -dittomark;3003 -divide;00F7 -divides;2223 -divisionslash;2215 -djecyrillic;0452 -dkshade;2593 -dlinebelow;1E0F -dlsquare;3397 -dmacron;0111 -dmonospace;FF44 -dnblock;2584 -dochadathai;0E0E -dodekthai;0E14 -dohiragana;3069 -dokatakana;30C9 -dollar;0024 -dollarinferior;F6E3 -dollarmonospace;FF04 -dollaroldstyle;F724 -dollarsmall;FE69 -dollarsuperior;F6E4 -dong;20AB -dorusquare;3326 -dotaccent;02D9 -dotaccentcmb;0307 -dotbelowcmb;0323 -dotbelowcomb;0323 -dotkatakana;30FB -dotlessi;0131 -dotlessj;F6BE -dotlessjstrokehook;0284 -dotmath;22C5 -dottedcircle;25CC -doubleyodpatah;FB1F -doubleyodpatahhebrew;FB1F -downtackbelowcmb;031E -downtackmod;02D5 -dparen;249F -dsuperior;F6EB -dtail;0256 -dtopbar;018C -duhiragana;3065 -dukatakana;30C5 -dz;01F3 -dzaltone;02A3 -dzcaron;01C6 -dzcurl;02A5 -dzeabkhasiancyrillic;04E1 -dzecyrillic;0455 -dzhecyrillic;045F -e;0065 -eacute;00E9 -earth;2641 -ebengali;098F -ebopomofo;311C -ebreve;0115 -ecandradeva;090D -ecandragujarati;0A8D -ecandravowelsigndeva;0945 -ecandravowelsigngujarati;0AC5 -ecaron;011B -ecedillabreve;1E1D -echarmenian;0565 -echyiwnarmenian;0587 -ecircle;24D4 -ecircumflex;00EA -ecircumflexacute;1EBF -ecircumflexbelow;1E19 -ecircumflexdotbelow;1EC7 -ecircumflexgrave;1EC1 -ecircumflexhookabove;1EC3 -ecircumflextilde;1EC5 -ecyrillic;0454 -edblgrave;0205 -edeva;090F -edieresis;00EB -edot;0117 -edotaccent;0117 -edotbelow;1EB9 -eegurmukhi;0A0F -eematragurmukhi;0A47 -efcyrillic;0444 -egrave;00E8 -egujarati;0A8F -eharmenian;0567 -ehbopomofo;311D -ehiragana;3048 -ehookabove;1EBB -eibopomofo;311F -eight;0038 -eightarabic;0668 -eightbengali;09EE -eightcircle;2467 -eightcircleinversesansserif;2791 -eightdeva;096E -eighteencircle;2471 -eighteenparen;2485 -eighteenperiod;2499 -eightgujarati;0AEE -eightgurmukhi;0A6E -eighthackarabic;0668 -eighthangzhou;3028 -eighthnotebeamed;266B -eightideographicparen;3227 -eightinferior;2088 -eightmonospace;FF18 -eightoldstyle;F738 -eightparen;247B -eightperiod;248F -eightpersian;06F8 -eightroman;2177 -eightsuperior;2078 -eightthai;0E58 -einvertedbreve;0207 -eiotifiedcyrillic;0465 -ekatakana;30A8 -ekatakanahalfwidth;FF74 -ekonkargurmukhi;0A74 -ekorean;3154 -elcyrillic;043B -element;2208 -elevencircle;246A -elevenparen;247E -elevenperiod;2492 -elevenroman;217A -ellipsis;2026 -ellipsisvertical;22EE -emacron;0113 -emacronacute;1E17 -emacrongrave;1E15 -emcyrillic;043C -emdash;2014 -emdashvertical;FE31 -emonospace;FF45 -emphasismarkarmenian;055B -emptyset;2205 -enbopomofo;3123 -encyrillic;043D -endash;2013 -endashvertical;FE32 -endescendercyrillic;04A3 -eng;014B -engbopomofo;3125 -enghecyrillic;04A5 -enhookcyrillic;04C8 -enspace;2002 -eogonek;0119 -eokorean;3153 -eopen;025B -eopenclosed;029A -eopenreversed;025C -eopenreversedclosed;025E -eopenreversedhook;025D -eparen;24A0 -epsilon;03B5 -epsilontonos;03AD -equal;003D -equalmonospace;FF1D -equalsmall;FE66 -equalsuperior;207C -equivalence;2261 -erbopomofo;3126 -ercyrillic;0440 -ereversed;0258 -ereversedcyrillic;044D -escyrillic;0441 -esdescendercyrillic;04AB -esh;0283 -eshcurl;0286 -eshortdeva;090E -eshortvowelsigndeva;0946 -eshreversedloop;01AA -eshsquatreversed;0285 -esmallhiragana;3047 -esmallkatakana;30A7 -esmallkatakanahalfwidth;FF6A -estimated;212E -esuperior;F6EC -eta;03B7 -etarmenian;0568 -etatonos;03AE -eth;00F0 -etilde;1EBD -etildebelow;1E1B -etnahtafoukhhebrew;0591 -etnahtafoukhlefthebrew;0591 -etnahtahebrew;0591 -etnahtalefthebrew;0591 -eturned;01DD -eukorean;3161 -euro;20AC -evowelsignbengali;09C7 -evowelsigndeva;0947 -evowelsigngujarati;0AC7 -exclam;0021 -exclamarmenian;055C -exclamdbl;203C -exclamdown;00A1 -exclamdownsmall;F7A1 -exclammonospace;FF01 -exclamsmall;F721 -existential;2203 -ezh;0292 -ezhcaron;01EF -ezhcurl;0293 -ezhreversed;01B9 -ezhtail;01BA -f;0066 -fadeva;095E -fagurmukhi;0A5E -fahrenheit;2109 -fathaarabic;064E -fathalowarabic;064E -fathatanarabic;064B -fbopomofo;3108 -fcircle;24D5 -fdotaccent;1E1F -feharabic;0641 -feharmenian;0586 -fehfinalarabic;FED2 -fehinitialarabic;FED3 -fehmedialarabic;FED4 -feicoptic;03E5 -female;2640 -ff;FB00 -ffi;FB03 -ffl;FB04 -fi;FB01 -fifteencircle;246E -fifteenparen;2482 -fifteenperiod;2496 -figuredash;2012 -filledbox;25A0 -filledrect;25AC -finalkaf;05DA -finalkafdagesh;FB3A -finalkafdageshhebrew;FB3A -finalkafhebrew;05DA -finalkafqamats;05DA 05B8 -finalkafqamatshebrew;05DA 05B8 -finalkafsheva;05DA 05B0 -finalkafshevahebrew;05DA 05B0 -finalmem;05DD -finalmemhebrew;05DD -finalnun;05DF -finalnunhebrew;05DF -finalpe;05E3 -finalpehebrew;05E3 -finaltsadi;05E5 -finaltsadihebrew;05E5 -firsttonechinese;02C9 -fisheye;25C9 -fitacyrillic;0473 -five;0035 -fivearabic;0665 -fivebengali;09EB -fivecircle;2464 -fivecircleinversesansserif;278E -fivedeva;096B -fiveeighths;215D -fivegujarati;0AEB -fivegurmukhi;0A6B -fivehackarabic;0665 -fivehangzhou;3025 -fiveideographicparen;3224 -fiveinferior;2085 -fivemonospace;FF15 -fiveoldstyle;F735 -fiveparen;2478 -fiveperiod;248C -fivepersian;06F5 -fiveroman;2174 -fivesuperior;2075 -fivethai;0E55 -fl;FB02 -florin;0192 -fmonospace;FF46 -fmsquare;3399 -fofanthai;0E1F -fofathai;0E1D -fongmanthai;0E4F -forall;2200 -four;0034 -fourarabic;0664 -fourbengali;09EA -fourcircle;2463 -fourcircleinversesansserif;278D -fourdeva;096A -fourgujarati;0AEA -fourgurmukhi;0A6A -fourhackarabic;0664 -fourhangzhou;3024 -fourideographicparen;3223 -fourinferior;2084 -fourmonospace;FF14 -fournumeratorbengali;09F7 -fouroldstyle;F734 -fourparen;2477 -fourperiod;248B -fourpersian;06F4 -fourroman;2173 -foursuperior;2074 -fourteencircle;246D -fourteenparen;2481 -fourteenperiod;2495 -fourthai;0E54 -fourthtonechinese;02CB -fparen;24A1 -fraction;2044 -franc;20A3 -g;0067 -gabengali;0997 -gacute;01F5 -gadeva;0917 -gafarabic;06AF -gaffinalarabic;FB93 -gafinitialarabic;FB94 -gafmedialarabic;FB95 -gagujarati;0A97 -gagurmukhi;0A17 -gahiragana;304C -gakatakana;30AC -gamma;03B3 -gammalatinsmall;0263 -gammasuperior;02E0 -gangiacoptic;03EB -gbopomofo;310D -gbreve;011F -gcaron;01E7 -gcedilla;0123 -gcircle;24D6 -gcircumflex;011D -gcommaaccent;0123 -gdot;0121 -gdotaccent;0121 -gecyrillic;0433 -gehiragana;3052 -gekatakana;30B2 -geometricallyequal;2251 -gereshaccenthebrew;059C -gereshhebrew;05F3 -gereshmuqdamhebrew;059D -germandbls;00DF -gershayimaccenthebrew;059E -gershayimhebrew;05F4 -getamark;3013 -ghabengali;0998 -ghadarmenian;0572 -ghadeva;0918 -ghagujarati;0A98 -ghagurmukhi;0A18 -ghainarabic;063A -ghainfinalarabic;FECE -ghaininitialarabic;FECF -ghainmedialarabic;FED0 -ghemiddlehookcyrillic;0495 -ghestrokecyrillic;0493 -gheupturncyrillic;0491 -ghhadeva;095A -ghhagurmukhi;0A5A -ghook;0260 -ghzsquare;3393 -gihiragana;304E -gikatakana;30AE -gimarmenian;0563 -gimel;05D2 -gimeldagesh;FB32 -gimeldageshhebrew;FB32 -gimelhebrew;05D2 -gjecyrillic;0453 -glottalinvertedstroke;01BE -glottalstop;0294 -glottalstopinverted;0296 -glottalstopmod;02C0 -glottalstopreversed;0295 -glottalstopreversedmod;02C1 -glottalstopreversedsuperior;02E4 -glottalstopstroke;02A1 -glottalstopstrokereversed;02A2 -gmacron;1E21 -gmonospace;FF47 -gohiragana;3054 -gokatakana;30B4 -gparen;24A2 -gpasquare;33AC -gradient;2207 -grave;0060 -gravebelowcmb;0316 -gravecmb;0300 -gravecomb;0300 -gravedeva;0953 -gravelowmod;02CE -gravemonospace;FF40 -gravetonecmb;0340 -greater;003E -greaterequal;2265 -greaterequalorless;22DB -greatermonospace;FF1E -greaterorequivalent;2273 -greaterorless;2277 -greateroverequal;2267 -greatersmall;FE65 -gscript;0261 -gstroke;01E5 -guhiragana;3050 -guillemotleft;00AB -guillemotright;00BB -guilsinglleft;2039 -guilsinglright;203A -gukatakana;30B0 -guramusquare;3318 -gysquare;33C9 -h;0068 -haabkhasiancyrillic;04A9 -haaltonearabic;06C1 -habengali;09B9 -hadescendercyrillic;04B3 -hadeva;0939 -hagujarati;0AB9 -hagurmukhi;0A39 -haharabic;062D -hahfinalarabic;FEA2 -hahinitialarabic;FEA3 -hahiragana;306F -hahmedialarabic;FEA4 -haitusquare;332A -hakatakana;30CF -hakatakanahalfwidth;FF8A -halantgurmukhi;0A4D -hamzaarabic;0621 -hamzadammaarabic;0621 064F -hamzadammatanarabic;0621 064C -hamzafathaarabic;0621 064E -hamzafathatanarabic;0621 064B -hamzalowarabic;0621 -hamzalowkasraarabic;0621 0650 -hamzalowkasratanarabic;0621 064D -hamzasukunarabic;0621 0652 -hangulfiller;3164 -hardsigncyrillic;044A -harpoonleftbarbup;21BC -harpoonrightbarbup;21C0 -hasquare;33CA -hatafpatah;05B2 -hatafpatah16;05B2 -hatafpatah23;05B2 -hatafpatah2f;05B2 -hatafpatahhebrew;05B2 -hatafpatahnarrowhebrew;05B2 -hatafpatahquarterhebrew;05B2 -hatafpatahwidehebrew;05B2 -hatafqamats;05B3 -hatafqamats1b;05B3 -hatafqamats28;05B3 -hatafqamats34;05B3 -hatafqamatshebrew;05B3 -hatafqamatsnarrowhebrew;05B3 -hatafqamatsquarterhebrew;05B3 -hatafqamatswidehebrew;05B3 -hatafsegol;05B1 -hatafsegol17;05B1 -hatafsegol24;05B1 -hatafsegol30;05B1 -hatafsegolhebrew;05B1 -hatafsegolnarrowhebrew;05B1 -hatafsegolquarterhebrew;05B1 -hatafsegolwidehebrew;05B1 -hbar;0127 -hbopomofo;310F -hbrevebelow;1E2B -hcedilla;1E29 -hcircle;24D7 -hcircumflex;0125 -hdieresis;1E27 -hdotaccent;1E23 -hdotbelow;1E25 -he;05D4 -heart;2665 -heartsuitblack;2665 -heartsuitwhite;2661 -hedagesh;FB34 -hedageshhebrew;FB34 -hehaltonearabic;06C1 -heharabic;0647 -hehebrew;05D4 -hehfinalaltonearabic;FBA7 -hehfinalalttwoarabic;FEEA -hehfinalarabic;FEEA -hehhamzaabovefinalarabic;FBA5 -hehhamzaaboveisolatedarabic;FBA4 -hehinitialaltonearabic;FBA8 -hehinitialarabic;FEEB -hehiragana;3078 -hehmedialaltonearabic;FBA9 -hehmedialarabic;FEEC -heiseierasquare;337B -hekatakana;30D8 -hekatakanahalfwidth;FF8D -hekutaarusquare;3336 -henghook;0267 -herutusquare;3339 -het;05D7 -hethebrew;05D7 -hhook;0266 -hhooksuperior;02B1 -hieuhacirclekorean;327B -hieuhaparenkorean;321B -hieuhcirclekorean;326D -hieuhkorean;314E -hieuhparenkorean;320D -hihiragana;3072 -hikatakana;30D2 -hikatakanahalfwidth;FF8B -hiriq;05B4 -hiriq14;05B4 -hiriq21;05B4 -hiriq2d;05B4 -hiriqhebrew;05B4 -hiriqnarrowhebrew;05B4 -hiriqquarterhebrew;05B4 -hiriqwidehebrew;05B4 -hlinebelow;1E96 -hmonospace;FF48 -hoarmenian;0570 -hohipthai;0E2B -hohiragana;307B -hokatakana;30DB -hokatakanahalfwidth;FF8E -holam;05B9 -holam19;05B9 -holam26;05B9 -holam32;05B9 -holamhebrew;05B9 -holamnarrowhebrew;05B9 -holamquarterhebrew;05B9 -holamwidehebrew;05B9 -honokhukthai;0E2E -hookabovecomb;0309 -hookcmb;0309 -hookpalatalizedbelowcmb;0321 -hookretroflexbelowcmb;0322 -hoonsquare;3342 -horicoptic;03E9 -horizontalbar;2015 -horncmb;031B -hotsprings;2668 -house;2302 -hparen;24A3 -hsuperior;02B0 -hturned;0265 -huhiragana;3075 -huiitosquare;3333 -hukatakana;30D5 -hukatakanahalfwidth;FF8C -hungarumlaut;02DD -hungarumlautcmb;030B -hv;0195 -hyphen;002D -hypheninferior;F6E5 -hyphenmonospace;FF0D -hyphensmall;FE63 -hyphensuperior;F6E6 -hyphentwo;2010 -i;0069 -iacute;00ED -iacyrillic;044F -ibengali;0987 -ibopomofo;3127 -ibreve;012D -icaron;01D0 -icircle;24D8 -icircumflex;00EE -icyrillic;0456 -idblgrave;0209 -ideographearthcircle;328F -ideographfirecircle;328B -ideographicallianceparen;323F -ideographiccallparen;323A -ideographiccentrecircle;32A5 -ideographicclose;3006 -ideographiccomma;3001 -ideographiccommaleft;FF64 -ideographiccongratulationparen;3237 -ideographiccorrectcircle;32A3 -ideographicearthparen;322F -ideographicenterpriseparen;323D -ideographicexcellentcircle;329D -ideographicfestivalparen;3240 -ideographicfinancialcircle;3296 -ideographicfinancialparen;3236 -ideographicfireparen;322B -ideographichaveparen;3232 -ideographichighcircle;32A4 -ideographiciterationmark;3005 -ideographiclaborcircle;3298 -ideographiclaborparen;3238 -ideographicleftcircle;32A7 -ideographiclowcircle;32A6 -ideographicmedicinecircle;32A9 -ideographicmetalparen;322E -ideographicmoonparen;322A -ideographicnameparen;3234 -ideographicperiod;3002 -ideographicprintcircle;329E -ideographicreachparen;3243 -ideographicrepresentparen;3239 -ideographicresourceparen;323E -ideographicrightcircle;32A8 -ideographicsecretcircle;3299 -ideographicselfparen;3242 -ideographicsocietyparen;3233 -ideographicspace;3000 -ideographicspecialparen;3235 -ideographicstockparen;3231 -ideographicstudyparen;323B -ideographicsunparen;3230 -ideographicsuperviseparen;323C -ideographicwaterparen;322C -ideographicwoodparen;322D -ideographiczero;3007 -ideographmetalcircle;328E -ideographmooncircle;328A -ideographnamecircle;3294 -ideographsuncircle;3290 -ideographwatercircle;328C -ideographwoodcircle;328D -ideva;0907 -idieresis;00EF -idieresisacute;1E2F -idieresiscyrillic;04E5 -idotbelow;1ECB -iebrevecyrillic;04D7 -iecyrillic;0435 -ieungacirclekorean;3275 -ieungaparenkorean;3215 -ieungcirclekorean;3267 -ieungkorean;3147 -ieungparenkorean;3207 -igrave;00EC -igujarati;0A87 -igurmukhi;0A07 -ihiragana;3044 -ihookabove;1EC9 -iibengali;0988 -iicyrillic;0438 -iideva;0908 -iigujarati;0A88 -iigurmukhi;0A08 -iimatragurmukhi;0A40 -iinvertedbreve;020B -iishortcyrillic;0439 -iivowelsignbengali;09C0 -iivowelsigndeva;0940 -iivowelsigngujarati;0AC0 -ij;0133 -ikatakana;30A4 -ikatakanahalfwidth;FF72 -ikorean;3163 -ilde;02DC -iluyhebrew;05AC -imacron;012B -imacroncyrillic;04E3 -imageorapproximatelyequal;2253 -imatragurmukhi;0A3F -imonospace;FF49 -increment;2206 -infinity;221E -iniarmenian;056B -integral;222B -integralbottom;2321 -integralbt;2321 -integralex;F8F5 -integraltop;2320 -integraltp;2320 -intersection;2229 -intisquare;3305 -invbullet;25D8 -invcircle;25D9 -invsmileface;263B -iocyrillic;0451 -iogonek;012F -iota;03B9 -iotadieresis;03CA -iotadieresistonos;0390 -iotalatin;0269 -iotatonos;03AF -iparen;24A4 -irigurmukhi;0A72 -ismallhiragana;3043 -ismallkatakana;30A3 -ismallkatakanahalfwidth;FF68 -issharbengali;09FA -istroke;0268 -isuperior;F6ED -iterationhiragana;309D -iterationkatakana;30FD -itilde;0129 -itildebelow;1E2D -iubopomofo;3129 -iucyrillic;044E -ivowelsignbengali;09BF -ivowelsigndeva;093F -ivowelsigngujarati;0ABF -izhitsacyrillic;0475 -izhitsadblgravecyrillic;0477 -j;006A -jaarmenian;0571 -jabengali;099C -jadeva;091C -jagujarati;0A9C -jagurmukhi;0A1C -jbopomofo;3110 -jcaron;01F0 -jcircle;24D9 -jcircumflex;0135 -jcrossedtail;029D -jdotlessstroke;025F -jecyrillic;0458 -jeemarabic;062C -jeemfinalarabic;FE9E -jeeminitialarabic;FE9F -jeemmedialarabic;FEA0 -jeharabic;0698 -jehfinalarabic;FB8B -jhabengali;099D -jhadeva;091D -jhagujarati;0A9D -jhagurmukhi;0A1D -jheharmenian;057B -jis;3004 -jmonospace;FF4A -jparen;24A5 -jsuperior;02B2 -k;006B -kabashkircyrillic;04A1 -kabengali;0995 -kacute;1E31 -kacyrillic;043A -kadescendercyrillic;049B -kadeva;0915 -kaf;05DB -kafarabic;0643 -kafdagesh;FB3B -kafdageshhebrew;FB3B -kaffinalarabic;FEDA -kafhebrew;05DB -kafinitialarabic;FEDB -kafmedialarabic;FEDC -kafrafehebrew;FB4D -kagujarati;0A95 -kagurmukhi;0A15 -kahiragana;304B -kahookcyrillic;04C4 -kakatakana;30AB -kakatakanahalfwidth;FF76 -kappa;03BA -kappasymbolgreek;03F0 -kapyeounmieumkorean;3171 -kapyeounphieuphkorean;3184 -kapyeounpieupkorean;3178 -kapyeounssangpieupkorean;3179 -karoriisquare;330D -kashidaautoarabic;0640 -kashidaautonosidebearingarabic;0640 -kasmallkatakana;30F5 -kasquare;3384 -kasraarabic;0650 -kasratanarabic;064D -kastrokecyrillic;049F -katahiraprolongmarkhalfwidth;FF70 -kaverticalstrokecyrillic;049D -kbopomofo;310E -kcalsquare;3389 -kcaron;01E9 -kcedilla;0137 -kcircle;24DA -kcommaaccent;0137 -kdotbelow;1E33 -keharmenian;0584 -kehiragana;3051 -kekatakana;30B1 -kekatakanahalfwidth;FF79 -kenarmenian;056F -kesmallkatakana;30F6 -kgreenlandic;0138 -khabengali;0996 -khacyrillic;0445 -khadeva;0916 -khagujarati;0A96 -khagurmukhi;0A16 -khaharabic;062E -khahfinalarabic;FEA6 -khahinitialarabic;FEA7 -khahmedialarabic;FEA8 -kheicoptic;03E7 -khhadeva;0959 -khhagurmukhi;0A59 -khieukhacirclekorean;3278 -khieukhaparenkorean;3218 -khieukhcirclekorean;326A -khieukhkorean;314B -khieukhparenkorean;320A -khokhaithai;0E02 -khokhonthai;0E05 -khokhuatthai;0E03 -khokhwaithai;0E04 -khomutthai;0E5B -khook;0199 -khorakhangthai;0E06 -khzsquare;3391 -kihiragana;304D -kikatakana;30AD -kikatakanahalfwidth;FF77 -kiroguramusquare;3315 -kiromeetorusquare;3316 -kirosquare;3314 -kiyeokacirclekorean;326E -kiyeokaparenkorean;320E -kiyeokcirclekorean;3260 -kiyeokkorean;3131 -kiyeokparenkorean;3200 -kiyeoksioskorean;3133 -kjecyrillic;045C -klinebelow;1E35 -klsquare;3398 -kmcubedsquare;33A6 -kmonospace;FF4B -kmsquaredsquare;33A2 -kohiragana;3053 -kohmsquare;33C0 -kokaithai;0E01 -kokatakana;30B3 -kokatakanahalfwidth;FF7A -kooposquare;331E -koppacyrillic;0481 -koreanstandardsymbol;327F -koroniscmb;0343 -kparen;24A6 -kpasquare;33AA -ksicyrillic;046F -ktsquare;33CF -kturned;029E -kuhiragana;304F -kukatakana;30AF -kukatakanahalfwidth;FF78 -kvsquare;33B8 -kwsquare;33BE -l;006C -labengali;09B2 -lacute;013A -ladeva;0932 -lagujarati;0AB2 -lagurmukhi;0A32 -lakkhangyaothai;0E45 -lamaleffinalarabic;FEFC -lamalefhamzaabovefinalarabic;FEF8 -lamalefhamzaaboveisolatedarabic;FEF7 -lamalefhamzabelowfinalarabic;FEFA -lamalefhamzabelowisolatedarabic;FEF9 -lamalefisolatedarabic;FEFB -lamalefmaddaabovefinalarabic;FEF6 -lamalefmaddaaboveisolatedarabic;FEF5 -lamarabic;0644 -lambda;03BB -lambdastroke;019B -lamed;05DC -lameddagesh;FB3C -lameddageshhebrew;FB3C -lamedhebrew;05DC -lamedholam;05DC 05B9 -lamedholamdagesh;05DC 05B9 05BC -lamedholamdageshhebrew;05DC 05B9 05BC -lamedholamhebrew;05DC 05B9 -lamfinalarabic;FEDE -lamhahinitialarabic;FCCA -laminitialarabic;FEDF -lamjeeminitialarabic;FCC9 -lamkhahinitialarabic;FCCB -lamlamhehisolatedarabic;FDF2 -lammedialarabic;FEE0 -lammeemhahinitialarabic;FD88 -lammeeminitialarabic;FCCC -lammeemjeeminitialarabic;FEDF FEE4 FEA0 -lammeemkhahinitialarabic;FEDF FEE4 FEA8 -largecircle;25EF -lbar;019A -lbelt;026C -lbopomofo;310C -lcaron;013E -lcedilla;013C -lcircle;24DB -lcircumflexbelow;1E3D -lcommaaccent;013C -ldot;0140 -ldotaccent;0140 -ldotbelow;1E37 -ldotbelowmacron;1E39 -leftangleabovecmb;031A -lefttackbelowcmb;0318 -less;003C -lessequal;2264 -lessequalorgreater;22DA -lessmonospace;FF1C -lessorequivalent;2272 -lessorgreater;2276 -lessoverequal;2266 -lesssmall;FE64 -lezh;026E -lfblock;258C -lhookretroflex;026D -lira;20A4 -liwnarmenian;056C -lj;01C9 -ljecyrillic;0459 -ll;F6C0 -lladeva;0933 -llagujarati;0AB3 -llinebelow;1E3B -llladeva;0934 -llvocalicbengali;09E1 -llvocalicdeva;0961 -llvocalicvowelsignbengali;09E3 -llvocalicvowelsigndeva;0963 -lmiddletilde;026B -lmonospace;FF4C -lmsquare;33D0 -lochulathai;0E2C -logicaland;2227 -logicalnot;00AC -logicalnotreversed;2310 -logicalor;2228 -lolingthai;0E25 -longs;017F -lowlinecenterline;FE4E -lowlinecmb;0332 -lowlinedashed;FE4D -lozenge;25CA -lparen;24A7 -lslash;0142 -lsquare;2113 -lsuperior;F6EE -ltshade;2591 -luthai;0E26 -lvocalicbengali;098C -lvocalicdeva;090C -lvocalicvowelsignbengali;09E2 -lvocalicvowelsigndeva;0962 -lxsquare;33D3 -m;006D -mabengali;09AE -macron;00AF -macronbelowcmb;0331 -macroncmb;0304 -macronlowmod;02CD -macronmonospace;FFE3 -macute;1E3F -madeva;092E -magujarati;0AAE -magurmukhi;0A2E -mahapakhhebrew;05A4 -mahapakhlefthebrew;05A4 -mahiragana;307E -maichattawalowleftthai;F895 -maichattawalowrightthai;F894 -maichattawathai;0E4B -maichattawaupperleftthai;F893 -maieklowleftthai;F88C -maieklowrightthai;F88B -maiekthai;0E48 -maiekupperleftthai;F88A -maihanakatleftthai;F884 -maihanakatthai;0E31 -maitaikhuleftthai;F889 -maitaikhuthai;0E47 -maitholowleftthai;F88F -maitholowrightthai;F88E -maithothai;0E49 -maithoupperleftthai;F88D -maitrilowleftthai;F892 -maitrilowrightthai;F891 -maitrithai;0E4A -maitriupperleftthai;F890 -maiyamokthai;0E46 -makatakana;30DE -makatakanahalfwidth;FF8F -male;2642 -mansyonsquare;3347 -maqafhebrew;05BE -mars;2642 -masoracirclehebrew;05AF -masquare;3383 -mbopomofo;3107 -mbsquare;33D4 -mcircle;24DC -mcubedsquare;33A5 -mdotaccent;1E41 -mdotbelow;1E43 -meemarabic;0645 -meemfinalarabic;FEE2 -meeminitialarabic;FEE3 -meemmedialarabic;FEE4 -meemmeeminitialarabic;FCD1 -meemmeemisolatedarabic;FC48 -meetorusquare;334D -mehiragana;3081 -meizierasquare;337E -mekatakana;30E1 -mekatakanahalfwidth;FF92 -mem;05DE -memdagesh;FB3E -memdageshhebrew;FB3E -memhebrew;05DE -menarmenian;0574 -merkhahebrew;05A5 -merkhakefulahebrew;05A6 -merkhakefulalefthebrew;05A6 -merkhalefthebrew;05A5 -mhook;0271 -mhzsquare;3392 -middledotkatakanahalfwidth;FF65 -middot;00B7 -mieumacirclekorean;3272 -mieumaparenkorean;3212 -mieumcirclekorean;3264 -mieumkorean;3141 -mieumpansioskorean;3170 -mieumparenkorean;3204 -mieumpieupkorean;316E -mieumsioskorean;316F -mihiragana;307F -mikatakana;30DF -mikatakanahalfwidth;FF90 -minus;2212 -minusbelowcmb;0320 -minuscircle;2296 -minusmod;02D7 -minusplus;2213 -minute;2032 -miribaarusquare;334A -mirisquare;3349 -mlonglegturned;0270 -mlsquare;3396 -mmcubedsquare;33A3 -mmonospace;FF4D -mmsquaredsquare;339F -mohiragana;3082 -mohmsquare;33C1 -mokatakana;30E2 -mokatakanahalfwidth;FF93 -molsquare;33D6 -momathai;0E21 -moverssquare;33A7 -moverssquaredsquare;33A8 -mparen;24A8 -mpasquare;33AB -mssquare;33B3 -msuperior;F6EF -mturned;026F -mu;00B5 -mu1;00B5 -muasquare;3382 -muchgreater;226B -muchless;226A -mufsquare;338C -mugreek;03BC -mugsquare;338D -muhiragana;3080 -mukatakana;30E0 -mukatakanahalfwidth;FF91 -mulsquare;3395 -multiply;00D7 -mumsquare;339B -munahhebrew;05A3 -munahlefthebrew;05A3 -musicalnote;266A -musicalnotedbl;266B -musicflatsign;266D -musicsharpsign;266F -mussquare;33B2 -muvsquare;33B6 -muwsquare;33BC -mvmegasquare;33B9 -mvsquare;33B7 -mwmegasquare;33BF -mwsquare;33BD -n;006E -nabengali;09A8 -nabla;2207 -nacute;0144 -nadeva;0928 -nagujarati;0AA8 -nagurmukhi;0A28 -nahiragana;306A -nakatakana;30CA -nakatakanahalfwidth;FF85 -napostrophe;0149 -nasquare;3381 -nbopomofo;310B -nbspace;00A0 -ncaron;0148 -ncedilla;0146 -ncircle;24DD -ncircumflexbelow;1E4B -ncommaaccent;0146 -ndotaccent;1E45 -ndotbelow;1E47 -nehiragana;306D -nekatakana;30CD -nekatakanahalfwidth;FF88 -newsheqelsign;20AA -nfsquare;338B -ngabengali;0999 -ngadeva;0919 -ngagujarati;0A99 -ngagurmukhi;0A19 -ngonguthai;0E07 -nhiragana;3093 -nhookleft;0272 -nhookretroflex;0273 -nieunacirclekorean;326F -nieunaparenkorean;320F -nieuncieuckorean;3135 -nieuncirclekorean;3261 -nieunhieuhkorean;3136 -nieunkorean;3134 -nieunpansioskorean;3168 -nieunparenkorean;3201 -nieunsioskorean;3167 -nieuntikeutkorean;3166 -nihiragana;306B -nikatakana;30CB -nikatakanahalfwidth;FF86 -nikhahitleftthai;F899 -nikhahitthai;0E4D -nine;0039 -ninearabic;0669 -ninebengali;09EF -ninecircle;2468 -ninecircleinversesansserif;2792 -ninedeva;096F -ninegujarati;0AEF -ninegurmukhi;0A6F -ninehackarabic;0669 -ninehangzhou;3029 -nineideographicparen;3228 -nineinferior;2089 -ninemonospace;FF19 -nineoldstyle;F739 -nineparen;247C -nineperiod;2490 -ninepersian;06F9 -nineroman;2178 -ninesuperior;2079 -nineteencircle;2472 -nineteenparen;2486 -nineteenperiod;249A -ninethai;0E59 -nj;01CC -njecyrillic;045A -nkatakana;30F3 -nkatakanahalfwidth;FF9D -nlegrightlong;019E -nlinebelow;1E49 -nmonospace;FF4E -nmsquare;339A -nnabengali;09A3 -nnadeva;0923 -nnagujarati;0AA3 -nnagurmukhi;0A23 -nnnadeva;0929 -nohiragana;306E -nokatakana;30CE -nokatakanahalfwidth;FF89 -nonbreakingspace;00A0 -nonenthai;0E13 -nonuthai;0E19 -noonarabic;0646 -noonfinalarabic;FEE6 -noonghunnaarabic;06BA -noonghunnafinalarabic;FB9F -noonhehinitialarabic;FEE7 FEEC -nooninitialarabic;FEE7 -noonjeeminitialarabic;FCD2 -noonjeemisolatedarabic;FC4B -noonmedialarabic;FEE8 -noonmeeminitialarabic;FCD5 -noonmeemisolatedarabic;FC4E -noonnoonfinalarabic;FC8D -notcontains;220C -notelement;2209 -notelementof;2209 -notequal;2260 -notgreater;226F -notgreaternorequal;2271 -notgreaternorless;2279 -notidentical;2262 -notless;226E -notlessnorequal;2270 -notparallel;2226 -notprecedes;2280 -notsubset;2284 -notsucceeds;2281 -notsuperset;2285 -nowarmenian;0576 -nparen;24A9 -nssquare;33B1 -nsuperior;207F -ntilde;00F1 -nu;03BD -nuhiragana;306C -nukatakana;30CC -nukatakanahalfwidth;FF87 -nuktabengali;09BC -nuktadeva;093C -nuktagujarati;0ABC -nuktagurmukhi;0A3C -numbersign;0023 -numbersignmonospace;FF03 -numbersignsmall;FE5F -numeralsigngreek;0374 -numeralsignlowergreek;0375 -numero;2116 -nun;05E0 -nundagesh;FB40 -nundageshhebrew;FB40 -nunhebrew;05E0 -nvsquare;33B5 -nwsquare;33BB -nyabengali;099E -nyadeva;091E -nyagujarati;0A9E -nyagurmukhi;0A1E -o;006F -oacute;00F3 -oangthai;0E2D -obarred;0275 -obarredcyrillic;04E9 -obarreddieresiscyrillic;04EB -obengali;0993 -obopomofo;311B -obreve;014F -ocandradeva;0911 -ocandragujarati;0A91 -ocandravowelsigndeva;0949 -ocandravowelsigngujarati;0AC9 -ocaron;01D2 -ocircle;24DE -ocircumflex;00F4 -ocircumflexacute;1ED1 -ocircumflexdotbelow;1ED9 -ocircumflexgrave;1ED3 -ocircumflexhookabove;1ED5 -ocircumflextilde;1ED7 -ocyrillic;043E -odblacute;0151 -odblgrave;020D -odeva;0913 -odieresis;00F6 -odieresiscyrillic;04E7 -odotbelow;1ECD -oe;0153 -oekorean;315A -ogonek;02DB -ogonekcmb;0328 -ograve;00F2 -ogujarati;0A93 -oharmenian;0585 -ohiragana;304A -ohookabove;1ECF -ohorn;01A1 -ohornacute;1EDB -ohorndotbelow;1EE3 -ohorngrave;1EDD -ohornhookabove;1EDF -ohorntilde;1EE1 -ohungarumlaut;0151 -oi;01A3 -oinvertedbreve;020F -okatakana;30AA -okatakanahalfwidth;FF75 -okorean;3157 -olehebrew;05AB -omacron;014D -omacronacute;1E53 -omacrongrave;1E51 -omdeva;0950 -omega;03C9 -omega1;03D6 -omegacyrillic;0461 -omegalatinclosed;0277 -omegaroundcyrillic;047B -omegatitlocyrillic;047D -omegatonos;03CE -omgujarati;0AD0 -omicron;03BF -omicrontonos;03CC -omonospace;FF4F -one;0031 -onearabic;0661 -onebengali;09E7 -onecircle;2460 -onecircleinversesansserif;278A -onedeva;0967 -onedotenleader;2024 -oneeighth;215B -onefitted;F6DC -onegujarati;0AE7 -onegurmukhi;0A67 -onehackarabic;0661 -onehalf;00BD -onehangzhou;3021 -oneideographicparen;3220 -oneinferior;2081 -onemonospace;FF11 -onenumeratorbengali;09F4 -oneoldstyle;F731 -oneparen;2474 -oneperiod;2488 -onepersian;06F1 -onequarter;00BC -oneroman;2170 -onesuperior;00B9 -onethai;0E51 -onethird;2153 -oogonek;01EB -oogonekmacron;01ED -oogurmukhi;0A13 -oomatragurmukhi;0A4B -oopen;0254 -oparen;24AA -openbullet;25E6 -option;2325 -ordfeminine;00AA -ordmasculine;00BA -orthogonal;221F -oshortdeva;0912 -oshortvowelsigndeva;094A -oslash;00F8 -oslashacute;01FF -osmallhiragana;3049 -osmallkatakana;30A9 -osmallkatakanahalfwidth;FF6B -ostrokeacute;01FF -osuperior;F6F0 -otcyrillic;047F -otilde;00F5 -otildeacute;1E4D -otildedieresis;1E4F -oubopomofo;3121 -overline;203E -overlinecenterline;FE4A -overlinecmb;0305 -overlinedashed;FE49 -overlinedblwavy;FE4C -overlinewavy;FE4B -overscore;00AF -ovowelsignbengali;09CB -ovowelsigndeva;094B -ovowelsigngujarati;0ACB -p;0070 -paampssquare;3380 -paasentosquare;332B -pabengali;09AA -pacute;1E55 -padeva;092A -pagedown;21DF -pageup;21DE -pagujarati;0AAA -pagurmukhi;0A2A -pahiragana;3071 -paiyannoithai;0E2F -pakatakana;30D1 -palatalizationcyrilliccmb;0484 -palochkacyrillic;04C0 -pansioskorean;317F -paragraph;00B6 -parallel;2225 -parenleft;0028 -parenleftaltonearabic;FD3E -parenleftbt;F8ED -parenleftex;F8EC -parenleftinferior;208D -parenleftmonospace;FF08 -parenleftsmall;FE59 -parenleftsuperior;207D -parenlefttp;F8EB -parenleftvertical;FE35 -parenright;0029 -parenrightaltonearabic;FD3F -parenrightbt;F8F8 -parenrightex;F8F7 -parenrightinferior;208E -parenrightmonospace;FF09 -parenrightsmall;FE5A -parenrightsuperior;207E -parenrighttp;F8F6 -parenrightvertical;FE36 -partialdiff;2202 -paseqhebrew;05C0 -pashtahebrew;0599 -pasquare;33A9 -patah;05B7 -patah11;05B7 -patah1d;05B7 -patah2a;05B7 -patahhebrew;05B7 -patahnarrowhebrew;05B7 -patahquarterhebrew;05B7 -patahwidehebrew;05B7 -pazerhebrew;05A1 -pbopomofo;3106 -pcircle;24DF -pdotaccent;1E57 -pe;05E4 -pecyrillic;043F -pedagesh;FB44 -pedageshhebrew;FB44 -peezisquare;333B -pefinaldageshhebrew;FB43 -peharabic;067E -peharmenian;057A -pehebrew;05E4 -pehfinalarabic;FB57 -pehinitialarabic;FB58 -pehiragana;307A -pehmedialarabic;FB59 -pekatakana;30DA -pemiddlehookcyrillic;04A7 -perafehebrew;FB4E -percent;0025 -percentarabic;066A -percentmonospace;FF05 -percentsmall;FE6A -period;002E -periodarmenian;0589 -periodcentered;00B7 -periodhalfwidth;FF61 -periodinferior;F6E7 -periodmonospace;FF0E -periodsmall;FE52 -periodsuperior;F6E8 -perispomenigreekcmb;0342 -perpendicular;22A5 -perthousand;2030 -peseta;20A7 -pfsquare;338A -phabengali;09AB -phadeva;092B -phagujarati;0AAB -phagurmukhi;0A2B -phi;03C6 -phi1;03D5 -phieuphacirclekorean;327A -phieuphaparenkorean;321A -phieuphcirclekorean;326C -phieuphkorean;314D -phieuphparenkorean;320C -philatin;0278 -phinthuthai;0E3A -phisymbolgreek;03D5 -phook;01A5 -phophanthai;0E1E -phophungthai;0E1C -phosamphaothai;0E20 -pi;03C0 -pieupacirclekorean;3273 -pieupaparenkorean;3213 -pieupcieuckorean;3176 -pieupcirclekorean;3265 -pieupkiyeokkorean;3172 -pieupkorean;3142 -pieupparenkorean;3205 -pieupsioskiyeokkorean;3174 -pieupsioskorean;3144 -pieupsiostikeutkorean;3175 -pieupthieuthkorean;3177 -pieuptikeutkorean;3173 -pihiragana;3074 -pikatakana;30D4 -pisymbolgreek;03D6 -piwrarmenian;0583 -plus;002B -plusbelowcmb;031F -pluscircle;2295 -plusminus;00B1 -plusmod;02D6 -plusmonospace;FF0B -plussmall;FE62 -plussuperior;207A -pmonospace;FF50 -pmsquare;33D8 -pohiragana;307D -pointingindexdownwhite;261F -pointingindexleftwhite;261C -pointingindexrightwhite;261E -pointingindexupwhite;261D -pokatakana;30DD -poplathai;0E1B -postalmark;3012 -postalmarkface;3020 -pparen;24AB -precedes;227A -prescription;211E -primemod;02B9 -primereversed;2035 -product;220F -projective;2305 -prolongedkana;30FC -propellor;2318 -propersubset;2282 -propersuperset;2283 -proportion;2237 -proportional;221D -psi;03C8 -psicyrillic;0471 -psilipneumatacyrilliccmb;0486 -pssquare;33B0 -puhiragana;3077 -pukatakana;30D7 -pvsquare;33B4 -pwsquare;33BA -q;0071 -qadeva;0958 -qadmahebrew;05A8 -qafarabic;0642 -qaffinalarabic;FED6 -qafinitialarabic;FED7 -qafmedialarabic;FED8 -qamats;05B8 -qamats10;05B8 -qamats1a;05B8 -qamats1c;05B8 -qamats27;05B8 -qamats29;05B8 -qamats33;05B8 -qamatsde;05B8 -qamatshebrew;05B8 -qamatsnarrowhebrew;05B8 -qamatsqatanhebrew;05B8 -qamatsqatannarrowhebrew;05B8 -qamatsqatanquarterhebrew;05B8 -qamatsqatanwidehebrew;05B8 -qamatsquarterhebrew;05B8 -qamatswidehebrew;05B8 -qarneyparahebrew;059F -qbopomofo;3111 -qcircle;24E0 -qhook;02A0 -qmonospace;FF51 -qof;05E7 -qofdagesh;FB47 -qofdageshhebrew;FB47 -qofhatafpatah;05E7 05B2 -qofhatafpatahhebrew;05E7 05B2 -qofhatafsegol;05E7 05B1 -qofhatafsegolhebrew;05E7 05B1 -qofhebrew;05E7 -qofhiriq;05E7 05B4 -qofhiriqhebrew;05E7 05B4 -qofholam;05E7 05B9 -qofholamhebrew;05E7 05B9 -qofpatah;05E7 05B7 -qofpatahhebrew;05E7 05B7 -qofqamats;05E7 05B8 -qofqamatshebrew;05E7 05B8 -qofqubuts;05E7 05BB -qofqubutshebrew;05E7 05BB -qofsegol;05E7 05B6 -qofsegolhebrew;05E7 05B6 -qofsheva;05E7 05B0 -qofshevahebrew;05E7 05B0 -qoftsere;05E7 05B5 -qoftserehebrew;05E7 05B5 -qparen;24AC -quarternote;2669 -qubuts;05BB -qubuts18;05BB -qubuts25;05BB -qubuts31;05BB -qubutshebrew;05BB -qubutsnarrowhebrew;05BB -qubutsquarterhebrew;05BB -qubutswidehebrew;05BB -question;003F -questionarabic;061F -questionarmenian;055E -questiondown;00BF -questiondownsmall;F7BF -questiongreek;037E -questionmonospace;FF1F -questionsmall;F73F -quotedbl;0022 -quotedblbase;201E -quotedblleft;201C -quotedblmonospace;FF02 -quotedblprime;301E -quotedblprimereversed;301D -quotedblright;201D -quoteleft;2018 -quoteleftreversed;201B -quotereversed;201B -quoteright;2019 -quoterightn;0149 -quotesinglbase;201A -quotesingle;0027 -quotesinglemonospace;FF07 -r;0072 -raarmenian;057C -rabengali;09B0 -racute;0155 -radeva;0930 -radical;221A -radicalex;F8E5 -radoverssquare;33AE -radoverssquaredsquare;33AF -radsquare;33AD -rafe;05BF -rafehebrew;05BF -ragujarati;0AB0 -ragurmukhi;0A30 -rahiragana;3089 -rakatakana;30E9 -rakatakanahalfwidth;FF97 -ralowerdiagonalbengali;09F1 -ramiddlediagonalbengali;09F0 -ramshorn;0264 -ratio;2236 -rbopomofo;3116 -rcaron;0159 -rcedilla;0157 -rcircle;24E1 -rcommaaccent;0157 -rdblgrave;0211 -rdotaccent;1E59 -rdotbelow;1E5B -rdotbelowmacron;1E5D -referencemark;203B -reflexsubset;2286 -reflexsuperset;2287 -registered;00AE -registersans;F8E8 -registerserif;F6DA -reharabic;0631 -reharmenian;0580 -rehfinalarabic;FEAE -rehiragana;308C -rehyehaleflamarabic;0631 FEF3 FE8E 0644 -rekatakana;30EC -rekatakanahalfwidth;FF9A -resh;05E8 -reshdageshhebrew;FB48 -reshhatafpatah;05E8 05B2 -reshhatafpatahhebrew;05E8 05B2 -reshhatafsegol;05E8 05B1 -reshhatafsegolhebrew;05E8 05B1 -reshhebrew;05E8 -reshhiriq;05E8 05B4 -reshhiriqhebrew;05E8 05B4 -reshholam;05E8 05B9 -reshholamhebrew;05E8 05B9 -reshpatah;05E8 05B7 -reshpatahhebrew;05E8 05B7 -reshqamats;05E8 05B8 -reshqamatshebrew;05E8 05B8 -reshqubuts;05E8 05BB -reshqubutshebrew;05E8 05BB -reshsegol;05E8 05B6 -reshsegolhebrew;05E8 05B6 -reshsheva;05E8 05B0 -reshshevahebrew;05E8 05B0 -reshtsere;05E8 05B5 -reshtserehebrew;05E8 05B5 -reversedtilde;223D -reviahebrew;0597 -reviamugrashhebrew;0597 -revlogicalnot;2310 -rfishhook;027E -rfishhookreversed;027F -rhabengali;09DD -rhadeva;095D -rho;03C1 -rhook;027D -rhookturned;027B -rhookturnedsuperior;02B5 -rhosymbolgreek;03F1 -rhotichookmod;02DE -rieulacirclekorean;3271 -rieulaparenkorean;3211 -rieulcirclekorean;3263 -rieulhieuhkorean;3140 -rieulkiyeokkorean;313A -rieulkiyeoksioskorean;3169 -rieulkorean;3139 -rieulmieumkorean;313B -rieulpansioskorean;316C -rieulparenkorean;3203 -rieulphieuphkorean;313F -rieulpieupkorean;313C -rieulpieupsioskorean;316B -rieulsioskorean;313D -rieulthieuthkorean;313E -rieultikeutkorean;316A -rieulyeorinhieuhkorean;316D -rightangle;221F -righttackbelowcmb;0319 -righttriangle;22BF -rihiragana;308A -rikatakana;30EA -rikatakanahalfwidth;FF98 -ring;02DA -ringbelowcmb;0325 -ringcmb;030A -ringhalfleft;02BF -ringhalfleftarmenian;0559 -ringhalfleftbelowcmb;031C -ringhalfleftcentered;02D3 -ringhalfright;02BE -ringhalfrightbelowcmb;0339 -ringhalfrightcentered;02D2 -rinvertedbreve;0213 -rittorusquare;3351 -rlinebelow;1E5F -rlongleg;027C -rlonglegturned;027A -rmonospace;FF52 -rohiragana;308D -rokatakana;30ED -rokatakanahalfwidth;FF9B -roruathai;0E23 -rparen;24AD -rrabengali;09DC -rradeva;0931 -rragurmukhi;0A5C -rreharabic;0691 -rrehfinalarabic;FB8D -rrvocalicbengali;09E0 -rrvocalicdeva;0960 -rrvocalicgujarati;0AE0 -rrvocalicvowelsignbengali;09C4 -rrvocalicvowelsigndeva;0944 -rrvocalicvowelsigngujarati;0AC4 -rsuperior;F6F1 -rtblock;2590 -rturned;0279 -rturnedsuperior;02B4 -ruhiragana;308B -rukatakana;30EB -rukatakanahalfwidth;FF99 -rupeemarkbengali;09F2 -rupeesignbengali;09F3 -rupiah;F6DD -ruthai;0E24 -rvocalicbengali;098B -rvocalicdeva;090B -rvocalicgujarati;0A8B -rvocalicvowelsignbengali;09C3 -rvocalicvowelsigndeva;0943 -rvocalicvowelsigngujarati;0AC3 -s;0073 -sabengali;09B8 -sacute;015B -sacutedotaccent;1E65 -sadarabic;0635 -sadeva;0938 -sadfinalarabic;FEBA -sadinitialarabic;FEBB -sadmedialarabic;FEBC -sagujarati;0AB8 -sagurmukhi;0A38 -sahiragana;3055 -sakatakana;30B5 -sakatakanahalfwidth;FF7B -sallallahoualayhewasallamarabic;FDFA -samekh;05E1 -samekhdagesh;FB41 -samekhdageshhebrew;FB41 -samekhhebrew;05E1 -saraaathai;0E32 -saraaethai;0E41 -saraaimaimalaithai;0E44 -saraaimaimuanthai;0E43 -saraamthai;0E33 -saraathai;0E30 -saraethai;0E40 -saraiileftthai;F886 -saraiithai;0E35 -saraileftthai;F885 -saraithai;0E34 -saraothai;0E42 -saraueeleftthai;F888 -saraueethai;0E37 -saraueleftthai;F887 -sarauethai;0E36 -sarauthai;0E38 -sarauuthai;0E39 -sbopomofo;3119 -scaron;0161 -scarondotaccent;1E67 -scedilla;015F -schwa;0259 -schwacyrillic;04D9 -schwadieresiscyrillic;04DB -schwahook;025A -scircle;24E2 -scircumflex;015D -scommaaccent;0219 -sdotaccent;1E61 -sdotbelow;1E63 -sdotbelowdotaccent;1E69 -seagullbelowcmb;033C -second;2033 -secondtonechinese;02CA -section;00A7 -seenarabic;0633 -seenfinalarabic;FEB2 -seeninitialarabic;FEB3 -seenmedialarabic;FEB4 -segol;05B6 -segol13;05B6 -segol1f;05B6 -segol2c;05B6 -segolhebrew;05B6 -segolnarrowhebrew;05B6 -segolquarterhebrew;05B6 -segoltahebrew;0592 -segolwidehebrew;05B6 -seharmenian;057D -sehiragana;305B -sekatakana;30BB -sekatakanahalfwidth;FF7E -semicolon;003B -semicolonarabic;061B -semicolonmonospace;FF1B -semicolonsmall;FE54 -semivoicedmarkkana;309C -semivoicedmarkkanahalfwidth;FF9F -sentisquare;3322 -sentosquare;3323 -seven;0037 -sevenarabic;0667 -sevenbengali;09ED -sevencircle;2466 -sevencircleinversesansserif;2790 -sevendeva;096D -seveneighths;215E -sevengujarati;0AED -sevengurmukhi;0A6D -sevenhackarabic;0667 -sevenhangzhou;3027 -sevenideographicparen;3226 -seveninferior;2087 -sevenmonospace;FF17 -sevenoldstyle;F737 -sevenparen;247A -sevenperiod;248E -sevenpersian;06F7 -sevenroman;2176 -sevensuperior;2077 -seventeencircle;2470 -seventeenparen;2484 -seventeenperiod;2498 -seventhai;0E57 -sfthyphen;00AD -shaarmenian;0577 -shabengali;09B6 -shacyrillic;0448 -shaddaarabic;0651 -shaddadammaarabic;FC61 -shaddadammatanarabic;FC5E -shaddafathaarabic;FC60 -shaddafathatanarabic;0651 064B -shaddakasraarabic;FC62 -shaddakasratanarabic;FC5F -shade;2592 -shadedark;2593 -shadelight;2591 -shademedium;2592 -shadeva;0936 -shagujarati;0AB6 -shagurmukhi;0A36 -shalshelethebrew;0593 -shbopomofo;3115 -shchacyrillic;0449 -sheenarabic;0634 -sheenfinalarabic;FEB6 -sheeninitialarabic;FEB7 -sheenmedialarabic;FEB8 -sheicoptic;03E3 -sheqel;20AA -sheqelhebrew;20AA -sheva;05B0 -sheva115;05B0 -sheva15;05B0 -sheva22;05B0 -sheva2e;05B0 -shevahebrew;05B0 -shevanarrowhebrew;05B0 -shevaquarterhebrew;05B0 -shevawidehebrew;05B0 -shhacyrillic;04BB -shimacoptic;03ED -shin;05E9 -shindagesh;FB49 -shindageshhebrew;FB49 -shindageshshindot;FB2C -shindageshshindothebrew;FB2C -shindageshsindot;FB2D -shindageshsindothebrew;FB2D -shindothebrew;05C1 -shinhebrew;05E9 -shinshindot;FB2A -shinshindothebrew;FB2A -shinsindot;FB2B -shinsindothebrew;FB2B -shook;0282 -sigma;03C3 -sigma1;03C2 -sigmafinal;03C2 -sigmalunatesymbolgreek;03F2 -sihiragana;3057 -sikatakana;30B7 -sikatakanahalfwidth;FF7C -siluqhebrew;05BD -siluqlefthebrew;05BD -similar;223C -sindothebrew;05C2 -siosacirclekorean;3274 -siosaparenkorean;3214 -sioscieuckorean;317E -sioscirclekorean;3266 -sioskiyeokkorean;317A -sioskorean;3145 -siosnieunkorean;317B -siosparenkorean;3206 -siospieupkorean;317D -siostikeutkorean;317C -six;0036 -sixarabic;0666 -sixbengali;09EC -sixcircle;2465 -sixcircleinversesansserif;278F -sixdeva;096C -sixgujarati;0AEC -sixgurmukhi;0A6C -sixhackarabic;0666 -sixhangzhou;3026 -sixideographicparen;3225 -sixinferior;2086 -sixmonospace;FF16 -sixoldstyle;F736 -sixparen;2479 -sixperiod;248D -sixpersian;06F6 -sixroman;2175 -sixsuperior;2076 -sixteencircle;246F -sixteencurrencydenominatorbengali;09F9 -sixteenparen;2483 -sixteenperiod;2497 -sixthai;0E56 -slash;002F -slashmonospace;FF0F -slong;017F -slongdotaccent;1E9B -smileface;263A -smonospace;FF53 -sofpasuqhebrew;05C3 -softhyphen;00AD -softsigncyrillic;044C -sohiragana;305D -sokatakana;30BD -sokatakanahalfwidth;FF7F -soliduslongoverlaycmb;0338 -solidusshortoverlaycmb;0337 -sorusithai;0E29 -sosalathai;0E28 -sosothai;0E0B -sosuathai;0E2A -space;0020 -spacehackarabic;0020 -spade;2660 -spadesuitblack;2660 -spadesuitwhite;2664 -sparen;24AE -squarebelowcmb;033B -squarecc;33C4 -squarecm;339D -squarediagonalcrosshatchfill;25A9 -squarehorizontalfill;25A4 -squarekg;338F -squarekm;339E -squarekmcapital;33CE -squareln;33D1 -squarelog;33D2 -squaremg;338E -squaremil;33D5 -squaremm;339C -squaremsquared;33A1 -squareorthogonalcrosshatchfill;25A6 -squareupperlefttolowerrightfill;25A7 -squareupperrighttolowerleftfill;25A8 -squareverticalfill;25A5 -squarewhitewithsmallblack;25A3 -srsquare;33DB -ssabengali;09B7 -ssadeva;0937 -ssagujarati;0AB7 -ssangcieuckorean;3149 -ssanghieuhkorean;3185 -ssangieungkorean;3180 -ssangkiyeokkorean;3132 -ssangnieunkorean;3165 -ssangpieupkorean;3143 -ssangsioskorean;3146 -ssangtikeutkorean;3138 -ssuperior;F6F2 -sterling;00A3 -sterlingmonospace;FFE1 -strokelongoverlaycmb;0336 -strokeshortoverlaycmb;0335 -subset;2282 -subsetnotequal;228A -subsetorequal;2286 -succeeds;227B -suchthat;220B -suhiragana;3059 -sukatakana;30B9 -sukatakanahalfwidth;FF7D -sukunarabic;0652 -summation;2211 -sun;263C -superset;2283 -supersetnotequal;228B -supersetorequal;2287 -svsquare;33DC -syouwaerasquare;337C -t;0074 -tabengali;09A4 -tackdown;22A4 -tackleft;22A3 -tadeva;0924 -tagujarati;0AA4 -tagurmukhi;0A24 -taharabic;0637 -tahfinalarabic;FEC2 -tahinitialarabic;FEC3 -tahiragana;305F -tahmedialarabic;FEC4 -taisyouerasquare;337D -takatakana;30BF -takatakanahalfwidth;FF80 -tatweelarabic;0640 -tau;03C4 -tav;05EA -tavdages;FB4A -tavdagesh;FB4A -tavdageshhebrew;FB4A -tavhebrew;05EA -tbar;0167 -tbopomofo;310A -tcaron;0165 -tccurl;02A8 -tcedilla;0163 -tcheharabic;0686 -tchehfinalarabic;FB7B -tchehinitialarabic;FB7C -tchehmedialarabic;FB7D -tchehmeeminitialarabic;FB7C FEE4 -tcircle;24E3 -tcircumflexbelow;1E71 -tcommaaccent;0163 -tdieresis;1E97 -tdotaccent;1E6B -tdotbelow;1E6D -tecyrillic;0442 -tedescendercyrillic;04AD -teharabic;062A -tehfinalarabic;FE96 -tehhahinitialarabic;FCA2 -tehhahisolatedarabic;FC0C -tehinitialarabic;FE97 -tehiragana;3066 -tehjeeminitialarabic;FCA1 -tehjeemisolatedarabic;FC0B -tehmarbutaarabic;0629 -tehmarbutafinalarabic;FE94 -tehmedialarabic;FE98 -tehmeeminitialarabic;FCA4 -tehmeemisolatedarabic;FC0E -tehnoonfinalarabic;FC73 -tekatakana;30C6 -tekatakanahalfwidth;FF83 -telephone;2121 -telephoneblack;260E -telishagedolahebrew;05A0 -telishaqetanahebrew;05A9 -tencircle;2469 -tenideographicparen;3229 -tenparen;247D -tenperiod;2491 -tenroman;2179 -tesh;02A7 -tet;05D8 -tetdagesh;FB38 -tetdageshhebrew;FB38 -tethebrew;05D8 -tetsecyrillic;04B5 -tevirhebrew;059B -tevirlefthebrew;059B -thabengali;09A5 -thadeva;0925 -thagujarati;0AA5 -thagurmukhi;0A25 -thalarabic;0630 -thalfinalarabic;FEAC -thanthakhatlowleftthai;F898 -thanthakhatlowrightthai;F897 -thanthakhatthai;0E4C -thanthakhatupperleftthai;F896 -theharabic;062B -thehfinalarabic;FE9A -thehinitialarabic;FE9B -thehmedialarabic;FE9C -thereexists;2203 -therefore;2234 -theta;03B8 -theta1;03D1 -thetasymbolgreek;03D1 -thieuthacirclekorean;3279 -thieuthaparenkorean;3219 -thieuthcirclekorean;326B -thieuthkorean;314C -thieuthparenkorean;320B -thirteencircle;246C -thirteenparen;2480 -thirteenperiod;2494 -thonangmonthothai;0E11 -thook;01AD -thophuthaothai;0E12 -thorn;00FE -thothahanthai;0E17 -thothanthai;0E10 -thothongthai;0E18 -thothungthai;0E16 -thousandcyrillic;0482 -thousandsseparatorarabic;066C -thousandsseparatorpersian;066C -three;0033 -threearabic;0663 -threebengali;09E9 -threecircle;2462 -threecircleinversesansserif;278C -threedeva;0969 -threeeighths;215C -threegujarati;0AE9 -threegurmukhi;0A69 -threehackarabic;0663 -threehangzhou;3023 -threeideographicparen;3222 -threeinferior;2083 -threemonospace;FF13 -threenumeratorbengali;09F6 -threeoldstyle;F733 -threeparen;2476 -threeperiod;248A -threepersian;06F3 -threequarters;00BE -threequartersemdash;F6DE -threeroman;2172 -threesuperior;00B3 -threethai;0E53 -thzsquare;3394 -tihiragana;3061 -tikatakana;30C1 -tikatakanahalfwidth;FF81 -tikeutacirclekorean;3270 -tikeutaparenkorean;3210 -tikeutcirclekorean;3262 -tikeutkorean;3137 -tikeutparenkorean;3202 -tilde;02DC -tildebelowcmb;0330 -tildecmb;0303 -tildecomb;0303 -tildedoublecmb;0360 -tildeoperator;223C -tildeoverlaycmb;0334 -tildeverticalcmb;033E -timescircle;2297 -tipehahebrew;0596 -tipehalefthebrew;0596 -tippigurmukhi;0A70 -titlocyrilliccmb;0483 -tiwnarmenian;057F -tlinebelow;1E6F -tmonospace;FF54 -toarmenian;0569 -tohiragana;3068 -tokatakana;30C8 -tokatakanahalfwidth;FF84 -tonebarextrahighmod;02E5 -tonebarextralowmod;02E9 -tonebarhighmod;02E6 -tonebarlowmod;02E8 -tonebarmidmod;02E7 -tonefive;01BD -tonesix;0185 -tonetwo;01A8 -tonos;0384 -tonsquare;3327 -topatakthai;0E0F -tortoiseshellbracketleft;3014 -tortoiseshellbracketleftsmall;FE5D -tortoiseshellbracketleftvertical;FE39 -tortoiseshellbracketright;3015 -tortoiseshellbracketrightsmall;FE5E -tortoiseshellbracketrightvertical;FE3A -totaothai;0E15 -tpalatalhook;01AB -tparen;24AF -trademark;2122 -trademarksans;F8EA -trademarkserif;F6DB -tretroflexhook;0288 -triagdn;25BC -triaglf;25C4 -triagrt;25BA -triagup;25B2 -ts;02A6 -tsadi;05E6 -tsadidagesh;FB46 -tsadidageshhebrew;FB46 -tsadihebrew;05E6 -tsecyrillic;0446 -tsere;05B5 -tsere12;05B5 -tsere1e;05B5 -tsere2b;05B5 -tserehebrew;05B5 -tserenarrowhebrew;05B5 -tserequarterhebrew;05B5 -tserewidehebrew;05B5 -tshecyrillic;045B -tsuperior;F6F3 -ttabengali;099F -ttadeva;091F -ttagujarati;0A9F -ttagurmukhi;0A1F -tteharabic;0679 -ttehfinalarabic;FB67 -ttehinitialarabic;FB68 -ttehmedialarabic;FB69 -tthabengali;09A0 -tthadeva;0920 -tthagujarati;0AA0 -tthagurmukhi;0A20 -tturned;0287 -tuhiragana;3064 -tukatakana;30C4 -tukatakanahalfwidth;FF82 -tusmallhiragana;3063 -tusmallkatakana;30C3 -tusmallkatakanahalfwidth;FF6F -twelvecircle;246B -twelveparen;247F -twelveperiod;2493 -twelveroman;217B -twentycircle;2473 -twentyhangzhou;5344 -twentyparen;2487 -twentyperiod;249B -two;0032 -twoarabic;0662 -twobengali;09E8 -twocircle;2461 -twocircleinversesansserif;278B -twodeva;0968 -twodotenleader;2025 -twodotleader;2025 -twodotleadervertical;FE30 -twogujarati;0AE8 -twogurmukhi;0A68 -twohackarabic;0662 -twohangzhou;3022 -twoideographicparen;3221 -twoinferior;2082 -twomonospace;FF12 -twonumeratorbengali;09F5 -twooldstyle;F732 -twoparen;2475 -twoperiod;2489 -twopersian;06F2 -tworoman;2171 -twostroke;01BB -twosuperior;00B2 -twothai;0E52 -twothirds;2154 -u;0075 -uacute;00FA -ubar;0289 -ubengali;0989 -ubopomofo;3128 -ubreve;016D -ucaron;01D4 -ucircle;24E4 -ucircumflex;00FB -ucircumflexbelow;1E77 -ucyrillic;0443 -udattadeva;0951 -udblacute;0171 -udblgrave;0215 -udeva;0909 -udieresis;00FC -udieresisacute;01D8 -udieresisbelow;1E73 -udieresiscaron;01DA -udieresiscyrillic;04F1 -udieresisgrave;01DC -udieresismacron;01D6 -udotbelow;1EE5 -ugrave;00F9 -ugujarati;0A89 -ugurmukhi;0A09 -uhiragana;3046 -uhookabove;1EE7 -uhorn;01B0 -uhornacute;1EE9 -uhorndotbelow;1EF1 -uhorngrave;1EEB -uhornhookabove;1EED -uhorntilde;1EEF -uhungarumlaut;0171 -uhungarumlautcyrillic;04F3 -uinvertedbreve;0217 -ukatakana;30A6 -ukatakanahalfwidth;FF73 -ukcyrillic;0479 -ukorean;315C -umacron;016B -umacroncyrillic;04EF -umacrondieresis;1E7B -umatragurmukhi;0A41 -umonospace;FF55 -underscore;005F -underscoredbl;2017 -underscoremonospace;FF3F -underscorevertical;FE33 -underscorewavy;FE4F -union;222A -universal;2200 -uogonek;0173 -uparen;24B0 -upblock;2580 -upperdothebrew;05C4 -upsilon;03C5 -upsilondieresis;03CB -upsilondieresistonos;03B0 -upsilonlatin;028A -upsilontonos;03CD -uptackbelowcmb;031D -uptackmod;02D4 -uragurmukhi;0A73 -uring;016F -ushortcyrillic;045E -usmallhiragana;3045 -usmallkatakana;30A5 -usmallkatakanahalfwidth;FF69 -ustraightcyrillic;04AF -ustraightstrokecyrillic;04B1 -utilde;0169 -utildeacute;1E79 -utildebelow;1E75 -uubengali;098A -uudeva;090A -uugujarati;0A8A -uugurmukhi;0A0A -uumatragurmukhi;0A42 -uuvowelsignbengali;09C2 -uuvowelsigndeva;0942 -uuvowelsigngujarati;0AC2 -uvowelsignbengali;09C1 -uvowelsigndeva;0941 -uvowelsigngujarati;0AC1 -v;0076 -vadeva;0935 -vagujarati;0AB5 -vagurmukhi;0A35 -vakatakana;30F7 -vav;05D5 -vavdagesh;FB35 -vavdagesh65;FB35 -vavdageshhebrew;FB35 -vavhebrew;05D5 -vavholam;FB4B -vavholamhebrew;FB4B -vavvavhebrew;05F0 -vavyodhebrew;05F1 -vcircle;24E5 -vdotbelow;1E7F -vecyrillic;0432 -veharabic;06A4 -vehfinalarabic;FB6B -vehinitialarabic;FB6C -vehmedialarabic;FB6D -vekatakana;30F9 -venus;2640 -verticalbar;007C -verticallineabovecmb;030D -verticallinebelowcmb;0329 -verticallinelowmod;02CC -verticallinemod;02C8 -vewarmenian;057E -vhook;028B -vikatakana;30F8 -viramabengali;09CD -viramadeva;094D -viramagujarati;0ACD -visargabengali;0983 -visargadeva;0903 -visargagujarati;0A83 -vmonospace;FF56 -voarmenian;0578 -voicediterationhiragana;309E -voicediterationkatakana;30FE -voicedmarkkana;309B -voicedmarkkanahalfwidth;FF9E -vokatakana;30FA -vparen;24B1 -vtilde;1E7D -vturned;028C -vuhiragana;3094 -vukatakana;30F4 -w;0077 -wacute;1E83 -waekorean;3159 -wahiragana;308F -wakatakana;30EF -wakatakanahalfwidth;FF9C -wakorean;3158 -wasmallhiragana;308E -wasmallkatakana;30EE -wattosquare;3357 -wavedash;301C -wavyunderscorevertical;FE34 -wawarabic;0648 -wawfinalarabic;FEEE -wawhamzaabovearabic;0624 -wawhamzaabovefinalarabic;FE86 -wbsquare;33DD -wcircle;24E6 -wcircumflex;0175 -wdieresis;1E85 -wdotaccent;1E87 -wdotbelow;1E89 -wehiragana;3091 -weierstrass;2118 -wekatakana;30F1 -wekorean;315E -weokorean;315D -wgrave;1E81 -whitebullet;25E6 -whitecircle;25CB -whitecircleinverse;25D9 -whitecornerbracketleft;300E -whitecornerbracketleftvertical;FE43 -whitecornerbracketright;300F -whitecornerbracketrightvertical;FE44 -whitediamond;25C7 -whitediamondcontainingblacksmalldiamond;25C8 -whitedownpointingsmalltriangle;25BF -whitedownpointingtriangle;25BD -whiteleftpointingsmalltriangle;25C3 -whiteleftpointingtriangle;25C1 -whitelenticularbracketleft;3016 -whitelenticularbracketright;3017 -whiterightpointingsmalltriangle;25B9 -whiterightpointingtriangle;25B7 -whitesmallsquare;25AB -whitesmilingface;263A -whitesquare;25A1 -whitestar;2606 -whitetelephone;260F -whitetortoiseshellbracketleft;3018 -whitetortoiseshellbracketright;3019 -whiteuppointingsmalltriangle;25B5 -whiteuppointingtriangle;25B3 -wihiragana;3090 -wikatakana;30F0 -wikorean;315F -wmonospace;FF57 -wohiragana;3092 -wokatakana;30F2 -wokatakanahalfwidth;FF66 -won;20A9 -wonmonospace;FFE6 -wowaenthai;0E27 -wparen;24B2 -wring;1E98 -wsuperior;02B7 -wturned;028D -wynn;01BF -x;0078 -xabovecmb;033D -xbopomofo;3112 -xcircle;24E7 -xdieresis;1E8D -xdotaccent;1E8B -xeharmenian;056D -xi;03BE -xmonospace;FF58 -xparen;24B3 -xsuperior;02E3 -y;0079 -yaadosquare;334E -yabengali;09AF -yacute;00FD -yadeva;092F -yaekorean;3152 -yagujarati;0AAF -yagurmukhi;0A2F -yahiragana;3084 -yakatakana;30E4 -yakatakanahalfwidth;FF94 -yakorean;3151 -yamakkanthai;0E4E -yasmallhiragana;3083 -yasmallkatakana;30E3 -yasmallkatakanahalfwidth;FF6C -yatcyrillic;0463 -ycircle;24E8 -ycircumflex;0177 -ydieresis;00FF -ydotaccent;1E8F -ydotbelow;1EF5 -yeharabic;064A -yehbarreearabic;06D2 -yehbarreefinalarabic;FBAF -yehfinalarabic;FEF2 -yehhamzaabovearabic;0626 -yehhamzaabovefinalarabic;FE8A -yehhamzaaboveinitialarabic;FE8B -yehhamzaabovemedialarabic;FE8C -yehinitialarabic;FEF3 -yehmedialarabic;FEF4 -yehmeeminitialarabic;FCDD -yehmeemisolatedarabic;FC58 -yehnoonfinalarabic;FC94 -yehthreedotsbelowarabic;06D1 -yekorean;3156 -yen;00A5 -yenmonospace;FFE5 -yeokorean;3155 -yeorinhieuhkorean;3186 -yerahbenyomohebrew;05AA -yerahbenyomolefthebrew;05AA -yericyrillic;044B -yerudieresiscyrillic;04F9 -yesieungkorean;3181 -yesieungpansioskorean;3183 -yesieungsioskorean;3182 -yetivhebrew;059A -ygrave;1EF3 -yhook;01B4 -yhookabove;1EF7 -yiarmenian;0575 -yicyrillic;0457 -yikorean;3162 -yinyang;262F -yiwnarmenian;0582 -ymonospace;FF59 -yod;05D9 -yoddagesh;FB39 -yoddageshhebrew;FB39 -yodhebrew;05D9 -yodyodhebrew;05F2 -yodyodpatahhebrew;FB1F -yohiragana;3088 -yoikorean;3189 -yokatakana;30E8 -yokatakanahalfwidth;FF96 -yokorean;315B -yosmallhiragana;3087 -yosmallkatakana;30E7 -yosmallkatakanahalfwidth;FF6E -yotgreek;03F3 -yoyaekorean;3188 -yoyakorean;3187 -yoyakthai;0E22 -yoyingthai;0E0D -yparen;24B4 -ypogegrammeni;037A -ypogegrammenigreekcmb;0345 -yr;01A6 -yring;1E99 -ysuperior;02B8 -ytilde;1EF9 -yturned;028E -yuhiragana;3086 -yuikorean;318C -yukatakana;30E6 -yukatakanahalfwidth;FF95 -yukorean;3160 -yusbigcyrillic;046B -yusbigiotifiedcyrillic;046D -yuslittlecyrillic;0467 -yuslittleiotifiedcyrillic;0469 -yusmallhiragana;3085 -yusmallkatakana;30E5 -yusmallkatakanahalfwidth;FF6D -yuyekorean;318B -yuyeokorean;318A -yyabengali;09DF -yyadeva;095F -z;007A -zaarmenian;0566 -zacute;017A -zadeva;095B -zagurmukhi;0A5B -zaharabic;0638 -zahfinalarabic;FEC6 -zahinitialarabic;FEC7 -zahiragana;3056 -zahmedialarabic;FEC8 -zainarabic;0632 -zainfinalarabic;FEB0 -zakatakana;30B6 -zaqefgadolhebrew;0595 -zaqefqatanhebrew;0594 -zarqahebrew;0598 -zayin;05D6 -zayindagesh;FB36 -zayindageshhebrew;FB36 -zayinhebrew;05D6 -zbopomofo;3117 -zcaron;017E -zcircle;24E9 -zcircumflex;1E91 -zcurl;0291 -zdot;017C -zdotaccent;017C -zdotbelow;1E93 -zecyrillic;0437 -zedescendercyrillic;0499 -zedieresiscyrillic;04DF -zehiragana;305C -zekatakana;30BC -zero;0030 -zeroarabic;0660 -zerobengali;09E6 -zerodeva;0966 -zerogujarati;0AE6 -zerogurmukhi;0A66 -zerohackarabic;0660 -zeroinferior;2080 -zeromonospace;FF10 -zerooldstyle;F730 -zeropersian;06F0 -zerosuperior;2070 -zerothai;0E50 -zerowidthjoiner;FEFF -zerowidthnonjoiner;200C -zerowidthspace;200B -zeta;03B6 -zhbopomofo;3113 -zhearmenian;056A -zhebrevecyrillic;04C2 -zhecyrillic;0436 -zhedescendercyrillic;0497 -zhedieresiscyrillic;04DD -zihiragana;3058 -zikatakana;30B8 -zinorhebrew;05AE -zlinebelow;1E95 -zmonospace;FF5A -zohiragana;305E -zokatakana;30BE -zparen;24B5 -zretroflexhook;0290 -zstroke;01B6 -zuhiragana;305A -zukatakana;30BA -# END -""" - - -_aglfnText = """\ -# ----------------------------------------------------------- -# Copyright 2002-2019 Adobe (http://www.adobe.com/). -# -# Redistribution and use in source and binary forms, with or -# without modification, are permitted provided that the -# following conditions are met: -# -# Redistributions of source code must retain the above -# copyright notice, this list of conditions and the following -# disclaimer. -# -# Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following -# disclaimer in the documentation and/or other materials -# provided with the distribution. -# -# Neither the name of Adobe nor the names of its contributors -# may be used to endorse or promote products derived from this -# software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND -# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# ----------------------------------------------------------- -# Name: Adobe Glyph List For New Fonts -# Table version: 1.7 -# Date: November 6, 2008 -# URL: https://github.com/adobe-type-tools/agl-aglfn -# -# Description: -# -# AGLFN (Adobe Glyph List For New Fonts) provides a list of base glyph -# names that are recommended for new fonts, which are compatible with -# the AGL (Adobe Glyph List) Specification, and which should be used -# as described in Section 6 of that document. AGLFN comprises the set -# of glyph names from AGL that map via the AGL Specification rules to -# the semantically correct UV (Unicode Value). For example, "Asmall" -# is omitted because AGL maps this glyph name to the PUA (Private Use -# Area) value U+F761, rather than to the UV that maps from the glyph -# name "A." Also omitted is "ffi," because AGL maps this to the -# Alphabetic Presentation Forms value U+FB03, rather than decomposing -# it into the following sequence of three UVs: U+0066, U+0066, and -# U+0069. The name "arrowvertex" has been omitted because this glyph -# now has a real UV, and AGL is now incorrect in mapping it to the PUA -# value U+F8E6. If you do not find an appropriate name for your glyph -# in this list, then please refer to Section 6 of the AGL -# Specification. -# -# Format: three semicolon-delimited fields: -# (1) Standard UV or CUS UV--four uppercase hexadecimal digits -# (2) Glyph name--upper/lowercase letters and digits -# (3) Character names: Unicode character names for standard UVs, and -# descriptive names for CUS UVs--uppercase letters, hyphen, and -# space -# -# The records are sorted by glyph name in increasing ASCII order, -# entries with the same glyph name are sorted in decreasing priority -# order, the UVs and Unicode character names are provided for -# convenience, lines starting with "#" are comments, and blank lines -# should be ignored. -# -# Revision History: -# -# 1.7 [6 November 2008] -# - Reverted to the original 1.4 and earlier mappings for Delta, -# Omega, and mu. -# - Removed mappings for "afii" names. These should now be assigned -# "uni" names. -# - Removed mappings for "commaaccent" names. These should now be -# assigned "uni" names. -# -# 1.6 [30 January 2006] -# - Completed work intended in 1.5. -# -# 1.5 [23 November 2005] -# - Removed duplicated block at end of file. -# - Changed mappings: -# 2206;Delta;INCREMENT changed to 0394;Delta;GREEK CAPITAL LETTER DELTA -# 2126;Omega;OHM SIGN changed to 03A9;Omega;GREEK CAPITAL LETTER OMEGA -# 03BC;mu;MICRO SIGN changed to 03BC;mu;GREEK SMALL LETTER MU -# - Corrected statement above about why "ffi" is omitted. -# -# 1.4 [24 September 2003] -# - Changed version to 1.4, to avoid confusion with the AGL 1.3. -# - Fixed spelling errors in the header. -# - Fully removed "arrowvertex," as it is mapped only to a PUA Unicode -# value in some fonts. -# -# 1.1 [17 April 2003] -# - Renamed [Tt]cedilla back to [Tt]commaaccent. -# -# 1.0 [31 January 2003] -# - Original version. -# - Derived from the AGLv1.2 by: -# removing the PUA area codes; -# removing duplicate Unicode mappings; and -# renaming "tcommaaccent" to "tcedilla" and "Tcommaaccent" to "Tcedilla" -# -0041;A;LATIN CAPITAL LETTER A -00C6;AE;LATIN CAPITAL LETTER AE -01FC;AEacute;LATIN CAPITAL LETTER AE WITH ACUTE -00C1;Aacute;LATIN CAPITAL LETTER A WITH ACUTE -0102;Abreve;LATIN CAPITAL LETTER A WITH BREVE -00C2;Acircumflex;LATIN CAPITAL LETTER A WITH CIRCUMFLEX -00C4;Adieresis;LATIN CAPITAL LETTER A WITH DIAERESIS -00C0;Agrave;LATIN CAPITAL LETTER A WITH GRAVE -0391;Alpha;GREEK CAPITAL LETTER ALPHA -0386;Alphatonos;GREEK CAPITAL LETTER ALPHA WITH TONOS -0100;Amacron;LATIN CAPITAL LETTER A WITH MACRON -0104;Aogonek;LATIN CAPITAL LETTER A WITH OGONEK -00C5;Aring;LATIN CAPITAL LETTER A WITH RING ABOVE -01FA;Aringacute;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE -00C3;Atilde;LATIN CAPITAL LETTER A WITH TILDE -0042;B;LATIN CAPITAL LETTER B -0392;Beta;GREEK CAPITAL LETTER BETA -0043;C;LATIN CAPITAL LETTER C -0106;Cacute;LATIN CAPITAL LETTER C WITH ACUTE -010C;Ccaron;LATIN CAPITAL LETTER C WITH CARON -00C7;Ccedilla;LATIN CAPITAL LETTER C WITH CEDILLA -0108;Ccircumflex;LATIN CAPITAL LETTER C WITH CIRCUMFLEX -010A;Cdotaccent;LATIN CAPITAL LETTER C WITH DOT ABOVE -03A7;Chi;GREEK CAPITAL LETTER CHI -0044;D;LATIN CAPITAL LETTER D -010E;Dcaron;LATIN CAPITAL LETTER D WITH CARON -0110;Dcroat;LATIN CAPITAL LETTER D WITH STROKE -2206;Delta;INCREMENT -0045;E;LATIN CAPITAL LETTER E -00C9;Eacute;LATIN CAPITAL LETTER E WITH ACUTE -0114;Ebreve;LATIN CAPITAL LETTER E WITH BREVE -011A;Ecaron;LATIN CAPITAL LETTER E WITH CARON -00CA;Ecircumflex;LATIN CAPITAL LETTER E WITH CIRCUMFLEX -00CB;Edieresis;LATIN CAPITAL LETTER E WITH DIAERESIS -0116;Edotaccent;LATIN CAPITAL LETTER E WITH DOT ABOVE -00C8;Egrave;LATIN CAPITAL LETTER E WITH GRAVE -0112;Emacron;LATIN CAPITAL LETTER E WITH MACRON -014A;Eng;LATIN CAPITAL LETTER ENG -0118;Eogonek;LATIN CAPITAL LETTER E WITH OGONEK -0395;Epsilon;GREEK CAPITAL LETTER EPSILON -0388;Epsilontonos;GREEK CAPITAL LETTER EPSILON WITH TONOS -0397;Eta;GREEK CAPITAL LETTER ETA -0389;Etatonos;GREEK CAPITAL LETTER ETA WITH TONOS -00D0;Eth;LATIN CAPITAL LETTER ETH -20AC;Euro;EURO SIGN -0046;F;LATIN CAPITAL LETTER F -0047;G;LATIN CAPITAL LETTER G -0393;Gamma;GREEK CAPITAL LETTER GAMMA -011E;Gbreve;LATIN CAPITAL LETTER G WITH BREVE -01E6;Gcaron;LATIN CAPITAL LETTER G WITH CARON -011C;Gcircumflex;LATIN CAPITAL LETTER G WITH CIRCUMFLEX -0120;Gdotaccent;LATIN CAPITAL LETTER G WITH DOT ABOVE -0048;H;LATIN CAPITAL LETTER H -25CF;H18533;BLACK CIRCLE -25AA;H18543;BLACK SMALL SQUARE -25AB;H18551;WHITE SMALL SQUARE -25A1;H22073;WHITE SQUARE -0126;Hbar;LATIN CAPITAL LETTER H WITH STROKE -0124;Hcircumflex;LATIN CAPITAL LETTER H WITH CIRCUMFLEX -0049;I;LATIN CAPITAL LETTER I -0132;IJ;LATIN CAPITAL LIGATURE IJ -00CD;Iacute;LATIN CAPITAL LETTER I WITH ACUTE -012C;Ibreve;LATIN CAPITAL LETTER I WITH BREVE -00CE;Icircumflex;LATIN CAPITAL LETTER I WITH CIRCUMFLEX -00CF;Idieresis;LATIN CAPITAL LETTER I WITH DIAERESIS -0130;Idotaccent;LATIN CAPITAL LETTER I WITH DOT ABOVE -2111;Ifraktur;BLACK-LETTER CAPITAL I -00CC;Igrave;LATIN CAPITAL LETTER I WITH GRAVE -012A;Imacron;LATIN CAPITAL LETTER I WITH MACRON -012E;Iogonek;LATIN CAPITAL LETTER I WITH OGONEK -0399;Iota;GREEK CAPITAL LETTER IOTA -03AA;Iotadieresis;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA -038A;Iotatonos;GREEK CAPITAL LETTER IOTA WITH TONOS -0128;Itilde;LATIN CAPITAL LETTER I WITH TILDE -004A;J;LATIN CAPITAL LETTER J -0134;Jcircumflex;LATIN CAPITAL LETTER J WITH CIRCUMFLEX -004B;K;LATIN CAPITAL LETTER K -039A;Kappa;GREEK CAPITAL LETTER KAPPA -004C;L;LATIN CAPITAL LETTER L -0139;Lacute;LATIN CAPITAL LETTER L WITH ACUTE -039B;Lambda;GREEK CAPITAL LETTER LAMDA -013D;Lcaron;LATIN CAPITAL LETTER L WITH CARON -013F;Ldot;LATIN CAPITAL LETTER L WITH MIDDLE DOT -0141;Lslash;LATIN CAPITAL LETTER L WITH STROKE -004D;M;LATIN CAPITAL LETTER M -039C;Mu;GREEK CAPITAL LETTER MU -004E;N;LATIN CAPITAL LETTER N -0143;Nacute;LATIN CAPITAL LETTER N WITH ACUTE -0147;Ncaron;LATIN CAPITAL LETTER N WITH CARON -00D1;Ntilde;LATIN CAPITAL LETTER N WITH TILDE -039D;Nu;GREEK CAPITAL LETTER NU -004F;O;LATIN CAPITAL LETTER O -0152;OE;LATIN CAPITAL LIGATURE OE -00D3;Oacute;LATIN CAPITAL LETTER O WITH ACUTE -014E;Obreve;LATIN CAPITAL LETTER O WITH BREVE -00D4;Ocircumflex;LATIN CAPITAL LETTER O WITH CIRCUMFLEX -00D6;Odieresis;LATIN CAPITAL LETTER O WITH DIAERESIS -00D2;Ograve;LATIN CAPITAL LETTER O WITH GRAVE -01A0;Ohorn;LATIN CAPITAL LETTER O WITH HORN -0150;Ohungarumlaut;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE -014C;Omacron;LATIN CAPITAL LETTER O WITH MACRON -2126;Omega;OHM SIGN -038F;Omegatonos;GREEK CAPITAL LETTER OMEGA WITH TONOS -039F;Omicron;GREEK CAPITAL LETTER OMICRON -038C;Omicrontonos;GREEK CAPITAL LETTER OMICRON WITH TONOS -00D8;Oslash;LATIN CAPITAL LETTER O WITH STROKE -01FE;Oslashacute;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE -00D5;Otilde;LATIN CAPITAL LETTER O WITH TILDE -0050;P;LATIN CAPITAL LETTER P -03A6;Phi;GREEK CAPITAL LETTER PHI -03A0;Pi;GREEK CAPITAL LETTER PI -03A8;Psi;GREEK CAPITAL LETTER PSI -0051;Q;LATIN CAPITAL LETTER Q -0052;R;LATIN CAPITAL LETTER R -0154;Racute;LATIN CAPITAL LETTER R WITH ACUTE -0158;Rcaron;LATIN CAPITAL LETTER R WITH CARON -211C;Rfraktur;BLACK-LETTER CAPITAL R -03A1;Rho;GREEK CAPITAL LETTER RHO -0053;S;LATIN CAPITAL LETTER S -250C;SF010000;BOX DRAWINGS LIGHT DOWN AND RIGHT -2514;SF020000;BOX DRAWINGS LIGHT UP AND RIGHT -2510;SF030000;BOX DRAWINGS LIGHT DOWN AND LEFT -2518;SF040000;BOX DRAWINGS LIGHT UP AND LEFT -253C;SF050000;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL -252C;SF060000;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL -2534;SF070000;BOX DRAWINGS LIGHT UP AND HORIZONTAL -251C;SF080000;BOX DRAWINGS LIGHT VERTICAL AND RIGHT -2524;SF090000;BOX DRAWINGS LIGHT VERTICAL AND LEFT -2500;SF100000;BOX DRAWINGS LIGHT HORIZONTAL -2502;SF110000;BOX DRAWINGS LIGHT VERTICAL -2561;SF190000;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE -2562;SF200000;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE -2556;SF210000;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE -2555;SF220000;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE -2563;SF230000;BOX DRAWINGS DOUBLE VERTICAL AND LEFT -2551;SF240000;BOX DRAWINGS DOUBLE VERTICAL -2557;SF250000;BOX DRAWINGS DOUBLE DOWN AND LEFT -255D;SF260000;BOX DRAWINGS DOUBLE UP AND LEFT -255C;SF270000;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE -255B;SF280000;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE -255E;SF360000;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE -255F;SF370000;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE -255A;SF380000;BOX DRAWINGS DOUBLE UP AND RIGHT -2554;SF390000;BOX DRAWINGS DOUBLE DOWN AND RIGHT -2569;SF400000;BOX DRAWINGS DOUBLE UP AND HORIZONTAL -2566;SF410000;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL -2560;SF420000;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT -2550;SF430000;BOX DRAWINGS DOUBLE HORIZONTAL -256C;SF440000;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL -2567;SF450000;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE -2568;SF460000;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE -2564;SF470000;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE -2565;SF480000;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE -2559;SF490000;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE -2558;SF500000;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE -2552;SF510000;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE -2553;SF520000;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE -256B;SF530000;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE -256A;SF540000;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE -015A;Sacute;LATIN CAPITAL LETTER S WITH ACUTE -0160;Scaron;LATIN CAPITAL LETTER S WITH CARON -015E;Scedilla;LATIN CAPITAL LETTER S WITH CEDILLA -015C;Scircumflex;LATIN CAPITAL LETTER S WITH CIRCUMFLEX -03A3;Sigma;GREEK CAPITAL LETTER SIGMA -0054;T;LATIN CAPITAL LETTER T -03A4;Tau;GREEK CAPITAL LETTER TAU -0166;Tbar;LATIN CAPITAL LETTER T WITH STROKE -0164;Tcaron;LATIN CAPITAL LETTER T WITH CARON -0398;Theta;GREEK CAPITAL LETTER THETA -00DE;Thorn;LATIN CAPITAL LETTER THORN -0055;U;LATIN CAPITAL LETTER U -00DA;Uacute;LATIN CAPITAL LETTER U WITH ACUTE -016C;Ubreve;LATIN CAPITAL LETTER U WITH BREVE -00DB;Ucircumflex;LATIN CAPITAL LETTER U WITH CIRCUMFLEX -00DC;Udieresis;LATIN CAPITAL LETTER U WITH DIAERESIS -00D9;Ugrave;LATIN CAPITAL LETTER U WITH GRAVE -01AF;Uhorn;LATIN CAPITAL LETTER U WITH HORN -0170;Uhungarumlaut;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE -016A;Umacron;LATIN CAPITAL LETTER U WITH MACRON -0172;Uogonek;LATIN CAPITAL LETTER U WITH OGONEK -03A5;Upsilon;GREEK CAPITAL LETTER UPSILON -03D2;Upsilon1;GREEK UPSILON WITH HOOK SYMBOL -03AB;Upsilondieresis;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA -038E;Upsilontonos;GREEK CAPITAL LETTER UPSILON WITH TONOS -016E;Uring;LATIN CAPITAL LETTER U WITH RING ABOVE -0168;Utilde;LATIN CAPITAL LETTER U WITH TILDE -0056;V;LATIN CAPITAL LETTER V -0057;W;LATIN CAPITAL LETTER W -1E82;Wacute;LATIN CAPITAL LETTER W WITH ACUTE -0174;Wcircumflex;LATIN CAPITAL LETTER W WITH CIRCUMFLEX -1E84;Wdieresis;LATIN CAPITAL LETTER W WITH DIAERESIS -1E80;Wgrave;LATIN CAPITAL LETTER W WITH GRAVE -0058;X;LATIN CAPITAL LETTER X -039E;Xi;GREEK CAPITAL LETTER XI -0059;Y;LATIN CAPITAL LETTER Y -00DD;Yacute;LATIN CAPITAL LETTER Y WITH ACUTE -0176;Ycircumflex;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX -0178;Ydieresis;LATIN CAPITAL LETTER Y WITH DIAERESIS -1EF2;Ygrave;LATIN CAPITAL LETTER Y WITH GRAVE -005A;Z;LATIN CAPITAL LETTER Z -0179;Zacute;LATIN CAPITAL LETTER Z WITH ACUTE -017D;Zcaron;LATIN CAPITAL LETTER Z WITH CARON -017B;Zdotaccent;LATIN CAPITAL LETTER Z WITH DOT ABOVE -0396;Zeta;GREEK CAPITAL LETTER ZETA -0061;a;LATIN SMALL LETTER A -00E1;aacute;LATIN SMALL LETTER A WITH ACUTE -0103;abreve;LATIN SMALL LETTER A WITH BREVE -00E2;acircumflex;LATIN SMALL LETTER A WITH CIRCUMFLEX -00B4;acute;ACUTE ACCENT -0301;acutecomb;COMBINING ACUTE ACCENT -00E4;adieresis;LATIN SMALL LETTER A WITH DIAERESIS -00E6;ae;LATIN SMALL LETTER AE -01FD;aeacute;LATIN SMALL LETTER AE WITH ACUTE -00E0;agrave;LATIN SMALL LETTER A WITH GRAVE -2135;aleph;ALEF SYMBOL -03B1;alpha;GREEK SMALL LETTER ALPHA -03AC;alphatonos;GREEK SMALL LETTER ALPHA WITH TONOS -0101;amacron;LATIN SMALL LETTER A WITH MACRON -0026;ampersand;AMPERSAND -2220;angle;ANGLE -2329;angleleft;LEFT-POINTING ANGLE BRACKET -232A;angleright;RIGHT-POINTING ANGLE BRACKET -0387;anoteleia;GREEK ANO TELEIA -0105;aogonek;LATIN SMALL LETTER A WITH OGONEK -2248;approxequal;ALMOST EQUAL TO -00E5;aring;LATIN SMALL LETTER A WITH RING ABOVE -01FB;aringacute;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE -2194;arrowboth;LEFT RIGHT ARROW -21D4;arrowdblboth;LEFT RIGHT DOUBLE ARROW -21D3;arrowdbldown;DOWNWARDS DOUBLE ARROW -21D0;arrowdblleft;LEFTWARDS DOUBLE ARROW -21D2;arrowdblright;RIGHTWARDS DOUBLE ARROW -21D1;arrowdblup;UPWARDS DOUBLE ARROW -2193;arrowdown;DOWNWARDS ARROW -2190;arrowleft;LEFTWARDS ARROW -2192;arrowright;RIGHTWARDS ARROW -2191;arrowup;UPWARDS ARROW -2195;arrowupdn;UP DOWN ARROW -21A8;arrowupdnbse;UP DOWN ARROW WITH BASE -005E;asciicircum;CIRCUMFLEX ACCENT -007E;asciitilde;TILDE -002A;asterisk;ASTERISK -2217;asteriskmath;ASTERISK OPERATOR -0040;at;COMMERCIAL AT -00E3;atilde;LATIN SMALL LETTER A WITH TILDE -0062;b;LATIN SMALL LETTER B -005C;backslash;REVERSE SOLIDUS -007C;bar;VERTICAL LINE -03B2;beta;GREEK SMALL LETTER BETA -2588;block;FULL BLOCK -007B;braceleft;LEFT CURLY BRACKET -007D;braceright;RIGHT CURLY BRACKET -005B;bracketleft;LEFT SQUARE BRACKET -005D;bracketright;RIGHT SQUARE BRACKET -02D8;breve;BREVE -00A6;brokenbar;BROKEN BAR -2022;bullet;BULLET -0063;c;LATIN SMALL LETTER C -0107;cacute;LATIN SMALL LETTER C WITH ACUTE -02C7;caron;CARON -21B5;carriagereturn;DOWNWARDS ARROW WITH CORNER LEFTWARDS -010D;ccaron;LATIN SMALL LETTER C WITH CARON -00E7;ccedilla;LATIN SMALL LETTER C WITH CEDILLA -0109;ccircumflex;LATIN SMALL LETTER C WITH CIRCUMFLEX -010B;cdotaccent;LATIN SMALL LETTER C WITH DOT ABOVE -00B8;cedilla;CEDILLA -00A2;cent;CENT SIGN -03C7;chi;GREEK SMALL LETTER CHI -25CB;circle;WHITE CIRCLE -2297;circlemultiply;CIRCLED TIMES -2295;circleplus;CIRCLED PLUS -02C6;circumflex;MODIFIER LETTER CIRCUMFLEX ACCENT -2663;club;BLACK CLUB SUIT -003A;colon;COLON -20A1;colonmonetary;COLON SIGN -002C;comma;COMMA -2245;congruent;APPROXIMATELY EQUAL TO -00A9;copyright;COPYRIGHT SIGN -00A4;currency;CURRENCY SIGN -0064;d;LATIN SMALL LETTER D -2020;dagger;DAGGER -2021;daggerdbl;DOUBLE DAGGER -010F;dcaron;LATIN SMALL LETTER D WITH CARON -0111;dcroat;LATIN SMALL LETTER D WITH STROKE -00B0;degree;DEGREE SIGN -03B4;delta;GREEK SMALL LETTER DELTA -2666;diamond;BLACK DIAMOND SUIT -00A8;dieresis;DIAERESIS -0385;dieresistonos;GREEK DIALYTIKA TONOS -00F7;divide;DIVISION SIGN -2593;dkshade;DARK SHADE -2584;dnblock;LOWER HALF BLOCK -0024;dollar;DOLLAR SIGN -20AB;dong;DONG SIGN -02D9;dotaccent;DOT ABOVE -0323;dotbelowcomb;COMBINING DOT BELOW -0131;dotlessi;LATIN SMALL LETTER DOTLESS I -22C5;dotmath;DOT OPERATOR -0065;e;LATIN SMALL LETTER E -00E9;eacute;LATIN SMALL LETTER E WITH ACUTE -0115;ebreve;LATIN SMALL LETTER E WITH BREVE -011B;ecaron;LATIN SMALL LETTER E WITH CARON -00EA;ecircumflex;LATIN SMALL LETTER E WITH CIRCUMFLEX -00EB;edieresis;LATIN SMALL LETTER E WITH DIAERESIS -0117;edotaccent;LATIN SMALL LETTER E WITH DOT ABOVE -00E8;egrave;LATIN SMALL LETTER E WITH GRAVE -0038;eight;DIGIT EIGHT -2208;element;ELEMENT OF -2026;ellipsis;HORIZONTAL ELLIPSIS -0113;emacron;LATIN SMALL LETTER E WITH MACRON -2014;emdash;EM DASH -2205;emptyset;EMPTY SET -2013;endash;EN DASH -014B;eng;LATIN SMALL LETTER ENG -0119;eogonek;LATIN SMALL LETTER E WITH OGONEK -03B5;epsilon;GREEK SMALL LETTER EPSILON -03AD;epsilontonos;GREEK SMALL LETTER EPSILON WITH TONOS -003D;equal;EQUALS SIGN -2261;equivalence;IDENTICAL TO -212E;estimated;ESTIMATED SYMBOL -03B7;eta;GREEK SMALL LETTER ETA -03AE;etatonos;GREEK SMALL LETTER ETA WITH TONOS -00F0;eth;LATIN SMALL LETTER ETH -0021;exclam;EXCLAMATION MARK -203C;exclamdbl;DOUBLE EXCLAMATION MARK -00A1;exclamdown;INVERTED EXCLAMATION MARK -2203;existential;THERE EXISTS -0066;f;LATIN SMALL LETTER F -2640;female;FEMALE SIGN -2012;figuredash;FIGURE DASH -25A0;filledbox;BLACK SQUARE -25AC;filledrect;BLACK RECTANGLE -0035;five;DIGIT FIVE -215D;fiveeighths;VULGAR FRACTION FIVE EIGHTHS -0192;florin;LATIN SMALL LETTER F WITH HOOK -0034;four;DIGIT FOUR -2044;fraction;FRACTION SLASH -20A3;franc;FRENCH FRANC SIGN -0067;g;LATIN SMALL LETTER G -03B3;gamma;GREEK SMALL LETTER GAMMA -011F;gbreve;LATIN SMALL LETTER G WITH BREVE -01E7;gcaron;LATIN SMALL LETTER G WITH CARON -011D;gcircumflex;LATIN SMALL LETTER G WITH CIRCUMFLEX -0121;gdotaccent;LATIN SMALL LETTER G WITH DOT ABOVE -00DF;germandbls;LATIN SMALL LETTER SHARP S -2207;gradient;NABLA -0060;grave;GRAVE ACCENT -0300;gravecomb;COMBINING GRAVE ACCENT -003E;greater;GREATER-THAN SIGN -2265;greaterequal;GREATER-THAN OR EQUAL TO -00AB;guillemotleft;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -00BB;guillemotright;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -2039;guilsinglleft;SINGLE LEFT-POINTING ANGLE QUOTATION MARK -203A;guilsinglright;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -0068;h;LATIN SMALL LETTER H -0127;hbar;LATIN SMALL LETTER H WITH STROKE -0125;hcircumflex;LATIN SMALL LETTER H WITH CIRCUMFLEX -2665;heart;BLACK HEART SUIT -0309;hookabovecomb;COMBINING HOOK ABOVE -2302;house;HOUSE -02DD;hungarumlaut;DOUBLE ACUTE ACCENT -002D;hyphen;HYPHEN-MINUS -0069;i;LATIN SMALL LETTER I -00ED;iacute;LATIN SMALL LETTER I WITH ACUTE -012D;ibreve;LATIN SMALL LETTER I WITH BREVE -00EE;icircumflex;LATIN SMALL LETTER I WITH CIRCUMFLEX -00EF;idieresis;LATIN SMALL LETTER I WITH DIAERESIS -00EC;igrave;LATIN SMALL LETTER I WITH GRAVE -0133;ij;LATIN SMALL LIGATURE IJ -012B;imacron;LATIN SMALL LETTER I WITH MACRON -221E;infinity;INFINITY -222B;integral;INTEGRAL -2321;integralbt;BOTTOM HALF INTEGRAL -2320;integraltp;TOP HALF INTEGRAL -2229;intersection;INTERSECTION -25D8;invbullet;INVERSE BULLET -25D9;invcircle;INVERSE WHITE CIRCLE -263B;invsmileface;BLACK SMILING FACE -012F;iogonek;LATIN SMALL LETTER I WITH OGONEK -03B9;iota;GREEK SMALL LETTER IOTA -03CA;iotadieresis;GREEK SMALL LETTER IOTA WITH DIALYTIKA -0390;iotadieresistonos;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS -03AF;iotatonos;GREEK SMALL LETTER IOTA WITH TONOS -0129;itilde;LATIN SMALL LETTER I WITH TILDE -006A;j;LATIN SMALL LETTER J -0135;jcircumflex;LATIN SMALL LETTER J WITH CIRCUMFLEX -006B;k;LATIN SMALL LETTER K -03BA;kappa;GREEK SMALL LETTER KAPPA -0138;kgreenlandic;LATIN SMALL LETTER KRA -006C;l;LATIN SMALL LETTER L -013A;lacute;LATIN SMALL LETTER L WITH ACUTE -03BB;lambda;GREEK SMALL LETTER LAMDA -013E;lcaron;LATIN SMALL LETTER L WITH CARON -0140;ldot;LATIN SMALL LETTER L WITH MIDDLE DOT -003C;less;LESS-THAN SIGN -2264;lessequal;LESS-THAN OR EQUAL TO -258C;lfblock;LEFT HALF BLOCK -20A4;lira;LIRA SIGN -2227;logicaland;LOGICAL AND -00AC;logicalnot;NOT SIGN -2228;logicalor;LOGICAL OR -017F;longs;LATIN SMALL LETTER LONG S -25CA;lozenge;LOZENGE -0142;lslash;LATIN SMALL LETTER L WITH STROKE -2591;ltshade;LIGHT SHADE -006D;m;LATIN SMALL LETTER M -00AF;macron;MACRON -2642;male;MALE SIGN -2212;minus;MINUS SIGN -2032;minute;PRIME -00B5;mu;MICRO SIGN -00D7;multiply;MULTIPLICATION SIGN -266A;musicalnote;EIGHTH NOTE -266B;musicalnotedbl;BEAMED EIGHTH NOTES -006E;n;LATIN SMALL LETTER N -0144;nacute;LATIN SMALL LETTER N WITH ACUTE -0149;napostrophe;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE -0148;ncaron;LATIN SMALL LETTER N WITH CARON -0039;nine;DIGIT NINE -2209;notelement;NOT AN ELEMENT OF -2260;notequal;NOT EQUAL TO -2284;notsubset;NOT A SUBSET OF -00F1;ntilde;LATIN SMALL LETTER N WITH TILDE -03BD;nu;GREEK SMALL LETTER NU -0023;numbersign;NUMBER SIGN -006F;o;LATIN SMALL LETTER O -00F3;oacute;LATIN SMALL LETTER O WITH ACUTE -014F;obreve;LATIN SMALL LETTER O WITH BREVE -00F4;ocircumflex;LATIN SMALL LETTER O WITH CIRCUMFLEX -00F6;odieresis;LATIN SMALL LETTER O WITH DIAERESIS -0153;oe;LATIN SMALL LIGATURE OE -02DB;ogonek;OGONEK -00F2;ograve;LATIN SMALL LETTER O WITH GRAVE -01A1;ohorn;LATIN SMALL LETTER O WITH HORN -0151;ohungarumlaut;LATIN SMALL LETTER O WITH DOUBLE ACUTE -014D;omacron;LATIN SMALL LETTER O WITH MACRON -03C9;omega;GREEK SMALL LETTER OMEGA -03D6;omega1;GREEK PI SYMBOL -03CE;omegatonos;GREEK SMALL LETTER OMEGA WITH TONOS -03BF;omicron;GREEK SMALL LETTER OMICRON -03CC;omicrontonos;GREEK SMALL LETTER OMICRON WITH TONOS -0031;one;DIGIT ONE -2024;onedotenleader;ONE DOT LEADER -215B;oneeighth;VULGAR FRACTION ONE EIGHTH -00BD;onehalf;VULGAR FRACTION ONE HALF -00BC;onequarter;VULGAR FRACTION ONE QUARTER -2153;onethird;VULGAR FRACTION ONE THIRD -25E6;openbullet;WHITE BULLET -00AA;ordfeminine;FEMININE ORDINAL INDICATOR -00BA;ordmasculine;MASCULINE ORDINAL INDICATOR -221F;orthogonal;RIGHT ANGLE -00F8;oslash;LATIN SMALL LETTER O WITH STROKE -01FF;oslashacute;LATIN SMALL LETTER O WITH STROKE AND ACUTE -00F5;otilde;LATIN SMALL LETTER O WITH TILDE -0070;p;LATIN SMALL LETTER P -00B6;paragraph;PILCROW SIGN -0028;parenleft;LEFT PARENTHESIS -0029;parenright;RIGHT PARENTHESIS -2202;partialdiff;PARTIAL DIFFERENTIAL -0025;percent;PERCENT SIGN -002E;period;FULL STOP -00B7;periodcentered;MIDDLE DOT -22A5;perpendicular;UP TACK -2030;perthousand;PER MILLE SIGN -20A7;peseta;PESETA SIGN -03C6;phi;GREEK SMALL LETTER PHI -03D5;phi1;GREEK PHI SYMBOL -03C0;pi;GREEK SMALL LETTER PI -002B;plus;PLUS SIGN -00B1;plusminus;PLUS-MINUS SIGN -211E;prescription;PRESCRIPTION TAKE -220F;product;N-ARY PRODUCT -2282;propersubset;SUBSET OF -2283;propersuperset;SUPERSET OF -221D;proportional;PROPORTIONAL TO -03C8;psi;GREEK SMALL LETTER PSI -0071;q;LATIN SMALL LETTER Q -003F;question;QUESTION MARK -00BF;questiondown;INVERTED QUESTION MARK -0022;quotedbl;QUOTATION MARK -201E;quotedblbase;DOUBLE LOW-9 QUOTATION MARK -201C;quotedblleft;LEFT DOUBLE QUOTATION MARK -201D;quotedblright;RIGHT DOUBLE QUOTATION MARK -2018;quoteleft;LEFT SINGLE QUOTATION MARK -201B;quotereversed;SINGLE HIGH-REVERSED-9 QUOTATION MARK -2019;quoteright;RIGHT SINGLE QUOTATION MARK -201A;quotesinglbase;SINGLE LOW-9 QUOTATION MARK -0027;quotesingle;APOSTROPHE -0072;r;LATIN SMALL LETTER R -0155;racute;LATIN SMALL LETTER R WITH ACUTE -221A;radical;SQUARE ROOT -0159;rcaron;LATIN SMALL LETTER R WITH CARON -2286;reflexsubset;SUBSET OF OR EQUAL TO -2287;reflexsuperset;SUPERSET OF OR EQUAL TO -00AE;registered;REGISTERED SIGN -2310;revlogicalnot;REVERSED NOT SIGN -03C1;rho;GREEK SMALL LETTER RHO -02DA;ring;RING ABOVE -2590;rtblock;RIGHT HALF BLOCK -0073;s;LATIN SMALL LETTER S -015B;sacute;LATIN SMALL LETTER S WITH ACUTE -0161;scaron;LATIN SMALL LETTER S WITH CARON -015F;scedilla;LATIN SMALL LETTER S WITH CEDILLA -015D;scircumflex;LATIN SMALL LETTER S WITH CIRCUMFLEX -2033;second;DOUBLE PRIME -00A7;section;SECTION SIGN -003B;semicolon;SEMICOLON -0037;seven;DIGIT SEVEN -215E;seveneighths;VULGAR FRACTION SEVEN EIGHTHS -2592;shade;MEDIUM SHADE -03C3;sigma;GREEK SMALL LETTER SIGMA -03C2;sigma1;GREEK SMALL LETTER FINAL SIGMA -223C;similar;TILDE OPERATOR -0036;six;DIGIT SIX -002F;slash;SOLIDUS -263A;smileface;WHITE SMILING FACE -0020;space;SPACE -2660;spade;BLACK SPADE SUIT -00A3;sterling;POUND SIGN -220B;suchthat;CONTAINS AS MEMBER -2211;summation;N-ARY SUMMATION -263C;sun;WHITE SUN WITH RAYS -0074;t;LATIN SMALL LETTER T -03C4;tau;GREEK SMALL LETTER TAU -0167;tbar;LATIN SMALL LETTER T WITH STROKE -0165;tcaron;LATIN SMALL LETTER T WITH CARON -2234;therefore;THEREFORE -03B8;theta;GREEK SMALL LETTER THETA -03D1;theta1;GREEK THETA SYMBOL -00FE;thorn;LATIN SMALL LETTER THORN -0033;three;DIGIT THREE -215C;threeeighths;VULGAR FRACTION THREE EIGHTHS -00BE;threequarters;VULGAR FRACTION THREE QUARTERS -02DC;tilde;SMALL TILDE -0303;tildecomb;COMBINING TILDE -0384;tonos;GREEK TONOS -2122;trademark;TRADE MARK SIGN -25BC;triagdn;BLACK DOWN-POINTING TRIANGLE -25C4;triaglf;BLACK LEFT-POINTING POINTER -25BA;triagrt;BLACK RIGHT-POINTING POINTER -25B2;triagup;BLACK UP-POINTING TRIANGLE -0032;two;DIGIT TWO -2025;twodotenleader;TWO DOT LEADER -2154;twothirds;VULGAR FRACTION TWO THIRDS -0075;u;LATIN SMALL LETTER U -00FA;uacute;LATIN SMALL LETTER U WITH ACUTE -016D;ubreve;LATIN SMALL LETTER U WITH BREVE -00FB;ucircumflex;LATIN SMALL LETTER U WITH CIRCUMFLEX -00FC;udieresis;LATIN SMALL LETTER U WITH DIAERESIS -00F9;ugrave;LATIN SMALL LETTER U WITH GRAVE -01B0;uhorn;LATIN SMALL LETTER U WITH HORN -0171;uhungarumlaut;LATIN SMALL LETTER U WITH DOUBLE ACUTE -016B;umacron;LATIN SMALL LETTER U WITH MACRON -005F;underscore;LOW LINE -2017;underscoredbl;DOUBLE LOW LINE -222A;union;UNION -2200;universal;FOR ALL -0173;uogonek;LATIN SMALL LETTER U WITH OGONEK -2580;upblock;UPPER HALF BLOCK -03C5;upsilon;GREEK SMALL LETTER UPSILON -03CB;upsilondieresis;GREEK SMALL LETTER UPSILON WITH DIALYTIKA -03B0;upsilondieresistonos;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS -03CD;upsilontonos;GREEK SMALL LETTER UPSILON WITH TONOS -016F;uring;LATIN SMALL LETTER U WITH RING ABOVE -0169;utilde;LATIN SMALL LETTER U WITH TILDE -0076;v;LATIN SMALL LETTER V -0077;w;LATIN SMALL LETTER W -1E83;wacute;LATIN SMALL LETTER W WITH ACUTE -0175;wcircumflex;LATIN SMALL LETTER W WITH CIRCUMFLEX -1E85;wdieresis;LATIN SMALL LETTER W WITH DIAERESIS -2118;weierstrass;SCRIPT CAPITAL P -1E81;wgrave;LATIN SMALL LETTER W WITH GRAVE -0078;x;LATIN SMALL LETTER X -03BE;xi;GREEK SMALL LETTER XI -0079;y;LATIN SMALL LETTER Y -00FD;yacute;LATIN SMALL LETTER Y WITH ACUTE -0177;ycircumflex;LATIN SMALL LETTER Y WITH CIRCUMFLEX -00FF;ydieresis;LATIN SMALL LETTER Y WITH DIAERESIS -00A5;yen;YEN SIGN -1EF3;ygrave;LATIN SMALL LETTER Y WITH GRAVE -007A;z;LATIN SMALL LETTER Z -017A;zacute;LATIN SMALL LETTER Z WITH ACUTE -017E;zcaron;LATIN SMALL LETTER Z WITH CARON -017C;zdotaccent;LATIN SMALL LETTER Z WITH DOT ABOVE -0030;zero;DIGIT ZERO -03B6;zeta;GREEK SMALL LETTER ZETA -# END -""" - - -class AGLError(Exception): - pass - - -LEGACY_AGL2UV = {} -AGL2UV = {} -UV2AGL = {} - - -def _builddicts(): - import re - - lines = _aglText.splitlines() - - parseAGL_RE = re.compile("([A-Za-z0-9]+);((?:[0-9A-F]{4})(?: (?:[0-9A-F]{4}))*)$") - - for line in lines: - if not line or line[:1] == "#": - continue - m = parseAGL_RE.match(line) - if not m: - raise AGLError("syntax error in glyphlist.txt: %s" % repr(line[:20])) - unicodes = m.group(2) - assert len(unicodes) % 5 == 4 - unicodes = [int(unicode, 16) for unicode in unicodes.split()] - glyphName = tostr(m.group(1)) - LEGACY_AGL2UV[glyphName] = unicodes - - lines = _aglfnText.splitlines() - - parseAGLFN_RE = re.compile("([0-9A-F]{4});([A-Za-z0-9]+);.*?$") - - for line in lines: - if not line or line[:1] == "#": - continue - m = parseAGLFN_RE.match(line) - if not m: - raise AGLError("syntax error in aglfn.txt: %s" % repr(line[:20])) - unicode = m.group(1) - assert len(unicode) == 4 - unicode = int(unicode, 16) - glyphName = tostr(m.group(2)) - AGL2UV[glyphName] = unicode - UV2AGL[unicode] = glyphName - - -_builddicts() - - -def toUnicode(glyph, isZapfDingbats=False): - """Convert glyph names to Unicode, such as ``'longs_t.oldstyle'`` --> ``u'ſt'`` - - If ``isZapfDingbats`` is ``True``, the implementation recognizes additional - glyph names (as required by the AGL specification). - """ - # https://github.com/adobe-type-tools/agl-specification#2-the-mapping - # - # 1. Drop all the characters from the glyph name starting with - # the first occurrence of a period (U+002E; FULL STOP), if any. - glyph = glyph.split(".", 1)[0] - - # 2. Split the remaining string into a sequence of components, - # using underscore (U+005F; LOW LINE) as the delimiter. - components = glyph.split("_") - - # 3. Map each component to a character string according to the - # procedure below, and concatenate those strings; the result - # is the character string to which the glyph name is mapped. - result = [_glyphComponentToUnicode(c, isZapfDingbats) for c in components] - return "".join(result) - - -def _glyphComponentToUnicode(component, isZapfDingbats): - # If the font is Zapf Dingbats (PostScript FontName: ZapfDingbats), - # and the component is in the ITC Zapf Dingbats Glyph List, then - # map it to the corresponding character in that list. - dingbat = _zapfDingbatsToUnicode(component) if isZapfDingbats else None - if dingbat: - return dingbat - - # Otherwise, if the component is in AGL, then map it - # to the corresponding character in that list. - uchars = LEGACY_AGL2UV.get(component) - if uchars: - return "".join(map(chr, uchars)) - - # Otherwise, if the component is of the form "uni" (U+0075, - # U+006E, and U+0069) followed by a sequence of uppercase - # hexadecimal digits (0–9 and A–F, meaning U+0030 through - # U+0039 and U+0041 through U+0046), if the length of that - # sequence is a multiple of four, and if each group of four - # digits represents a value in the ranges 0000 through D7FF - # or E000 through FFFF, then interpret each as a Unicode scalar - # value and map the component to the string made of those - # scalar values. Note that the range and digit-length - # restrictions mean that the "uni" glyph name prefix can be - # used only with UVs in the Basic Multilingual Plane (BMP). - uni = _uniToUnicode(component) - if uni: - return uni - - # Otherwise, if the component is of the form "u" (U+0075) - # followed by a sequence of four to six uppercase hexadecimal - # digits (0–9 and A–F, meaning U+0030 through U+0039 and - # U+0041 through U+0046), and those digits represents a value - # in the ranges 0000 through D7FF or E000 through 10FFFF, then - # interpret it as a Unicode scalar value and map the component - # to the string made of this scalar value. - uni = _uToUnicode(component) - if uni: - return uni - - # Otherwise, map the component to an empty string. - return "" - - -# https://github.com/adobe-type-tools/agl-aglfn/blob/master/zapfdingbats.txt -_AGL_ZAPF_DINGBATS = ( - " ✁✂✄☎✆✝✞✟✠✡☛☞✌✍✎✏✑✒✓✔✕✖✗✘✙✚✛✜✢✣✤✥✦✧★✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿❀" - "❁❂❃❄❅❆❇❈❉❊❋●❍■❏❑▲▼◆❖ ◗❘❙❚❯❱❲❳❨❩❬❭❪❫❴❵❛❜❝❞❡❢❣❤✐❥❦❧♠♥♦♣ ✉✈✇" - "①②③④⑤⑥⑦⑧⑨⑩❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓➔→➣↔" - "↕➙➛➜➝➞➟➠➡➢➤➥➦➧➨➩➫➭➯➲➳➵➸➺➻➼➽➾➚➪➶➹➘➴➷➬➮➱✃❐❒❮❰" -) - - -def _zapfDingbatsToUnicode(glyph): - """Helper for toUnicode().""" - if len(glyph) < 2 or glyph[0] != "a": - return None - try: - gid = int(glyph[1:]) - except ValueError: - return None - if gid < 0 or gid >= len(_AGL_ZAPF_DINGBATS): - return None - uchar = _AGL_ZAPF_DINGBATS[gid] - return uchar if uchar != " " else None - - -_re_uni = re.compile("^uni([0-9A-F]+)$") - - -def _uniToUnicode(component): - """Helper for toUnicode() to handle "uniABCD" components.""" - match = _re_uni.match(component) - if match is None: - return None - digits = match.group(1) - if len(digits) % 4 != 0: - return None - chars = [int(digits[i : i + 4], 16) for i in range(0, len(digits), 4)] - if any(c >= 0xD800 and c <= 0xDFFF for c in chars): - # The AGL specification explicitly excluded surrogate pairs. - return None - return "".join([chr(c) for c in chars]) - - -_re_u = re.compile("^u([0-9A-F]{4,6})$") - - -def _uToUnicode(component): - """Helper for toUnicode() to handle "u1ABCD" components.""" - match = _re_u.match(component) - if match is None: - return None - digits = match.group(1) - try: - value = int(digits, 16) - except ValueError: - return None - if (value >= 0x0000 and value <= 0xD7FF) or (value >= 0xE000 and value <= 0x10FFFF): - return chr(value) - return None diff --git a/.venv/Lib/site-packages/fontTools/cffLib/__init__.py b/.venv/Lib/site-packages/fontTools/cffLib/__init__.py deleted file mode 100644 index 0ad41c5..0000000 --- a/.venv/Lib/site-packages/fontTools/cffLib/__init__.py +++ /dev/null @@ -1,3829 +0,0 @@ -"""cffLib: read/write Adobe CFF fonts - -OpenType fonts with PostScript outlines contain a completely independent -font file, Adobe's *Compact Font Format*. So dealing with OpenType fonts -requires also dealing with CFF. This module allows you to read and write -fonts written in the CFF format. - -In 2016, OpenType 1.8 introduced the `CFF2 `_ -format which, along with other changes, extended the CFF format to deal with -the demands of variable fonts. This module parses both original CFF and CFF2. - -""" - -from fontTools.misc import sstruct -from fontTools.misc import psCharStrings -from fontTools.misc.arrayTools import unionRect, intRect -from fontTools.misc.textTools import ( - bytechr, - byteord, - bytesjoin, - tobytes, - tostr, - safeEval, -) -from fontTools.ttLib import TTFont -from fontTools.ttLib.tables.otBase import OTTableWriter -from fontTools.ttLib.tables.otBase import OTTableReader -from fontTools.ttLib.tables import otTables as ot -from io import BytesIO -import struct -import logging -import re - -# mute cffLib debug messages when running ttx in verbose mode -DEBUG = logging.DEBUG - 1 -log = logging.getLogger(__name__) - -cffHeaderFormat = """ - major: B - minor: B - hdrSize: B -""" - -maxStackLimit = 513 -# maxstack operator has been deprecated. max stack is now always 513. - - -class StopHintCountEvent(Exception): - pass - - -class _DesubroutinizingT2Decompiler(psCharStrings.SimpleT2Decompiler): - stop_hintcount_ops = ( - "op_hintmask", - "op_cntrmask", - "op_rmoveto", - "op_hmoveto", - "op_vmoveto", - ) - - def __init__(self, localSubrs, globalSubrs, private=None): - psCharStrings.SimpleT2Decompiler.__init__( - self, localSubrs, globalSubrs, private - ) - - def execute(self, charString): - self.need_hintcount = True # until proven otherwise - for op_name in self.stop_hintcount_ops: - setattr(self, op_name, self.stop_hint_count) - - if hasattr(charString, "_desubroutinized"): - # If a charstring has already been desubroutinized, we will still - # need to execute it if we need to count hints in order to - # compute the byte length for mask arguments, and haven't finished - # counting hints pairs. - if self.need_hintcount and self.callingStack: - try: - psCharStrings.SimpleT2Decompiler.execute(self, charString) - except StopHintCountEvent: - del self.callingStack[-1] - return - - charString._patches = [] - psCharStrings.SimpleT2Decompiler.execute(self, charString) - desubroutinized = charString.program[:] - for idx, expansion in reversed(charString._patches): - assert idx >= 2 - assert desubroutinized[idx - 1] in [ - "callsubr", - "callgsubr", - ], desubroutinized[idx - 1] - assert type(desubroutinized[idx - 2]) == int - if expansion[-1] == "return": - expansion = expansion[:-1] - desubroutinized[idx - 2 : idx] = expansion - if not self.private.in_cff2: - if "endchar" in desubroutinized: - # Cut off after first endchar - desubroutinized = desubroutinized[ - : desubroutinized.index("endchar") + 1 - ] - else: - if not len(desubroutinized) or desubroutinized[-1] != "return": - desubroutinized.append("return") - - charString._desubroutinized = desubroutinized - del charString._patches - - def op_callsubr(self, index): - subr = self.localSubrs[self.operandStack[-1] + self.localBias] - psCharStrings.SimpleT2Decompiler.op_callsubr(self, index) - self.processSubr(index, subr) - - def op_callgsubr(self, index): - subr = self.globalSubrs[self.operandStack[-1] + self.globalBias] - psCharStrings.SimpleT2Decompiler.op_callgsubr(self, index) - self.processSubr(index, subr) - - def stop_hint_count(self, *args): - self.need_hintcount = False - for op_name in self.stop_hintcount_ops: - setattr(self, op_name, None) - cs = self.callingStack[-1] - if hasattr(cs, "_desubroutinized"): - raise StopHintCountEvent() - - def op_hintmask(self, index): - psCharStrings.SimpleT2Decompiler.op_hintmask(self, index) - if self.need_hintcount: - self.stop_hint_count() - - def processSubr(self, index, subr): - cs = self.callingStack[-1] - if not hasattr(cs, "_desubroutinized"): - cs._patches.append((index, subr._desubroutinized)) - - -class CFFFontSet(object): - """A CFF font "file" can contain more than one font, although this is - extremely rare (and not allowed within OpenType fonts). - - This class is the entry point for parsing a CFF table. To actually - manipulate the data inside the CFF font, you will want to access the - ``CFFFontSet``'s :class:`TopDict` object. To do this, a ``CFFFontSet`` - object can either be treated as a dictionary (with appropriate - ``keys()`` and ``values()`` methods) mapping font names to :class:`TopDict` - objects, or as a list. - - .. code:: python - - from fontTools import ttLib - tt = ttLib.TTFont("Tests/cffLib/data/LinLibertine_RBI.otf") - tt["CFF "].cff - # - tt["CFF "].cff[0] # Here's your actual font data - # - - """ - - def decompile(self, file, otFont, isCFF2=None): - """Parse a binary CFF file into an internal representation. ``file`` - should be a file handle object. ``otFont`` is the top-level - :py:class:`fontTools.ttLib.ttFont.TTFont` object containing this CFF file. - - If ``isCFF2`` is passed and set to ``True`` or ``False``, then the - library makes an assertion that the CFF header is of the appropriate - version. - """ - - self.otFont = otFont - sstruct.unpack(cffHeaderFormat, file.read(3), self) - if isCFF2 is not None: - # called from ttLib: assert 'major' as read from file matches the - # expected version - expected_major = 2 if isCFF2 else 1 - if self.major != expected_major: - raise ValueError( - "Invalid CFF 'major' version: expected %d, found %d" - % (expected_major, self.major) - ) - else: - # use 'major' version from file to determine if isCFF2 - assert self.major in (1, 2), "Unknown CFF format" - isCFF2 = self.major == 2 - if not isCFF2: - self.offSize = struct.unpack("B", file.read(1))[0] - file.seek(self.hdrSize) - self.fontNames = list(tostr(s) for s in Index(file, isCFF2=isCFF2)) - self.topDictIndex = TopDictIndex(file, isCFF2=isCFF2) - self.strings = IndexedStrings(file) - else: # isCFF2 - self.topDictSize = struct.unpack(">H", file.read(2))[0] - file.seek(self.hdrSize) - self.fontNames = ["CFF2Font"] - cff2GetGlyphOrder = otFont.getGlyphOrder - # in CFF2, offsetSize is the size of the TopDict data. - self.topDictIndex = TopDictIndex( - file, cff2GetGlyphOrder, self.topDictSize, isCFF2=isCFF2 - ) - self.strings = None - self.GlobalSubrs = GlobalSubrsIndex(file, isCFF2=isCFF2) - self.topDictIndex.strings = self.strings - self.topDictIndex.GlobalSubrs = self.GlobalSubrs - - def __len__(self): - return len(self.fontNames) - - def keys(self): - return list(self.fontNames) - - def values(self): - return self.topDictIndex - - def __getitem__(self, nameOrIndex): - """Return TopDict instance identified by name (str) or index (int - or any object that implements `__index__`). - """ - if hasattr(nameOrIndex, "__index__"): - index = nameOrIndex.__index__() - elif isinstance(nameOrIndex, str): - name = nameOrIndex - try: - index = self.fontNames.index(name) - except ValueError: - raise KeyError(nameOrIndex) - else: - raise TypeError(nameOrIndex) - return self.topDictIndex[index] - - def compile(self, file, otFont, isCFF2=None): - """Write the object back into binary representation onto the given file. - ``file`` should be a file handle object. ``otFont`` is the top-level - :py:class:`fontTools.ttLib.ttFont.TTFont` object containing this CFF file. - - If ``isCFF2`` is passed and set to ``True`` or ``False``, then the - library makes an assertion that the CFF header is of the appropriate - version. - """ - self.otFont = otFont - if isCFF2 is not None: - # called from ttLib: assert 'major' value matches expected version - expected_major = 2 if isCFF2 else 1 - if self.major != expected_major: - raise ValueError( - "Invalid CFF 'major' version: expected %d, found %d" - % (expected_major, self.major) - ) - else: - # use current 'major' value to determine output format - assert self.major in (1, 2), "Unknown CFF format" - isCFF2 = self.major == 2 - - if otFont.recalcBBoxes and not isCFF2: - for topDict in self.topDictIndex: - topDict.recalcFontBBox() - - if not isCFF2: - strings = IndexedStrings() - else: - strings = None - writer = CFFWriter(isCFF2) - topCompiler = self.topDictIndex.getCompiler(strings, self, isCFF2=isCFF2) - if isCFF2: - self.hdrSize = 5 - writer.add(sstruct.pack(cffHeaderFormat, self)) - # Note: topDictSize will most likely change in CFFWriter.toFile(). - self.topDictSize = topCompiler.getDataLength() - writer.add(struct.pack(">H", self.topDictSize)) - else: - self.hdrSize = 4 - self.offSize = 4 # will most likely change in CFFWriter.toFile(). - writer.add(sstruct.pack(cffHeaderFormat, self)) - writer.add(struct.pack("B", self.offSize)) - if not isCFF2: - fontNames = Index() - for name in self.fontNames: - fontNames.append(name) - writer.add(fontNames.getCompiler(strings, self, isCFF2=isCFF2)) - writer.add(topCompiler) - if not isCFF2: - writer.add(strings.getCompiler()) - writer.add(self.GlobalSubrs.getCompiler(strings, self, isCFF2=isCFF2)) - - for topDict in self.topDictIndex: - if not hasattr(topDict, "charset") or topDict.charset is None: - charset = otFont.getGlyphOrder() - topDict.charset = charset - children = topCompiler.getChildren(strings) - for child in children: - writer.add(child) - - writer.toFile(file) - - def toXML(self, xmlWriter): - """Write the object into XML representation onto the given - :class:`fontTools.misc.xmlWriter.XMLWriter`. - - .. code:: python - - writer = xmlWriter.XMLWriter(sys.stdout) - tt["CFF "].cff.toXML(writer) - - """ - - xmlWriter.simpletag("major", value=self.major) - xmlWriter.newline() - xmlWriter.simpletag("minor", value=self.minor) - xmlWriter.newline() - for fontName in self.fontNames: - xmlWriter.begintag("CFFFont", name=tostr(fontName)) - xmlWriter.newline() - font = self[fontName] - font.toXML(xmlWriter) - xmlWriter.endtag("CFFFont") - xmlWriter.newline() - xmlWriter.newline() - xmlWriter.begintag("GlobalSubrs") - xmlWriter.newline() - self.GlobalSubrs.toXML(xmlWriter) - xmlWriter.endtag("GlobalSubrs") - xmlWriter.newline() - - def fromXML(self, name, attrs, content, otFont=None): - """Reads data from the XML element into the ``CFFFontSet`` object.""" - self.otFont = otFont - - # set defaults. These will be replaced if there are entries for them - # in the XML file. - if not hasattr(self, "major"): - self.major = 1 - if not hasattr(self, "minor"): - self.minor = 0 - - if name == "CFFFont": - if self.major == 1: - if not hasattr(self, "offSize"): - # this will be recalculated when the cff is compiled. - self.offSize = 4 - if not hasattr(self, "hdrSize"): - self.hdrSize = 4 - if not hasattr(self, "GlobalSubrs"): - self.GlobalSubrs = GlobalSubrsIndex() - if not hasattr(self, "fontNames"): - self.fontNames = [] - self.topDictIndex = TopDictIndex() - fontName = attrs["name"] - self.fontNames.append(fontName) - topDict = TopDict(GlobalSubrs=self.GlobalSubrs) - topDict.charset = None # gets filled in later - elif self.major == 2: - if not hasattr(self, "hdrSize"): - self.hdrSize = 5 - if not hasattr(self, "GlobalSubrs"): - self.GlobalSubrs = GlobalSubrsIndex() - if not hasattr(self, "fontNames"): - self.fontNames = ["CFF2Font"] - cff2GetGlyphOrder = self.otFont.getGlyphOrder - topDict = TopDict( - GlobalSubrs=self.GlobalSubrs, cff2GetGlyphOrder=cff2GetGlyphOrder - ) - self.topDictIndex = TopDictIndex(None, cff2GetGlyphOrder) - self.topDictIndex.append(topDict) - for element in content: - if isinstance(element, str): - continue - name, attrs, content = element - topDict.fromXML(name, attrs, content) - - if hasattr(topDict, "VarStore") and topDict.FDArray[0].vstore is None: - fdArray = topDict.FDArray - for fontDict in fdArray: - if hasattr(fontDict, "Private"): - fontDict.Private.vstore = topDict.VarStore - - elif name == "GlobalSubrs": - subrCharStringClass = psCharStrings.T2CharString - if not hasattr(self, "GlobalSubrs"): - self.GlobalSubrs = GlobalSubrsIndex() - for element in content: - if isinstance(element, str): - continue - name, attrs, content = element - subr = subrCharStringClass() - subr.fromXML(name, attrs, content) - self.GlobalSubrs.append(subr) - elif name == "major": - self.major = int(attrs["value"]) - elif name == "minor": - self.minor = int(attrs["value"]) - - def convertCFFToCFF2(self, otFont): - """Converts this object from CFF format to CFF2 format. This conversion - is done 'in-place'. The conversion cannot be reversed. - - This assumes a decompiled CFF table. (i.e. that the object has been - filled via :meth:`decompile`.)""" - self.major = 2 - cff2GetGlyphOrder = self.otFont.getGlyphOrder - topDictData = TopDictIndex(None, cff2GetGlyphOrder) - topDictData.items = self.topDictIndex.items - self.topDictIndex = topDictData - topDict = topDictData[0] - if hasattr(topDict, "Private"): - privateDict = topDict.Private - else: - privateDict = None - opOrder = buildOrder(topDictOperators2) - topDict.order = opOrder - topDict.cff2GetGlyphOrder = cff2GetGlyphOrder - for entry in topDictOperators: - key = entry[1] - if key not in opOrder: - if key in topDict.rawDict: - del topDict.rawDict[key] - if hasattr(topDict, key): - delattr(topDict, key) - - if not hasattr(topDict, "FDArray"): - fdArray = topDict.FDArray = FDArrayIndex() - fdArray.strings = None - fdArray.GlobalSubrs = topDict.GlobalSubrs - topDict.GlobalSubrs.fdArray = fdArray - charStrings = topDict.CharStrings - if charStrings.charStringsAreIndexed: - charStrings.charStringsIndex.fdArray = fdArray - else: - charStrings.fdArray = fdArray - fontDict = FontDict() - fontDict.setCFF2(True) - fdArray.append(fontDict) - fontDict.Private = privateDict - privateOpOrder = buildOrder(privateDictOperators2) - for entry in privateDictOperators: - key = entry[1] - if key not in privateOpOrder: - if key in privateDict.rawDict: - # print "Removing private dict", key - del privateDict.rawDict[key] - if hasattr(privateDict, key): - delattr(privateDict, key) - # print "Removing privateDict attr", key - else: - # clean up the PrivateDicts in the fdArray - fdArray = topDict.FDArray - privateOpOrder = buildOrder(privateDictOperators2) - for fontDict in fdArray: - fontDict.setCFF2(True) - for key in fontDict.rawDict.keys(): - if key not in fontDict.order: - del fontDict.rawDict[key] - if hasattr(fontDict, key): - delattr(fontDict, key) - - privateDict = fontDict.Private - for entry in privateDictOperators: - key = entry[1] - if key not in privateOpOrder: - if key in privateDict.rawDict: - # print "Removing private dict", key - del privateDict.rawDict[key] - if hasattr(privateDict, key): - delattr(privateDict, key) - # print "Removing privateDict attr", key - # At this point, the Subrs and Charstrings are all still T2Charstring class - # easiest to fix this by compiling, then decompiling again - file = BytesIO() - self.compile(file, otFont, isCFF2=True) - file.seek(0) - self.decompile(file, otFont, isCFF2=True) - - def desubroutinize(self): - for fontName in self.fontNames: - font = self[fontName] - cs = font.CharStrings - for g in font.charset: - c, _ = cs.getItemAndSelector(g) - c.decompile() - subrs = getattr(c.private, "Subrs", []) - decompiler = _DesubroutinizingT2Decompiler( - subrs, c.globalSubrs, c.private - ) - decompiler.execute(c) - c.program = c._desubroutinized - del c._desubroutinized - # Delete all the local subrs - if hasattr(font, "FDArray"): - for fd in font.FDArray: - pd = fd.Private - if hasattr(pd, "Subrs"): - del pd.Subrs - if "Subrs" in pd.rawDict: - del pd.rawDict["Subrs"] - else: - pd = font.Private - if hasattr(pd, "Subrs"): - del pd.Subrs - if "Subrs" in pd.rawDict: - del pd.rawDict["Subrs"] - # as well as the global subrs - self.GlobalSubrs.clear() - - -class CFFWriter(object): - """Helper class for serializing CFF data to binary. Used by - :meth:`CFFFontSet.compile`.""" - - def __init__(self, isCFF2): - self.data = [] - self.isCFF2 = isCFF2 - - def add(self, table): - self.data.append(table) - - def toFile(self, file): - lastPosList = None - count = 1 - while True: - log.log(DEBUG, "CFFWriter.toFile() iteration: %d", count) - count = count + 1 - pos = 0 - posList = [pos] - for item in self.data: - if hasattr(item, "getDataLength"): - endPos = pos + item.getDataLength() - if isinstance(item, TopDictIndexCompiler) and item.isCFF2: - self.topDictSize = item.getDataLength() - else: - endPos = pos + len(item) - if hasattr(item, "setPos"): - item.setPos(pos, endPos) - pos = endPos - posList.append(pos) - if posList == lastPosList: - break - lastPosList = posList - log.log(DEBUG, "CFFWriter.toFile() writing to file.") - begin = file.tell() - if self.isCFF2: - self.data[1] = struct.pack(">H", self.topDictSize) - else: - self.offSize = calcOffSize(lastPosList[-1]) - self.data[1] = struct.pack("B", self.offSize) - posList = [0] - for item in self.data: - if hasattr(item, "toFile"): - item.toFile(file) - else: - file.write(item) - posList.append(file.tell() - begin) - assert posList == lastPosList - - -def calcOffSize(largestOffset): - if largestOffset < 0x100: - offSize = 1 - elif largestOffset < 0x10000: - offSize = 2 - elif largestOffset < 0x1000000: - offSize = 3 - else: - offSize = 4 - return offSize - - -class IndexCompiler(object): - """Base class for writing CFF `INDEX data `_ - to binary.""" - - def __init__(self, items, strings, parent, isCFF2=None): - if isCFF2 is None and hasattr(parent, "isCFF2"): - isCFF2 = parent.isCFF2 - assert isCFF2 is not None - self.isCFF2 = isCFF2 - self.items = self.getItems(items, strings) - self.parent = parent - - def getItems(self, items, strings): - return items - - def getOffsets(self): - # An empty INDEX contains only the count field. - if self.items: - pos = 1 - offsets = [pos] - for item in self.items: - if hasattr(item, "getDataLength"): - pos = pos + item.getDataLength() - else: - pos = pos + len(item) - offsets.append(pos) - else: - offsets = [] - return offsets - - def getDataLength(self): - if self.isCFF2: - countSize = 4 - else: - countSize = 2 - - if self.items: - lastOffset = self.getOffsets()[-1] - offSize = calcOffSize(lastOffset) - dataLength = ( - countSize - + 1 # count - + (len(self.items) + 1) * offSize # offSize - + lastOffset # the offsets - - 1 # size of object data - ) - else: - # count. For empty INDEX tables, this is the only entry. - dataLength = countSize - - return dataLength - - def toFile(self, file): - offsets = self.getOffsets() - if self.isCFF2: - writeCard32(file, len(self.items)) - else: - writeCard16(file, len(self.items)) - # An empty INDEX contains only the count field. - if self.items: - offSize = calcOffSize(offsets[-1]) - writeCard8(file, offSize) - offSize = -offSize - pack = struct.pack - for offset in offsets: - binOffset = pack(">l", offset)[offSize:] - assert len(binOffset) == -offSize - file.write(binOffset) - for item in self.items: - if hasattr(item, "toFile"): - item.toFile(file) - else: - data = tobytes(item, encoding="latin1") - file.write(data) - - -class IndexedStringsCompiler(IndexCompiler): - def getItems(self, items, strings): - return items.strings - - -class TopDictIndexCompiler(IndexCompiler): - """Helper class for writing the TopDict to binary.""" - - def getItems(self, items, strings): - out = [] - for item in items: - out.append(item.getCompiler(strings, self)) - return out - - def getChildren(self, strings): - children = [] - for topDict in self.items: - children.extend(topDict.getChildren(strings)) - return children - - def getOffsets(self): - if self.isCFF2: - offsets = [0, self.items[0].getDataLength()] - return offsets - else: - return super(TopDictIndexCompiler, self).getOffsets() - - def getDataLength(self): - if self.isCFF2: - dataLength = self.items[0].getDataLength() - return dataLength - else: - return super(TopDictIndexCompiler, self).getDataLength() - - def toFile(self, file): - if self.isCFF2: - self.items[0].toFile(file) - else: - super(TopDictIndexCompiler, self).toFile(file) - - -class FDArrayIndexCompiler(IndexCompiler): - """Helper class for writing the - `Font DICT INDEX `_ - to binary.""" - - def getItems(self, items, strings): - out = [] - for item in items: - out.append(item.getCompiler(strings, self)) - return out - - def getChildren(self, strings): - children = [] - for fontDict in self.items: - children.extend(fontDict.getChildren(strings)) - return children - - def toFile(self, file): - offsets = self.getOffsets() - if self.isCFF2: - writeCard32(file, len(self.items)) - else: - writeCard16(file, len(self.items)) - offSize = calcOffSize(offsets[-1]) - writeCard8(file, offSize) - offSize = -offSize - pack = struct.pack - for offset in offsets: - binOffset = pack(">l", offset)[offSize:] - assert len(binOffset) == -offSize - file.write(binOffset) - for item in self.items: - if hasattr(item, "toFile"): - item.toFile(file) - else: - file.write(item) - - def setPos(self, pos, endPos): - self.parent.rawDict["FDArray"] = pos - - -class GlobalSubrsCompiler(IndexCompiler): - """Helper class for writing the `global subroutine INDEX `_ - to binary.""" - - def getItems(self, items, strings): - out = [] - for cs in items: - cs.compile(self.isCFF2) - out.append(cs.bytecode) - return out - - -class SubrsCompiler(GlobalSubrsCompiler): - """Helper class for writing the `local subroutine INDEX `_ - to binary.""" - - def setPos(self, pos, endPos): - offset = pos - self.parent.pos - self.parent.rawDict["Subrs"] = offset - - -class CharStringsCompiler(GlobalSubrsCompiler): - """Helper class for writing the `CharStrings INDEX `_ - to binary.""" - - def getItems(self, items, strings): - out = [] - for cs in items: - cs.compile(self.isCFF2) - out.append(cs.bytecode) - return out - - def setPos(self, pos, endPos): - self.parent.rawDict["CharStrings"] = pos - - -class Index(object): - """This class represents what the CFF spec calls an INDEX (an array of - variable-sized objects). `Index` items can be addressed and set using - Python list indexing.""" - - compilerClass = IndexCompiler - - def __init__(self, file=None, isCFF2=None): - assert (isCFF2 is None) == (file is None) - self.items = [] - name = self.__class__.__name__ - if file is None: - return - self._isCFF2 = isCFF2 - log.log(DEBUG, "loading %s at %s", name, file.tell()) - self.file = file - if isCFF2: - count = readCard32(file) - else: - count = readCard16(file) - if count == 0: - return - self.items = [None] * count - offSize = readCard8(file) - log.log(DEBUG, " index count: %s offSize: %s", count, offSize) - assert offSize <= 4, "offSize too large: %s" % offSize - self.offsets = offsets = [] - pad = b"\0" * (4 - offSize) - for index in range(count + 1): - chunk = file.read(offSize) - chunk = pad + chunk - (offset,) = struct.unpack(">L", chunk) - offsets.append(int(offset)) - self.offsetBase = file.tell() - 1 - file.seek(self.offsetBase + offsets[-1]) # pretend we've read the whole lot - log.log(DEBUG, " end of %s at %s", name, file.tell()) - - def __len__(self): - return len(self.items) - - def __getitem__(self, index): - item = self.items[index] - if item is not None: - return item - offset = self.offsets[index] + self.offsetBase - size = self.offsets[index + 1] - self.offsets[index] - file = self.file - file.seek(offset) - data = file.read(size) - assert len(data) == size - item = self.produceItem(index, data, file, offset) - self.items[index] = item - return item - - def __setitem__(self, index, item): - self.items[index] = item - - def produceItem(self, index, data, file, offset): - return data - - def append(self, item): - """Add an item to an INDEX.""" - self.items.append(item) - - def getCompiler(self, strings, parent, isCFF2=None): - return self.compilerClass(self, strings, parent, isCFF2=isCFF2) - - def clear(self): - """Empty the INDEX.""" - del self.items[:] - - -class GlobalSubrsIndex(Index): - """This index contains all the global subroutines in the font. A global - subroutine is a set of ``CharString`` data which is accessible to any - glyph in the font, and are used to store repeated instructions - for - example, components may be encoded as global subroutines, but so could - hinting instructions. - - Remember that when interpreting a ``callgsubr`` instruction (or indeed - a ``callsubr`` instruction) that you will need to add the "subroutine - number bias" to number given: - - .. code:: python - - tt = ttLib.TTFont("Almendra-Bold.otf") - u = tt["CFF "].cff[0].CharStrings["udieresis"] - u.decompile() - - u.toXML(XMLWriter(sys.stdout)) - # - # -64 callgsubr <-- Subroutine which implements the dieresis mark - # - - tt["CFF "].cff[0].GlobalSubrs[-64] # <-- WRONG - # - - tt["CFF "].cff[0].GlobalSubrs[-64 + 107] # <-- RIGHT - # - - ("The bias applied depends on the number of subrs (gsubrs). If the number of - subrs (gsubrs) is less than 1240, the bias is 107. Otherwise if it is less - than 33900, it is 1131; otherwise it is 32768.", - `Subroutine Operators `) - """ - - compilerClass = GlobalSubrsCompiler - subrClass = psCharStrings.T2CharString - charStringClass = psCharStrings.T2CharString - - def __init__( - self, - file=None, - globalSubrs=None, - private=None, - fdSelect=None, - fdArray=None, - isCFF2=None, - ): - super(GlobalSubrsIndex, self).__init__(file, isCFF2=isCFF2) - self.globalSubrs = globalSubrs - self.private = private - if fdSelect: - self.fdSelect = fdSelect - if fdArray: - self.fdArray = fdArray - - def produceItem(self, index, data, file, offset): - if self.private is not None: - private = self.private - elif hasattr(self, "fdArray") and self.fdArray is not None: - if hasattr(self, "fdSelect") and self.fdSelect is not None: - fdIndex = self.fdSelect[index] - else: - fdIndex = 0 - private = self.fdArray[fdIndex].Private - else: - private = None - return self.subrClass(data, private=private, globalSubrs=self.globalSubrs) - - def toXML(self, xmlWriter): - """Write the subroutines index into XML representation onto the given - :class:`fontTools.misc.xmlWriter.XMLWriter`. - - .. code:: python - - writer = xmlWriter.XMLWriter(sys.stdout) - tt["CFF "].cff[0].GlobalSubrs.toXML(writer) - - """ - xmlWriter.comment( - "The 'index' attribute is only for humans; " "it is ignored when parsed." - ) - xmlWriter.newline() - for i in range(len(self)): - subr = self[i] - if subr.needsDecompilation(): - xmlWriter.begintag("CharString", index=i, raw=1) - else: - xmlWriter.begintag("CharString", index=i) - xmlWriter.newline() - subr.toXML(xmlWriter) - xmlWriter.endtag("CharString") - xmlWriter.newline() - - def fromXML(self, name, attrs, content): - if name != "CharString": - return - subr = self.subrClass() - subr.fromXML(name, attrs, content) - self.append(subr) - - def getItemAndSelector(self, index): - sel = None - if hasattr(self, "fdSelect"): - sel = self.fdSelect[index] - return self[index], sel - - -class SubrsIndex(GlobalSubrsIndex): - """This index contains a glyph's local subroutines. A local subroutine is a - private set of ``CharString`` data which is accessible only to the glyph to - which the index is attached.""" - - compilerClass = SubrsCompiler - - -class TopDictIndex(Index): - """This index represents the array of ``TopDict`` structures in the font - (again, usually only one entry is present). Hence the following calls are - equivalent: - - .. code:: python - - tt["CFF "].cff[0] - # - tt["CFF "].cff.topDictIndex[0] - # - - """ - - compilerClass = TopDictIndexCompiler - - def __init__(self, file=None, cff2GetGlyphOrder=None, topSize=0, isCFF2=None): - assert (isCFF2 is None) == (file is None) - self.cff2GetGlyphOrder = cff2GetGlyphOrder - if file is not None and isCFF2: - self._isCFF2 = isCFF2 - self.items = [] - name = self.__class__.__name__ - log.log(DEBUG, "loading %s at %s", name, file.tell()) - self.file = file - count = 1 - self.items = [None] * count - self.offsets = [0, topSize] - self.offsetBase = file.tell() - # pretend we've read the whole lot - file.seek(self.offsetBase + topSize) - log.log(DEBUG, " end of %s at %s", name, file.tell()) - else: - super(TopDictIndex, self).__init__(file, isCFF2=isCFF2) - - def produceItem(self, index, data, file, offset): - top = TopDict( - self.strings, - file, - offset, - self.GlobalSubrs, - self.cff2GetGlyphOrder, - isCFF2=self._isCFF2, - ) - top.decompile(data) - return top - - def toXML(self, xmlWriter): - for i in range(len(self)): - xmlWriter.begintag("FontDict", index=i) - xmlWriter.newline() - self[i].toXML(xmlWriter) - xmlWriter.endtag("FontDict") - xmlWriter.newline() - - -class FDArrayIndex(Index): - compilerClass = FDArrayIndexCompiler - - def toXML(self, xmlWriter): - for i in range(len(self)): - xmlWriter.begintag("FontDict", index=i) - xmlWriter.newline() - self[i].toXML(xmlWriter) - xmlWriter.endtag("FontDict") - xmlWriter.newline() - - def produceItem(self, index, data, file, offset): - fontDict = FontDict( - self.strings, - file, - offset, - self.GlobalSubrs, - isCFF2=self._isCFF2, - vstore=self.vstore, - ) - fontDict.decompile(data) - return fontDict - - def fromXML(self, name, attrs, content): - if name != "FontDict": - return - fontDict = FontDict() - for element in content: - if isinstance(element, str): - continue - name, attrs, content = element - fontDict.fromXML(name, attrs, content) - self.append(fontDict) - - -class VarStoreData(object): - def __init__(self, file=None, otVarStore=None): - self.file = file - self.data = None - self.otVarStore = otVarStore - self.font = TTFont() # dummy font for the decompile function. - - def decompile(self): - if self.file: - # read data in from file. Assume position is correct. - length = readCard16(self.file) - self.data = self.file.read(length) - globalState = {} - reader = OTTableReader(self.data, globalState) - self.otVarStore = ot.VarStore() - self.otVarStore.decompile(reader, self.font) - return self - - def compile(self): - writer = OTTableWriter() - self.otVarStore.compile(writer, self.font) - # Note that this omits the initial Card16 length from the CFF2 - # VarStore data block - self.data = writer.getAllData() - - def writeXML(self, xmlWriter, name): - self.otVarStore.toXML(xmlWriter, self.font) - - def xmlRead(self, name, attrs, content, parent): - self.otVarStore = ot.VarStore() - for element in content: - if isinstance(element, tuple): - name, attrs, content = element - self.otVarStore.fromXML(name, attrs, content, self.font) - else: - pass - return None - - def __len__(self): - return len(self.data) - - def getNumRegions(self, vsIndex): - if vsIndex is None: - vsIndex = 0 - varData = self.otVarStore.VarData[vsIndex] - numRegions = varData.VarRegionCount - return numRegions - - -class FDSelect(object): - def __init__(self, file=None, numGlyphs=None, format=None): - if file: - # read data in from file - self.format = readCard8(file) - if self.format == 0: - from array import array - - self.gidArray = array("B", file.read(numGlyphs)).tolist() - elif self.format == 3: - gidArray = [None] * numGlyphs - nRanges = readCard16(file) - fd = None - prev = None - for i in range(nRanges): - first = readCard16(file) - if prev is not None: - for glyphID in range(prev, first): - gidArray[glyphID] = fd - prev = first - fd = readCard8(file) - if prev is not None: - first = readCard16(file) - for glyphID in range(prev, first): - gidArray[glyphID] = fd - self.gidArray = gidArray - elif self.format == 4: - gidArray = [None] * numGlyphs - nRanges = readCard32(file) - fd = None - prev = None - for i in range(nRanges): - first = readCard32(file) - if prev is not None: - for glyphID in range(prev, first): - gidArray[glyphID] = fd - prev = first - fd = readCard16(file) - if prev is not None: - first = readCard32(file) - for glyphID in range(prev, first): - gidArray[glyphID] = fd - self.gidArray = gidArray - else: - assert False, "unsupported FDSelect format: %s" % format - else: - # reading from XML. Make empty gidArray, and leave format as passed in. - # format is None will result in the smallest representation being used. - self.format = format - self.gidArray = [] - - def __len__(self): - return len(self.gidArray) - - def __getitem__(self, index): - return self.gidArray[index] - - def __setitem__(self, index, fdSelectValue): - self.gidArray[index] = fdSelectValue - - def append(self, fdSelectValue): - self.gidArray.append(fdSelectValue) - - -class CharStrings(object): - """The ``CharStrings`` in the font represent the instructions for drawing - each glyph. This object presents a dictionary interface to the font's - CharStrings, indexed by glyph name: - - .. code:: python - - tt["CFF "].cff[0].CharStrings["a"] - # - - See :class:`fontTools.misc.psCharStrings.T1CharString` and - :class:`fontTools.misc.psCharStrings.T2CharString` for how to decompile, - compile and interpret the glyph drawing instructions in the returned objects. - - """ - - def __init__( - self, - file, - charset, - globalSubrs, - private, - fdSelect, - fdArray, - isCFF2=None, - varStore=None, - ): - self.globalSubrs = globalSubrs - self.varStore = varStore - if file is not None: - self.charStringsIndex = SubrsIndex( - file, globalSubrs, private, fdSelect, fdArray, isCFF2=isCFF2 - ) - self.charStrings = charStrings = {} - for i in range(len(charset)): - charStrings[charset[i]] = i - # read from OTF file: charStrings.values() are indices into - # charStringsIndex. - self.charStringsAreIndexed = 1 - else: - self.charStrings = {} - # read from ttx file: charStrings.values() are actual charstrings - self.charStringsAreIndexed = 0 - self.private = private - if fdSelect is not None: - self.fdSelect = fdSelect - if fdArray is not None: - self.fdArray = fdArray - - def keys(self): - return list(self.charStrings.keys()) - - def values(self): - if self.charStringsAreIndexed: - return self.charStringsIndex - else: - return list(self.charStrings.values()) - - def has_key(self, name): - return name in self.charStrings - - __contains__ = has_key - - def __len__(self): - return len(self.charStrings) - - def __getitem__(self, name): - charString = self.charStrings[name] - if self.charStringsAreIndexed: - charString = self.charStringsIndex[charString] - return charString - - def __setitem__(self, name, charString): - if self.charStringsAreIndexed: - index = self.charStrings[name] - self.charStringsIndex[index] = charString - else: - self.charStrings[name] = charString - - def getItemAndSelector(self, name): - if self.charStringsAreIndexed: - index = self.charStrings[name] - return self.charStringsIndex.getItemAndSelector(index) - else: - if hasattr(self, "fdArray"): - if hasattr(self, "fdSelect"): - sel = self.charStrings[name].fdSelectIndex - else: - sel = 0 - else: - sel = None - return self.charStrings[name], sel - - def toXML(self, xmlWriter): - names = sorted(self.keys()) - for name in names: - charStr, fdSelectIndex = self.getItemAndSelector(name) - if charStr.needsDecompilation(): - raw = [("raw", 1)] - else: - raw = [] - if fdSelectIndex is None: - xmlWriter.begintag("CharString", [("name", name)] + raw) - else: - xmlWriter.begintag( - "CharString", - [("name", name), ("fdSelectIndex", fdSelectIndex)] + raw, - ) - xmlWriter.newline() - charStr.toXML(xmlWriter) - xmlWriter.endtag("CharString") - xmlWriter.newline() - - def fromXML(self, name, attrs, content): - for element in content: - if isinstance(element, str): - continue - name, attrs, content = element - if name != "CharString": - continue - fdID = -1 - if hasattr(self, "fdArray"): - try: - fdID = safeEval(attrs["fdSelectIndex"]) - except KeyError: - fdID = 0 - private = self.fdArray[fdID].Private - else: - private = self.private - - glyphName = attrs["name"] - charStringClass = psCharStrings.T2CharString - charString = charStringClass(private=private, globalSubrs=self.globalSubrs) - charString.fromXML(name, attrs, content) - if fdID >= 0: - charString.fdSelectIndex = fdID - self[glyphName] = charString - - -def readCard8(file): - return byteord(file.read(1)) - - -def readCard16(file): - (value,) = struct.unpack(">H", file.read(2)) - return value - - -def readCard32(file): - (value,) = struct.unpack(">L", file.read(4)) - return value - - -def writeCard8(file, value): - file.write(bytechr(value)) - - -def writeCard16(file, value): - file.write(struct.pack(">H", value)) - - -def writeCard32(file, value): - file.write(struct.pack(">L", value)) - - -def packCard8(value): - return bytechr(value) - - -def packCard16(value): - return struct.pack(">H", value) - - -def packCard32(value): - return struct.pack(">L", value) - - -def buildOperatorDict(table): - d = {} - for op, name, arg, default, conv in table: - d[op] = (name, arg) - return d - - -def buildOpcodeDict(table): - d = {} - for op, name, arg, default, conv in table: - if isinstance(op, tuple): - op = bytechr(op[0]) + bytechr(op[1]) - else: - op = bytechr(op) - d[name] = (op, arg) - return d - - -def buildOrder(table): - l = [] - for op, name, arg, default, conv in table: - l.append(name) - return l - - -def buildDefaults(table): - d = {} - for op, name, arg, default, conv in table: - if default is not None: - d[name] = default - return d - - -def buildConverters(table): - d = {} - for op, name, arg, default, conv in table: - d[name] = conv - return d - - -class SimpleConverter(object): - def read(self, parent, value): - if not hasattr(parent, "file"): - return self._read(parent, value) - file = parent.file - pos = file.tell() - try: - return self._read(parent, value) - finally: - file.seek(pos) - - def _read(self, parent, value): - return value - - def write(self, parent, value): - return value - - def xmlWrite(self, xmlWriter, name, value): - xmlWriter.simpletag(name, value=value) - xmlWriter.newline() - - def xmlRead(self, name, attrs, content, parent): - return attrs["value"] - - -class ASCIIConverter(SimpleConverter): - def _read(self, parent, value): - return tostr(value, encoding="ascii") - - def write(self, parent, value): - return tobytes(value, encoding="ascii") - - def xmlWrite(self, xmlWriter, name, value): - xmlWriter.simpletag(name, value=tostr(value, encoding="ascii")) - xmlWriter.newline() - - def xmlRead(self, name, attrs, content, parent): - return tobytes(attrs["value"], encoding=("ascii")) - - -class Latin1Converter(SimpleConverter): - def _read(self, parent, value): - return tostr(value, encoding="latin1") - - def write(self, parent, value): - return tobytes(value, encoding="latin1") - - def xmlWrite(self, xmlWriter, name, value): - value = tostr(value, encoding="latin1") - if name in ["Notice", "Copyright"]: - value = re.sub(r"[\r\n]\s+", " ", value) - xmlWriter.simpletag(name, value=value) - xmlWriter.newline() - - def xmlRead(self, name, attrs, content, parent): - return tobytes(attrs["value"], encoding=("latin1")) - - -def parseNum(s): - try: - value = int(s) - except: - value = float(s) - return value - - -def parseBlendList(s): - valueList = [] - for element in s: - if isinstance(element, str): - continue - name, attrs, content = element - blendList = attrs["value"].split() - blendList = [eval(val) for val in blendList] - valueList.append(blendList) - if len(valueList) == 1: - valueList = valueList[0] - return valueList - - -class NumberConverter(SimpleConverter): - def xmlWrite(self, xmlWriter, name, value): - if isinstance(value, list): - xmlWriter.begintag(name) - xmlWriter.newline() - xmlWriter.indent() - blendValue = " ".join([str(val) for val in value]) - xmlWriter.simpletag(kBlendDictOpName, value=blendValue) - xmlWriter.newline() - xmlWriter.dedent() - xmlWriter.endtag(name) - xmlWriter.newline() - else: - xmlWriter.simpletag(name, value=value) - xmlWriter.newline() - - def xmlRead(self, name, attrs, content, parent): - valueString = attrs.get("value", None) - if valueString is None: - value = parseBlendList(content) - else: - value = parseNum(attrs["value"]) - return value - - -class ArrayConverter(SimpleConverter): - def xmlWrite(self, xmlWriter, name, value): - if value and isinstance(value[0], list): - xmlWriter.begintag(name) - xmlWriter.newline() - xmlWriter.indent() - for valueList in value: - blendValue = " ".join([str(val) for val in valueList]) - xmlWriter.simpletag(kBlendDictOpName, value=blendValue) - xmlWriter.newline() - xmlWriter.dedent() - xmlWriter.endtag(name) - xmlWriter.newline() - else: - value = " ".join([str(val) for val in value]) - xmlWriter.simpletag(name, value=value) - xmlWriter.newline() - - def xmlRead(self, name, attrs, content, parent): - valueString = attrs.get("value", None) - if valueString is None: - valueList = parseBlendList(content) - else: - values = valueString.split() - valueList = [parseNum(value) for value in values] - return valueList - - -class TableConverter(SimpleConverter): - def xmlWrite(self, xmlWriter, name, value): - xmlWriter.begintag(name) - xmlWriter.newline() - value.toXML(xmlWriter) - xmlWriter.endtag(name) - xmlWriter.newline() - - def xmlRead(self, name, attrs, content, parent): - ob = self.getClass()() - for element in content: - if isinstance(element, str): - continue - name, attrs, content = element - ob.fromXML(name, attrs, content) - return ob - - -class PrivateDictConverter(TableConverter): - def getClass(self): - return PrivateDict - - def _read(self, parent, value): - size, offset = value - file = parent.file - isCFF2 = parent._isCFF2 - try: - vstore = parent.vstore - except AttributeError: - vstore = None - priv = PrivateDict(parent.strings, file, offset, isCFF2=isCFF2, vstore=vstore) - file.seek(offset) - data = file.read(size) - assert len(data) == size - priv.decompile(data) - return priv - - def write(self, parent, value): - return (0, 0) # dummy value - - -class SubrsConverter(TableConverter): - def getClass(self): - return SubrsIndex - - def _read(self, parent, value): - file = parent.file - isCFF2 = parent._isCFF2 - file.seek(parent.offset + value) # Offset(self) - return SubrsIndex(file, isCFF2=isCFF2) - - def write(self, parent, value): - return 0 # dummy value - - -class CharStringsConverter(TableConverter): - def _read(self, parent, value): - file = parent.file - isCFF2 = parent._isCFF2 - charset = parent.charset - varStore = getattr(parent, "VarStore", None) - globalSubrs = parent.GlobalSubrs - if hasattr(parent, "FDArray"): - fdArray = parent.FDArray - if hasattr(parent, "FDSelect"): - fdSelect = parent.FDSelect - else: - fdSelect = None - private = None - else: - fdSelect, fdArray = None, None - private = parent.Private - file.seek(value) # Offset(0) - charStrings = CharStrings( - file, - charset, - globalSubrs, - private, - fdSelect, - fdArray, - isCFF2=isCFF2, - varStore=varStore, - ) - return charStrings - - def write(self, parent, value): - return 0 # dummy value - - def xmlRead(self, name, attrs, content, parent): - if hasattr(parent, "FDArray"): - # if it is a CID-keyed font, then the private Dict is extracted from the - # parent.FDArray - fdArray = parent.FDArray - if hasattr(parent, "FDSelect"): - fdSelect = parent.FDSelect - else: - fdSelect = None - private = None - else: - # if it is a name-keyed font, then the private dict is in the top dict, - # and - # there is no fdArray. - private, fdSelect, fdArray = parent.Private, None, None - charStrings = CharStrings( - None, - None, - parent.GlobalSubrs, - private, - fdSelect, - fdArray, - varStore=getattr(parent, "VarStore", None), - ) - charStrings.fromXML(name, attrs, content) - return charStrings - - -class CharsetConverter(SimpleConverter): - def _read(self, parent, value): - isCID = hasattr(parent, "ROS") - if value > 2: - numGlyphs = parent.numGlyphs - file = parent.file - file.seek(value) - log.log(DEBUG, "loading charset at %s", value) - format = readCard8(file) - if format == 0: - charset = parseCharset0(numGlyphs, file, parent.strings, isCID) - elif format == 1 or format == 2: - charset = parseCharset(numGlyphs, file, parent.strings, isCID, format) - else: - raise NotImplementedError - assert len(charset) == numGlyphs - log.log(DEBUG, " charset end at %s", file.tell()) - # make sure glyph names are unique - allNames = {} - newCharset = [] - for glyphName in charset: - if glyphName in allNames: - # make up a new glyphName that's unique - n = allNames[glyphName] - while (glyphName + "#" + str(n)) in allNames: - n += 1 - allNames[glyphName] = n + 1 - glyphName = glyphName + "#" + str(n) - allNames[glyphName] = 1 - newCharset.append(glyphName) - charset = newCharset - else: # offset == 0 -> no charset data. - if isCID or "CharStrings" not in parent.rawDict: - # We get here only when processing fontDicts from the FDArray of - # CFF-CID fonts. Only the real topDict references the chrset. - assert value == 0 - charset = None - elif value == 0: - charset = cffISOAdobeStrings - elif value == 1: - charset = cffIExpertStrings - elif value == 2: - charset = cffExpertSubsetStrings - if charset and (len(charset) != parent.numGlyphs): - charset = charset[: parent.numGlyphs] - return charset - - def write(self, parent, value): - return 0 # dummy value - - def xmlWrite(self, xmlWriter, name, value): - # XXX only write charset when not in OT/TTX context, where we - # dump charset as a separate "GlyphOrder" table. - # # xmlWriter.simpletag("charset") - xmlWriter.comment("charset is dumped separately as the 'GlyphOrder' element") - xmlWriter.newline() - - def xmlRead(self, name, attrs, content, parent): - pass - - -class CharsetCompiler(object): - def __init__(self, strings, charset, parent): - assert charset[0] == ".notdef" - isCID = hasattr(parent.dictObj, "ROS") - data0 = packCharset0(charset, isCID, strings) - data = packCharset(charset, isCID, strings) - if len(data) < len(data0): - self.data = data - else: - self.data = data0 - self.parent = parent - - def setPos(self, pos, endPos): - self.parent.rawDict["charset"] = pos - - def getDataLength(self): - return len(self.data) - - def toFile(self, file): - file.write(self.data) - - -def getStdCharSet(charset): - # check to see if we can use a predefined charset value. - predefinedCharSetVal = None - predefinedCharSets = [ - (cffISOAdobeStringCount, cffISOAdobeStrings, 0), - (cffExpertStringCount, cffIExpertStrings, 1), - (cffExpertSubsetStringCount, cffExpertSubsetStrings, 2), - ] - lcs = len(charset) - for cnt, pcs, csv in predefinedCharSets: - if predefinedCharSetVal is not None: - break - if lcs > cnt: - continue - predefinedCharSetVal = csv - for i in range(lcs): - if charset[i] != pcs[i]: - predefinedCharSetVal = None - break - return predefinedCharSetVal - - -def getCIDfromName(name, strings): - return int(name[3:]) - - -def getSIDfromName(name, strings): - return strings.getSID(name) - - -def packCharset0(charset, isCID, strings): - fmt = 0 - data = [packCard8(fmt)] - if isCID: - getNameID = getCIDfromName - else: - getNameID = getSIDfromName - - for name in charset[1:]: - data.append(packCard16(getNameID(name, strings))) - return bytesjoin(data) - - -def packCharset(charset, isCID, strings): - fmt = 1 - ranges = [] - first = None - end = 0 - if isCID: - getNameID = getCIDfromName - else: - getNameID = getSIDfromName - - for name in charset[1:]: - SID = getNameID(name, strings) - if first is None: - first = SID - elif end + 1 != SID: - nLeft = end - first - if nLeft > 255: - fmt = 2 - ranges.append((first, nLeft)) - first = SID - end = SID - if end: - nLeft = end - first - if nLeft > 255: - fmt = 2 - ranges.append((first, nLeft)) - - data = [packCard8(fmt)] - if fmt == 1: - nLeftFunc = packCard8 - else: - nLeftFunc = packCard16 - for first, nLeft in ranges: - data.append(packCard16(first) + nLeftFunc(nLeft)) - return bytesjoin(data) - - -def parseCharset0(numGlyphs, file, strings, isCID): - charset = [".notdef"] - if isCID: - for i in range(numGlyphs - 1): - CID = readCard16(file) - charset.append("cid" + str(CID).zfill(5)) - else: - for i in range(numGlyphs - 1): - SID = readCard16(file) - charset.append(strings[SID]) - return charset - - -def parseCharset(numGlyphs, file, strings, isCID, fmt): - charset = [".notdef"] - count = 1 - if fmt == 1: - nLeftFunc = readCard8 - else: - nLeftFunc = readCard16 - while count < numGlyphs: - first = readCard16(file) - nLeft = nLeftFunc(file) - if isCID: - for CID in range(first, first + nLeft + 1): - charset.append("cid" + str(CID).zfill(5)) - else: - for SID in range(first, first + nLeft + 1): - charset.append(strings[SID]) - count = count + nLeft + 1 - return charset - - -class EncodingCompiler(object): - def __init__(self, strings, encoding, parent): - assert not isinstance(encoding, str) - data0 = packEncoding0(parent.dictObj.charset, encoding, parent.strings) - data1 = packEncoding1(parent.dictObj.charset, encoding, parent.strings) - if len(data0) < len(data1): - self.data = data0 - else: - self.data = data1 - self.parent = parent - - def setPos(self, pos, endPos): - self.parent.rawDict["Encoding"] = pos - - def getDataLength(self): - return len(self.data) - - def toFile(self, file): - file.write(self.data) - - -class EncodingConverter(SimpleConverter): - def _read(self, parent, value): - if value == 0: - return "StandardEncoding" - elif value == 1: - return "ExpertEncoding" - else: - assert value > 1 - file = parent.file - file.seek(value) - log.log(DEBUG, "loading Encoding at %s", value) - fmt = readCard8(file) - haveSupplement = fmt & 0x80 - if haveSupplement: - raise NotImplementedError("Encoding supplements are not yet supported") - fmt = fmt & 0x7F - if fmt == 0: - encoding = parseEncoding0( - parent.charset, file, haveSupplement, parent.strings - ) - elif fmt == 1: - encoding = parseEncoding1( - parent.charset, file, haveSupplement, parent.strings - ) - return encoding - - def write(self, parent, value): - if value == "StandardEncoding": - return 0 - elif value == "ExpertEncoding": - return 1 - return 0 # dummy value - - def xmlWrite(self, xmlWriter, name, value): - if value in ("StandardEncoding", "ExpertEncoding"): - xmlWriter.simpletag(name, name=value) - xmlWriter.newline() - return - xmlWriter.begintag(name) - xmlWriter.newline() - for code in range(len(value)): - glyphName = value[code] - if glyphName != ".notdef": - xmlWriter.simpletag("map", code=hex(code), name=glyphName) - xmlWriter.newline() - xmlWriter.endtag(name) - xmlWriter.newline() - - def xmlRead(self, name, attrs, content, parent): - if "name" in attrs: - return attrs["name"] - encoding = [".notdef"] * 256 - for element in content: - if isinstance(element, str): - continue - name, attrs, content = element - code = safeEval(attrs["code"]) - glyphName = attrs["name"] - encoding[code] = glyphName - return encoding - - -def parseEncoding0(charset, file, haveSupplement, strings): - nCodes = readCard8(file) - encoding = [".notdef"] * 256 - for glyphID in range(1, nCodes + 1): - code = readCard8(file) - if code != 0: - encoding[code] = charset[glyphID] - return encoding - - -def parseEncoding1(charset, file, haveSupplement, strings): - nRanges = readCard8(file) - encoding = [".notdef"] * 256 - glyphID = 1 - for i in range(nRanges): - code = readCard8(file) - nLeft = readCard8(file) - for glyphID in range(glyphID, glyphID + nLeft + 1): - encoding[code] = charset[glyphID] - code = code + 1 - glyphID = glyphID + 1 - return encoding - - -def packEncoding0(charset, encoding, strings): - fmt = 0 - m = {} - for code in range(len(encoding)): - name = encoding[code] - if name != ".notdef": - m[name] = code - codes = [] - for name in charset[1:]: - code = m.get(name) - codes.append(code) - - while codes and codes[-1] is None: - codes.pop() - - data = [packCard8(fmt), packCard8(len(codes))] - for code in codes: - if code is None: - code = 0 - data.append(packCard8(code)) - return bytesjoin(data) - - -def packEncoding1(charset, encoding, strings): - fmt = 1 - m = {} - for code in range(len(encoding)): - name = encoding[code] - if name != ".notdef": - m[name] = code - ranges = [] - first = None - end = 0 - for name in charset[1:]: - code = m.get(name, -1) - if first is None: - first = code - elif end + 1 != code: - nLeft = end - first - ranges.append((first, nLeft)) - first = code - end = code - nLeft = end - first - ranges.append((first, nLeft)) - - # remove unencoded glyphs at the end. - while ranges and ranges[-1][0] == -1: - ranges.pop() - - data = [packCard8(fmt), packCard8(len(ranges))] - for first, nLeft in ranges: - if first == -1: # unencoded - first = 0 - data.append(packCard8(first) + packCard8(nLeft)) - return bytesjoin(data) - - -class FDArrayConverter(TableConverter): - def _read(self, parent, value): - try: - vstore = parent.VarStore - except AttributeError: - vstore = None - file = parent.file - isCFF2 = parent._isCFF2 - file.seek(value) - fdArray = FDArrayIndex(file, isCFF2=isCFF2) - fdArray.vstore = vstore - fdArray.strings = parent.strings - fdArray.GlobalSubrs = parent.GlobalSubrs - return fdArray - - def write(self, parent, value): - return 0 # dummy value - - def xmlRead(self, name, attrs, content, parent): - fdArray = FDArrayIndex() - for element in content: - if isinstance(element, str): - continue - name, attrs, content = element - fdArray.fromXML(name, attrs, content) - return fdArray - - -class FDSelectConverter(SimpleConverter): - def _read(self, parent, value): - file = parent.file - file.seek(value) - fdSelect = FDSelect(file, parent.numGlyphs) - return fdSelect - - def write(self, parent, value): - return 0 # dummy value - - # The FDSelect glyph data is written out to XML in the charstring keys, - # so we write out only the format selector - def xmlWrite(self, xmlWriter, name, value): - xmlWriter.simpletag(name, [("format", value.format)]) - xmlWriter.newline() - - def xmlRead(self, name, attrs, content, parent): - fmt = safeEval(attrs["format"]) - file = None - numGlyphs = None - fdSelect = FDSelect(file, numGlyphs, fmt) - return fdSelect - - -class VarStoreConverter(SimpleConverter): - def _read(self, parent, value): - file = parent.file - file.seek(value) - varStore = VarStoreData(file) - varStore.decompile() - return varStore - - def write(self, parent, value): - return 0 # dummy value - - def xmlWrite(self, xmlWriter, name, value): - value.writeXML(xmlWriter, name) - - def xmlRead(self, name, attrs, content, parent): - varStore = VarStoreData() - varStore.xmlRead(name, attrs, content, parent) - return varStore - - -def packFDSelect0(fdSelectArray): - fmt = 0 - data = [packCard8(fmt)] - for index in fdSelectArray: - data.append(packCard8(index)) - return bytesjoin(data) - - -def packFDSelect3(fdSelectArray): - fmt = 3 - fdRanges = [] - lenArray = len(fdSelectArray) - lastFDIndex = -1 - for i in range(lenArray): - fdIndex = fdSelectArray[i] - if lastFDIndex != fdIndex: - fdRanges.append([i, fdIndex]) - lastFDIndex = fdIndex - sentinelGID = i + 1 - - data = [packCard8(fmt)] - data.append(packCard16(len(fdRanges))) - for fdRange in fdRanges: - data.append(packCard16(fdRange[0])) - data.append(packCard8(fdRange[1])) - data.append(packCard16(sentinelGID)) - return bytesjoin(data) - - -def packFDSelect4(fdSelectArray): - fmt = 4 - fdRanges = [] - lenArray = len(fdSelectArray) - lastFDIndex = -1 - for i in range(lenArray): - fdIndex = fdSelectArray[i] - if lastFDIndex != fdIndex: - fdRanges.append([i, fdIndex]) - lastFDIndex = fdIndex - sentinelGID = i + 1 - - data = [packCard8(fmt)] - data.append(packCard32(len(fdRanges))) - for fdRange in fdRanges: - data.append(packCard32(fdRange[0])) - data.append(packCard16(fdRange[1])) - data.append(packCard32(sentinelGID)) - return bytesjoin(data) - - -class FDSelectCompiler(object): - def __init__(self, fdSelect, parent): - fmt = fdSelect.format - fdSelectArray = fdSelect.gidArray - if fmt == 0: - self.data = packFDSelect0(fdSelectArray) - elif fmt == 3: - self.data = packFDSelect3(fdSelectArray) - elif fmt == 4: - self.data = packFDSelect4(fdSelectArray) - else: - # choose smaller of the two formats - data0 = packFDSelect0(fdSelectArray) - data3 = packFDSelect3(fdSelectArray) - if len(data0) < len(data3): - self.data = data0 - fdSelect.format = 0 - else: - self.data = data3 - fdSelect.format = 3 - - self.parent = parent - - def setPos(self, pos, endPos): - self.parent.rawDict["FDSelect"] = pos - - def getDataLength(self): - return len(self.data) - - def toFile(self, file): - file.write(self.data) - - -class VarStoreCompiler(object): - def __init__(self, varStoreData, parent): - self.parent = parent - if not varStoreData.data: - varStoreData.compile() - data = [packCard16(len(varStoreData.data)), varStoreData.data] - self.data = bytesjoin(data) - - def setPos(self, pos, endPos): - self.parent.rawDict["VarStore"] = pos - - def getDataLength(self): - return len(self.data) - - def toFile(self, file): - file.write(self.data) - - -class ROSConverter(SimpleConverter): - def xmlWrite(self, xmlWriter, name, value): - registry, order, supplement = value - xmlWriter.simpletag( - name, - [ - ("Registry", tostr(registry)), - ("Order", tostr(order)), - ("Supplement", supplement), - ], - ) - xmlWriter.newline() - - def xmlRead(self, name, attrs, content, parent): - return (attrs["Registry"], attrs["Order"], safeEval(attrs["Supplement"])) - - -topDictOperators = [ - # opcode name argument type default converter - (25, "maxstack", "number", None, None), - ((12, 30), "ROS", ("SID", "SID", "number"), None, ROSConverter()), - ((12, 20), "SyntheticBase", "number", None, None), - (0, "version", "SID", None, None), - (1, "Notice", "SID", None, Latin1Converter()), - ((12, 0), "Copyright", "SID", None, Latin1Converter()), - (2, "FullName", "SID", None, Latin1Converter()), - ((12, 38), "FontName", "SID", None, Latin1Converter()), - (3, "FamilyName", "SID", None, Latin1Converter()), - (4, "Weight", "SID", None, None), - ((12, 1), "isFixedPitch", "number", 0, None), - ((12, 2), "ItalicAngle", "number", 0, None), - ((12, 3), "UnderlinePosition", "number", -100, None), - ((12, 4), "UnderlineThickness", "number", 50, None), - ((12, 5), "PaintType", "number", 0, None), - ((12, 6), "CharstringType", "number", 2, None), - ((12, 7), "FontMatrix", "array", [0.001, 0, 0, 0.001, 0, 0], None), - (13, "UniqueID", "number", None, None), - (5, "FontBBox", "array", [0, 0, 0, 0], None), - ((12, 8), "StrokeWidth", "number", 0, None), - (14, "XUID", "array", None, None), - ((12, 21), "PostScript", "SID", None, None), - ((12, 22), "BaseFontName", "SID", None, None), - ((12, 23), "BaseFontBlend", "delta", None, None), - ((12, 31), "CIDFontVersion", "number", 0, None), - ((12, 32), "CIDFontRevision", "number", 0, None), - ((12, 33), "CIDFontType", "number", 0, None), - ((12, 34), "CIDCount", "number", 8720, None), - (15, "charset", "number", None, CharsetConverter()), - ((12, 35), "UIDBase", "number", None, None), - (16, "Encoding", "number", 0, EncodingConverter()), - (18, "Private", ("number", "number"), None, PrivateDictConverter()), - ((12, 37), "FDSelect", "number", None, FDSelectConverter()), - ((12, 36), "FDArray", "number", None, FDArrayConverter()), - (17, "CharStrings", "number", None, CharStringsConverter()), - (24, "VarStore", "number", None, VarStoreConverter()), -] - -topDictOperators2 = [ - # opcode name argument type default converter - (25, "maxstack", "number", None, None), - ((12, 7), "FontMatrix", "array", [0.001, 0, 0, 0.001, 0, 0], None), - ((12, 37), "FDSelect", "number", None, FDSelectConverter()), - ((12, 36), "FDArray", "number", None, FDArrayConverter()), - (17, "CharStrings", "number", None, CharStringsConverter()), - (24, "VarStore", "number", None, VarStoreConverter()), -] - -# Note! FDSelect and FDArray must both preceed CharStrings in the output XML build order, -# in order for the font to compile back from xml. - -kBlendDictOpName = "blend" -blendOp = 23 - -privateDictOperators = [ - # opcode name argument type default converter - (22, "vsindex", "number", None, None), - ( - blendOp, - kBlendDictOpName, - "blendList", - None, - None, - ), # This is for reading to/from XML: it not written to CFF. - (6, "BlueValues", "delta", None, None), - (7, "OtherBlues", "delta", None, None), - (8, "FamilyBlues", "delta", None, None), - (9, "FamilyOtherBlues", "delta", None, None), - ((12, 9), "BlueScale", "number", 0.039625, None), - ((12, 10), "BlueShift", "number", 7, None), - ((12, 11), "BlueFuzz", "number", 1, None), - (10, "StdHW", "number", None, None), - (11, "StdVW", "number", None, None), - ((12, 12), "StemSnapH", "delta", None, None), - ((12, 13), "StemSnapV", "delta", None, None), - ((12, 14), "ForceBold", "number", 0, None), - ((12, 15), "ForceBoldThreshold", "number", None, None), # deprecated - ((12, 16), "lenIV", "number", None, None), # deprecated - ((12, 17), "LanguageGroup", "number", 0, None), - ((12, 18), "ExpansionFactor", "number", 0.06, None), - ((12, 19), "initialRandomSeed", "number", 0, None), - (20, "defaultWidthX", "number", 0, None), - (21, "nominalWidthX", "number", 0, None), - (19, "Subrs", "number", None, SubrsConverter()), -] - -privateDictOperators2 = [ - # opcode name argument type default converter - (22, "vsindex", "number", None, None), - ( - blendOp, - kBlendDictOpName, - "blendList", - None, - None, - ), # This is for reading to/from XML: it not written to CFF. - (6, "BlueValues", "delta", None, None), - (7, "OtherBlues", "delta", None, None), - (8, "FamilyBlues", "delta", None, None), - (9, "FamilyOtherBlues", "delta", None, None), - ((12, 9), "BlueScale", "number", 0.039625, None), - ((12, 10), "BlueShift", "number", 7, None), - ((12, 11), "BlueFuzz", "number", 1, None), - (10, "StdHW", "number", None, None), - (11, "StdVW", "number", None, None), - ((12, 12), "StemSnapH", "delta", None, None), - ((12, 13), "StemSnapV", "delta", None, None), - ((12, 17), "LanguageGroup", "number", 0, None), - ((12, 18), "ExpansionFactor", "number", 0.06, None), - (19, "Subrs", "number", None, SubrsConverter()), -] - - -def addConverters(table): - for i in range(len(table)): - op, name, arg, default, conv = table[i] - if conv is not None: - continue - if arg in ("delta", "array"): - conv = ArrayConverter() - elif arg == "number": - conv = NumberConverter() - elif arg == "SID": - conv = ASCIIConverter() - elif arg == "blendList": - conv = None - else: - assert False - table[i] = op, name, arg, default, conv - - -addConverters(privateDictOperators) -addConverters(topDictOperators) - - -class TopDictDecompiler(psCharStrings.DictDecompiler): - operators = buildOperatorDict(topDictOperators) - - -class PrivateDictDecompiler(psCharStrings.DictDecompiler): - operators = buildOperatorDict(privateDictOperators) - - -class DictCompiler(object): - maxBlendStack = 0 - - def __init__(self, dictObj, strings, parent, isCFF2=None): - if strings: - assert isinstance(strings, IndexedStrings) - if isCFF2 is None and hasattr(parent, "isCFF2"): - isCFF2 = parent.isCFF2 - assert isCFF2 is not None - self.isCFF2 = isCFF2 - self.dictObj = dictObj - self.strings = strings - self.parent = parent - rawDict = {} - for name in dictObj.order: - value = getattr(dictObj, name, None) - if value is None: - continue - conv = dictObj.converters[name] - value = conv.write(dictObj, value) - if value == dictObj.defaults.get(name): - continue - rawDict[name] = value - self.rawDict = rawDict - - def setPos(self, pos, endPos): - pass - - def getDataLength(self): - return len(self.compile("getDataLength")) - - def compile(self, reason): - log.log(DEBUG, "-- compiling %s for %s", self.__class__.__name__, reason) - rawDict = self.rawDict - data = [] - for name in self.dictObj.order: - value = rawDict.get(name) - if value is None: - continue - op, argType = self.opcodes[name] - if isinstance(argType, tuple): - l = len(argType) - assert len(value) == l, "value doesn't match arg type" - for i in range(l): - arg = argType[i] - v = value[i] - arghandler = getattr(self, "arg_" + arg) - data.append(arghandler(v)) - else: - arghandler = getattr(self, "arg_" + argType) - data.append(arghandler(value)) - data.append(op) - data = bytesjoin(data) - return data - - def toFile(self, file): - data = self.compile("toFile") - file.write(data) - - def arg_number(self, num): - if isinstance(num, list): - data = [encodeNumber(val) for val in num] - data.append(encodeNumber(1)) - data.append(bytechr(blendOp)) - datum = bytesjoin(data) - else: - datum = encodeNumber(num) - return datum - - def arg_SID(self, s): - return psCharStrings.encodeIntCFF(self.strings.getSID(s)) - - def arg_array(self, value): - data = [] - for num in value: - data.append(self.arg_number(num)) - return bytesjoin(data) - - def arg_delta(self, value): - if not value: - return b"" - val0 = value[0] - if isinstance(val0, list): - data = self.arg_delta_blend(value) - else: - out = [] - last = 0 - for v in value: - out.append(v - last) - last = v - data = [] - for num in out: - data.append(encodeNumber(num)) - return bytesjoin(data) - - def arg_delta_blend(self, value): - """A delta list with blend lists has to be *all* blend lists. - - The value is a list is arranged as follows:: - - [ - [V0, d0..dn] - [V1, d0..dn] - ... - [Vm, d0..dn] - ] - - ``V`` is the absolute coordinate value from the default font, and ``d0-dn`` - are the delta values from the *n* regions. Each ``V`` is an absolute - coordinate from the default font. - - We want to return a list:: - - [ - [v0, v1..vm] - [d0..dn] - ... - [d0..dn] - numBlends - blendOp - ] - - where each ``v`` is relative to the previous default font value. - """ - numMasters = len(value[0]) - numBlends = len(value) - numStack = (numBlends * numMasters) + 1 - if numStack > self.maxBlendStack: - # Figure out the max number of value we can blend - # and divide this list up into chunks of that size. - - numBlendValues = int((self.maxBlendStack - 1) / numMasters) - out = [] - while True: - numVal = min(len(value), numBlendValues) - if numVal == 0: - break - valList = value[0:numVal] - out1 = self.arg_delta_blend(valList) - out.extend(out1) - value = value[numVal:] - else: - firstList = [0] * numBlends - deltaList = [None] * numBlends - i = 0 - prevVal = 0 - while i < numBlends: - # For PrivateDict BlueValues, the default font - # values are absolute, not relative. - # Must convert these back to relative coordinates - # befor writing to CFF2. - defaultValue = value[i][0] - firstList[i] = defaultValue - prevVal - prevVal = defaultValue - deltaList[i] = value[i][1:] - i += 1 - - relValueList = firstList - for blendList in deltaList: - relValueList.extend(blendList) - out = [encodeNumber(val) for val in relValueList] - out.append(encodeNumber(numBlends)) - out.append(bytechr(blendOp)) - return out - - -def encodeNumber(num): - if isinstance(num, float): - return psCharStrings.encodeFloat(num) - else: - return psCharStrings.encodeIntCFF(num) - - -class TopDictCompiler(DictCompiler): - opcodes = buildOpcodeDict(topDictOperators) - - def getChildren(self, strings): - isCFF2 = self.isCFF2 - children = [] - if self.dictObj.cff2GetGlyphOrder is None: - if hasattr(self.dictObj, "charset") and self.dictObj.charset: - if hasattr(self.dictObj, "ROS"): # aka isCID - charsetCode = None - else: - charsetCode = getStdCharSet(self.dictObj.charset) - if charsetCode is None: - children.append( - CharsetCompiler(strings, self.dictObj.charset, self) - ) - else: - self.rawDict["charset"] = charsetCode - if hasattr(self.dictObj, "Encoding") and self.dictObj.Encoding: - encoding = self.dictObj.Encoding - if not isinstance(encoding, str): - children.append(EncodingCompiler(strings, encoding, self)) - else: - if hasattr(self.dictObj, "VarStore"): - varStoreData = self.dictObj.VarStore - varStoreComp = VarStoreCompiler(varStoreData, self) - children.append(varStoreComp) - if hasattr(self.dictObj, "FDSelect"): - # I have not yet supported merging a ttx CFF-CID font, as there are - # interesting issues about merging the FDArrays. Here I assume that - # either the font was read from XML, and the FDSelect indices are all - # in the charstring data, or the FDSelect array is already fully defined. - fdSelect = self.dictObj.FDSelect - # probably read in from XML; assume fdIndex in CharString data - if len(fdSelect) == 0: - charStrings = self.dictObj.CharStrings - for name in self.dictObj.charset: - fdSelect.append(charStrings[name].fdSelectIndex) - fdSelectComp = FDSelectCompiler(fdSelect, self) - children.append(fdSelectComp) - if hasattr(self.dictObj, "CharStrings"): - items = [] - charStrings = self.dictObj.CharStrings - for name in self.dictObj.charset: - items.append(charStrings[name]) - charStringsComp = CharStringsCompiler(items, strings, self, isCFF2=isCFF2) - children.append(charStringsComp) - if hasattr(self.dictObj, "FDArray"): - # I have not yet supported merging a ttx CFF-CID font, as there are - # interesting issues about merging the FDArrays. Here I assume that the - # FDArray info is correct and complete. - fdArrayIndexComp = self.dictObj.FDArray.getCompiler(strings, self) - children.append(fdArrayIndexComp) - children.extend(fdArrayIndexComp.getChildren(strings)) - if hasattr(self.dictObj, "Private"): - privComp = self.dictObj.Private.getCompiler(strings, self) - children.append(privComp) - children.extend(privComp.getChildren(strings)) - return children - - -class FontDictCompiler(DictCompiler): - opcodes = buildOpcodeDict(topDictOperators) - - def __init__(self, dictObj, strings, parent, isCFF2=None): - super(FontDictCompiler, self).__init__(dictObj, strings, parent, isCFF2=isCFF2) - # - # We now take some effort to detect if there were any key/value pairs - # supplied that were ignored in the FontDict context, and issue a warning - # for those cases. - # - ignoredNames = [] - dictObj = self.dictObj - for name in sorted(set(dictObj.converters) - set(dictObj.order)): - if name in dictObj.rawDict: - # The font was directly read from binary. In this - # case, we want to report *all* "useless" key/value - # pairs that are in the font, not just the ones that - # are different from the default. - ignoredNames.append(name) - else: - # The font was probably read from a TTX file. We only - # warn about keys whos value is not the default. The - # ones that have the default value will not be written - # to binary anyway. - default = dictObj.defaults.get(name) - if default is not None: - conv = dictObj.converters[name] - default = conv.read(dictObj, default) - if getattr(dictObj, name, None) != default: - ignoredNames.append(name) - if ignoredNames: - log.warning( - "Some CFF FDArray/FontDict keys were ignored upon compile: " - + " ".join(sorted(ignoredNames)) - ) - - def getChildren(self, strings): - children = [] - if hasattr(self.dictObj, "Private"): - privComp = self.dictObj.Private.getCompiler(strings, self) - children.append(privComp) - children.extend(privComp.getChildren(strings)) - return children - - -class PrivateDictCompiler(DictCompiler): - maxBlendStack = maxStackLimit - opcodes = buildOpcodeDict(privateDictOperators) - - def setPos(self, pos, endPos): - size = endPos - pos - self.parent.rawDict["Private"] = size, pos - self.pos = pos - - def getChildren(self, strings): - children = [] - if hasattr(self.dictObj, "Subrs"): - children.append(self.dictObj.Subrs.getCompiler(strings, self)) - return children - - -class BaseDict(object): - def __init__(self, strings=None, file=None, offset=None, isCFF2=None): - assert (isCFF2 is None) == (file is None) - self.rawDict = {} - self.skipNames = [] - self.strings = strings - if file is None: - return - self._isCFF2 = isCFF2 - self.file = file - if offset is not None: - log.log(DEBUG, "loading %s at %s", self.__class__.__name__, offset) - self.offset = offset - - def decompile(self, data): - log.log(DEBUG, " length %s is %d", self.__class__.__name__, len(data)) - dec = self.decompilerClass(self.strings, self) - dec.decompile(data) - self.rawDict = dec.getDict() - self.postDecompile() - - def postDecompile(self): - pass - - def getCompiler(self, strings, parent, isCFF2=None): - return self.compilerClass(self, strings, parent, isCFF2=isCFF2) - - def __getattr__(self, name): - if name[:2] == name[-2:] == "__": - # to make deepcopy() and pickle.load() work, we need to signal with - # AttributeError that dunder methods like '__deepcopy__' or '__getstate__' - # aren't implemented. For more details, see: - # https://github.com/fonttools/fonttools/pull/1488 - raise AttributeError(name) - value = self.rawDict.get(name, None) - if value is None: - value = self.defaults.get(name) - if value is None: - raise AttributeError(name) - conv = self.converters[name] - value = conv.read(self, value) - setattr(self, name, value) - return value - - def toXML(self, xmlWriter): - for name in self.order: - if name in self.skipNames: - continue - value = getattr(self, name, None) - # XXX For "charset" we never skip calling xmlWrite even if the - # value is None, so we always write the following XML comment: - # - # - # - # Charset is None when 'CFF ' table is imported from XML into an - # empty TTFont(). By writing this comment all the time, we obtain - # the same XML output whether roundtripping XML-to-XML or - # dumping binary-to-XML - if value is None and name != "charset": - continue - conv = self.converters[name] - conv.xmlWrite(xmlWriter, name, value) - ignoredNames = set(self.rawDict) - set(self.order) - if ignoredNames: - xmlWriter.comment( - "some keys were ignored: %s" % " ".join(sorted(ignoredNames)) - ) - xmlWriter.newline() - - def fromXML(self, name, attrs, content): - conv = self.converters[name] - value = conv.xmlRead(name, attrs, content, self) - setattr(self, name, value) - - -class TopDict(BaseDict): - """The ``TopDict`` represents the top-level dictionary holding font - information. CFF2 tables contain a restricted set of top-level entries - as described `here `_, - but CFF tables may contain a wider range of information. This information - can be accessed through attributes or through the dictionary returned - through the ``rawDict`` property: - - .. code:: python - - font = tt["CFF "].cff[0] - font.FamilyName - # 'Linux Libertine O' - font.rawDict["FamilyName"] - # 'Linux Libertine O' - - More information is available in the CFF file's private dictionary, accessed - via the ``Private`` property: - - .. code:: python - - tt["CFF "].cff[0].Private.BlueValues - # [-15, 0, 515, 515, 666, 666] - - """ - - defaults = buildDefaults(topDictOperators) - converters = buildConverters(topDictOperators) - compilerClass = TopDictCompiler - order = buildOrder(topDictOperators) - decompilerClass = TopDictDecompiler - - def __init__( - self, - strings=None, - file=None, - offset=None, - GlobalSubrs=None, - cff2GetGlyphOrder=None, - isCFF2=None, - ): - super(TopDict, self).__init__(strings, file, offset, isCFF2=isCFF2) - self.cff2GetGlyphOrder = cff2GetGlyphOrder - self.GlobalSubrs = GlobalSubrs - if isCFF2: - self.defaults = buildDefaults(topDictOperators2) - self.charset = cff2GetGlyphOrder() - self.order = buildOrder(topDictOperators2) - else: - self.defaults = buildDefaults(topDictOperators) - self.order = buildOrder(topDictOperators) - - def getGlyphOrder(self): - """Returns a list of glyph names in the CFF font.""" - return self.charset - - def postDecompile(self): - offset = self.rawDict.get("CharStrings") - if offset is None: - return - # get the number of glyphs beforehand. - self.file.seek(offset) - if self._isCFF2: - self.numGlyphs = readCard32(self.file) - else: - self.numGlyphs = readCard16(self.file) - - def toXML(self, xmlWriter): - if hasattr(self, "CharStrings"): - self.decompileAllCharStrings() - if hasattr(self, "ROS"): - self.skipNames = ["Encoding"] - if not hasattr(self, "ROS") or not hasattr(self, "CharStrings"): - # these values have default values, but I only want them to show up - # in CID fonts. - self.skipNames = [ - "CIDFontVersion", - "CIDFontRevision", - "CIDFontType", - "CIDCount", - ] - BaseDict.toXML(self, xmlWriter) - - def decompileAllCharStrings(self): - # Make sure that all the Private Dicts have been instantiated. - for i, charString in enumerate(self.CharStrings.values()): - try: - charString.decompile() - except: - log.error("Error in charstring %s", i) - raise - - def recalcFontBBox(self): - fontBBox = None - for charString in self.CharStrings.values(): - bounds = charString.calcBounds(self.CharStrings) - if bounds is not None: - if fontBBox is not None: - fontBBox = unionRect(fontBBox, bounds) - else: - fontBBox = bounds - - if fontBBox is None: - self.FontBBox = self.defaults["FontBBox"][:] - else: - self.FontBBox = list(intRect(fontBBox)) - - -class FontDict(BaseDict): - # - # Since fonttools used to pass a lot of fields that are not relevant in the FDArray - # FontDict, there are 'ttx' files in the wild that contain all these. These got in - # the ttx files because fonttools writes explicit values for all the TopDict default - # values. These are not actually illegal in the context of an FDArray FontDict - you - # can legally, per spec, put any arbitrary key/value pair in a FontDict - but are - # useless since current major company CFF interpreters ignore anything but the set - # listed in this file. So, we just silently skip them. An exception is Weight: this - # is not used by any interpreter, but some foundries have asked that this be - # supported in FDArray FontDicts just to preserve information about the design when - # the font is being inspected. - # - # On top of that, there are fonts out there that contain such useless FontDict values. - # - # By subclassing TopDict, we *allow* all key/values from TopDict, both when reading - # from binary or when reading from XML, but by overriding `order` with a limited - # list of names, we ensure that only the useful names ever get exported to XML and - # ever get compiled into the binary font. - # - # We override compilerClass so we can warn about "useless" key/value pairs, either - # from the original binary font or from TTX input. - # - # See: - # - https://github.com/fonttools/fonttools/issues/740 - # - https://github.com/fonttools/fonttools/issues/601 - # - https://github.com/adobe-type-tools/afdko/issues/137 - # - defaults = {} - converters = buildConverters(topDictOperators) - compilerClass = FontDictCompiler - orderCFF = ["FontName", "FontMatrix", "Weight", "Private"] - orderCFF2 = ["Private"] - decompilerClass = TopDictDecompiler - - def __init__( - self, - strings=None, - file=None, - offset=None, - GlobalSubrs=None, - isCFF2=None, - vstore=None, - ): - super(FontDict, self).__init__(strings, file, offset, isCFF2=isCFF2) - self.vstore = vstore - self.setCFF2(isCFF2) - - def setCFF2(self, isCFF2): - # isCFF2 may be None. - if isCFF2: - self.order = self.orderCFF2 - self._isCFF2 = True - else: - self.order = self.orderCFF - self._isCFF2 = False - - -class PrivateDict(BaseDict): - defaults = buildDefaults(privateDictOperators) - converters = buildConverters(privateDictOperators) - order = buildOrder(privateDictOperators) - decompilerClass = PrivateDictDecompiler - compilerClass = PrivateDictCompiler - - def __init__(self, strings=None, file=None, offset=None, isCFF2=None, vstore=None): - super(PrivateDict, self).__init__(strings, file, offset, isCFF2=isCFF2) - self.vstore = vstore - if isCFF2: - self.defaults = buildDefaults(privateDictOperators2) - self.order = buildOrder(privateDictOperators2) - # Provide dummy values. This avoids needing to provide - # an isCFF2 state in a lot of places. - self.nominalWidthX = self.defaultWidthX = None - else: - self.defaults = buildDefaults(privateDictOperators) - self.order = buildOrder(privateDictOperators) - - @property - def in_cff2(self): - return self._isCFF2 - - def getNumRegions(self, vi=None): # called from misc/psCharStrings.py - # if getNumRegions is being called, we can assume that VarStore exists. - if vi is None: - if hasattr(self, "vsindex"): - vi = self.vsindex - else: - vi = 0 - numRegions = self.vstore.getNumRegions(vi) - return numRegions - - -class IndexedStrings(object): - """SID -> string mapping.""" - - def __init__(self, file=None): - if file is None: - strings = [] - else: - strings = [tostr(s, encoding="latin1") for s in Index(file, isCFF2=False)] - self.strings = strings - - def getCompiler(self): - return IndexedStringsCompiler(self, None, self, isCFF2=False) - - def __len__(self): - return len(self.strings) - - def __getitem__(self, SID): - if SID < cffStandardStringCount: - return cffStandardStrings[SID] - else: - return self.strings[SID - cffStandardStringCount] - - def getSID(self, s): - if not hasattr(self, "stringMapping"): - self.buildStringMapping() - s = tostr(s, encoding="latin1") - if s in cffStandardStringMapping: - SID = cffStandardStringMapping[s] - elif s in self.stringMapping: - SID = self.stringMapping[s] - else: - SID = len(self.strings) + cffStandardStringCount - self.strings.append(s) - self.stringMapping[s] = SID - return SID - - def getStrings(self): - return self.strings - - def buildStringMapping(self): - self.stringMapping = {} - for index in range(len(self.strings)): - self.stringMapping[self.strings[index]] = index + cffStandardStringCount - - -# The 391 Standard Strings as used in the CFF format. -# from Adobe Technical None #5176, version 1.0, 18 March 1998 - -cffStandardStrings = [ - ".notdef", - "space", - "exclam", - "quotedbl", - "numbersign", - "dollar", - "percent", - "ampersand", - "quoteright", - "parenleft", - "parenright", - "asterisk", - "plus", - "comma", - "hyphen", - "period", - "slash", - "zero", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - "colon", - "semicolon", - "less", - "equal", - "greater", - "question", - "at", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "bracketleft", - "backslash", - "bracketright", - "asciicircum", - "underscore", - "quoteleft", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "braceleft", - "bar", - "braceright", - "asciitilde", - "exclamdown", - "cent", - "sterling", - "fraction", - "yen", - "florin", - "section", - "currency", - "quotesingle", - "quotedblleft", - "guillemotleft", - "guilsinglleft", - "guilsinglright", - "fi", - "fl", - "endash", - "dagger", - "daggerdbl", - "periodcentered", - "paragraph", - "bullet", - "quotesinglbase", - "quotedblbase", - "quotedblright", - "guillemotright", - "ellipsis", - "perthousand", - "questiondown", - "grave", - "acute", - "circumflex", - "tilde", - "macron", - "breve", - "dotaccent", - "dieresis", - "ring", - "cedilla", - "hungarumlaut", - "ogonek", - "caron", - "emdash", - "AE", - "ordfeminine", - "Lslash", - "Oslash", - "OE", - "ordmasculine", - "ae", - "dotlessi", - "lslash", - "oslash", - "oe", - "germandbls", - "onesuperior", - "logicalnot", - "mu", - "trademark", - "Eth", - "onehalf", - "plusminus", - "Thorn", - "onequarter", - "divide", - "brokenbar", - "degree", - "thorn", - "threequarters", - "twosuperior", - "registered", - "minus", - "eth", - "multiply", - "threesuperior", - "copyright", - "Aacute", - "Acircumflex", - "Adieresis", - "Agrave", - "Aring", - "Atilde", - "Ccedilla", - "Eacute", - "Ecircumflex", - "Edieresis", - "Egrave", - "Iacute", - "Icircumflex", - "Idieresis", - "Igrave", - "Ntilde", - "Oacute", - "Ocircumflex", - "Odieresis", - "Ograve", - "Otilde", - "Scaron", - "Uacute", - "Ucircumflex", - "Udieresis", - "Ugrave", - "Yacute", - "Ydieresis", - "Zcaron", - "aacute", - "acircumflex", - "adieresis", - "agrave", - "aring", - "atilde", - "ccedilla", - "eacute", - "ecircumflex", - "edieresis", - "egrave", - "iacute", - "icircumflex", - "idieresis", - "igrave", - "ntilde", - "oacute", - "ocircumflex", - "odieresis", - "ograve", - "otilde", - "scaron", - "uacute", - "ucircumflex", - "udieresis", - "ugrave", - "yacute", - "ydieresis", - "zcaron", - "exclamsmall", - "Hungarumlautsmall", - "dollaroldstyle", - "dollarsuperior", - "ampersandsmall", - "Acutesmall", - "parenleftsuperior", - "parenrightsuperior", - "twodotenleader", - "onedotenleader", - "zerooldstyle", - "oneoldstyle", - "twooldstyle", - "threeoldstyle", - "fouroldstyle", - "fiveoldstyle", - "sixoldstyle", - "sevenoldstyle", - "eightoldstyle", - "nineoldstyle", - "commasuperior", - "threequartersemdash", - "periodsuperior", - "questionsmall", - "asuperior", - "bsuperior", - "centsuperior", - "dsuperior", - "esuperior", - "isuperior", - "lsuperior", - "msuperior", - "nsuperior", - "osuperior", - "rsuperior", - "ssuperior", - "tsuperior", - "ff", - "ffi", - "ffl", - "parenleftinferior", - "parenrightinferior", - "Circumflexsmall", - "hyphensuperior", - "Gravesmall", - "Asmall", - "Bsmall", - "Csmall", - "Dsmall", - "Esmall", - "Fsmall", - "Gsmall", - "Hsmall", - "Ismall", - "Jsmall", - "Ksmall", - "Lsmall", - "Msmall", - "Nsmall", - "Osmall", - "Psmall", - "Qsmall", - "Rsmall", - "Ssmall", - "Tsmall", - "Usmall", - "Vsmall", - "Wsmall", - "Xsmall", - "Ysmall", - "Zsmall", - "colonmonetary", - "onefitted", - "rupiah", - "Tildesmall", - "exclamdownsmall", - "centoldstyle", - "Lslashsmall", - "Scaronsmall", - "Zcaronsmall", - "Dieresissmall", - "Brevesmall", - "Caronsmall", - "Dotaccentsmall", - "Macronsmall", - "figuredash", - "hypheninferior", - "Ogoneksmall", - "Ringsmall", - "Cedillasmall", - "questiondownsmall", - "oneeighth", - "threeeighths", - "fiveeighths", - "seveneighths", - "onethird", - "twothirds", - "zerosuperior", - "foursuperior", - "fivesuperior", - "sixsuperior", - "sevensuperior", - "eightsuperior", - "ninesuperior", - "zeroinferior", - "oneinferior", - "twoinferior", - "threeinferior", - "fourinferior", - "fiveinferior", - "sixinferior", - "seveninferior", - "eightinferior", - "nineinferior", - "centinferior", - "dollarinferior", - "periodinferior", - "commainferior", - "Agravesmall", - "Aacutesmall", - "Acircumflexsmall", - "Atildesmall", - "Adieresissmall", - "Aringsmall", - "AEsmall", - "Ccedillasmall", - "Egravesmall", - "Eacutesmall", - "Ecircumflexsmall", - "Edieresissmall", - "Igravesmall", - "Iacutesmall", - "Icircumflexsmall", - "Idieresissmall", - "Ethsmall", - "Ntildesmall", - "Ogravesmall", - "Oacutesmall", - "Ocircumflexsmall", - "Otildesmall", - "Odieresissmall", - "OEsmall", - "Oslashsmall", - "Ugravesmall", - "Uacutesmall", - "Ucircumflexsmall", - "Udieresissmall", - "Yacutesmall", - "Thornsmall", - "Ydieresissmall", - "001.000", - "001.001", - "001.002", - "001.003", - "Black", - "Bold", - "Book", - "Light", - "Medium", - "Regular", - "Roman", - "Semibold", -] - -cffStandardStringCount = 391 -assert len(cffStandardStrings) == cffStandardStringCount -# build reverse mapping -cffStandardStringMapping = {} -for _i in range(cffStandardStringCount): - cffStandardStringMapping[cffStandardStrings[_i]] = _i - -cffISOAdobeStrings = [ - ".notdef", - "space", - "exclam", - "quotedbl", - "numbersign", - "dollar", - "percent", - "ampersand", - "quoteright", - "parenleft", - "parenright", - "asterisk", - "plus", - "comma", - "hyphen", - "period", - "slash", - "zero", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - "colon", - "semicolon", - "less", - "equal", - "greater", - "question", - "at", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "bracketleft", - "backslash", - "bracketright", - "asciicircum", - "underscore", - "quoteleft", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "braceleft", - "bar", - "braceright", - "asciitilde", - "exclamdown", - "cent", - "sterling", - "fraction", - "yen", - "florin", - "section", - "currency", - "quotesingle", - "quotedblleft", - "guillemotleft", - "guilsinglleft", - "guilsinglright", - "fi", - "fl", - "endash", - "dagger", - "daggerdbl", - "periodcentered", - "paragraph", - "bullet", - "quotesinglbase", - "quotedblbase", - "quotedblright", - "guillemotright", - "ellipsis", - "perthousand", - "questiondown", - "grave", - "acute", - "circumflex", - "tilde", - "macron", - "breve", - "dotaccent", - "dieresis", - "ring", - "cedilla", - "hungarumlaut", - "ogonek", - "caron", - "emdash", - "AE", - "ordfeminine", - "Lslash", - "Oslash", - "OE", - "ordmasculine", - "ae", - "dotlessi", - "lslash", - "oslash", - "oe", - "germandbls", - "onesuperior", - "logicalnot", - "mu", - "trademark", - "Eth", - "onehalf", - "plusminus", - "Thorn", - "onequarter", - "divide", - "brokenbar", - "degree", - "thorn", - "threequarters", - "twosuperior", - "registered", - "minus", - "eth", - "multiply", - "threesuperior", - "copyright", - "Aacute", - "Acircumflex", - "Adieresis", - "Agrave", - "Aring", - "Atilde", - "Ccedilla", - "Eacute", - "Ecircumflex", - "Edieresis", - "Egrave", - "Iacute", - "Icircumflex", - "Idieresis", - "Igrave", - "Ntilde", - "Oacute", - "Ocircumflex", - "Odieresis", - "Ograve", - "Otilde", - "Scaron", - "Uacute", - "Ucircumflex", - "Udieresis", - "Ugrave", - "Yacute", - "Ydieresis", - "Zcaron", - "aacute", - "acircumflex", - "adieresis", - "agrave", - "aring", - "atilde", - "ccedilla", - "eacute", - "ecircumflex", - "edieresis", - "egrave", - "iacute", - "icircumflex", - "idieresis", - "igrave", - "ntilde", - "oacute", - "ocircumflex", - "odieresis", - "ograve", - "otilde", - "scaron", - "uacute", - "ucircumflex", - "udieresis", - "ugrave", - "yacute", - "ydieresis", - "zcaron", -] - -cffISOAdobeStringCount = 229 -assert len(cffISOAdobeStrings) == cffISOAdobeStringCount - -cffIExpertStrings = [ - ".notdef", - "space", - "exclamsmall", - "Hungarumlautsmall", - "dollaroldstyle", - "dollarsuperior", - "ampersandsmall", - "Acutesmall", - "parenleftsuperior", - "parenrightsuperior", - "twodotenleader", - "onedotenleader", - "comma", - "hyphen", - "period", - "fraction", - "zerooldstyle", - "oneoldstyle", - "twooldstyle", - "threeoldstyle", - "fouroldstyle", - "fiveoldstyle", - "sixoldstyle", - "sevenoldstyle", - "eightoldstyle", - "nineoldstyle", - "colon", - "semicolon", - "commasuperior", - "threequartersemdash", - "periodsuperior", - "questionsmall", - "asuperior", - "bsuperior", - "centsuperior", - "dsuperior", - "esuperior", - "isuperior", - "lsuperior", - "msuperior", - "nsuperior", - "osuperior", - "rsuperior", - "ssuperior", - "tsuperior", - "ff", - "fi", - "fl", - "ffi", - "ffl", - "parenleftinferior", - "parenrightinferior", - "Circumflexsmall", - "hyphensuperior", - "Gravesmall", - "Asmall", - "Bsmall", - "Csmall", - "Dsmall", - "Esmall", - "Fsmall", - "Gsmall", - "Hsmall", - "Ismall", - "Jsmall", - "Ksmall", - "Lsmall", - "Msmall", - "Nsmall", - "Osmall", - "Psmall", - "Qsmall", - "Rsmall", - "Ssmall", - "Tsmall", - "Usmall", - "Vsmall", - "Wsmall", - "Xsmall", - "Ysmall", - "Zsmall", - "colonmonetary", - "onefitted", - "rupiah", - "Tildesmall", - "exclamdownsmall", - "centoldstyle", - "Lslashsmall", - "Scaronsmall", - "Zcaronsmall", - "Dieresissmall", - "Brevesmall", - "Caronsmall", - "Dotaccentsmall", - "Macronsmall", - "figuredash", - "hypheninferior", - "Ogoneksmall", - "Ringsmall", - "Cedillasmall", - "onequarter", - "onehalf", - "threequarters", - "questiondownsmall", - "oneeighth", - "threeeighths", - "fiveeighths", - "seveneighths", - "onethird", - "twothirds", - "zerosuperior", - "onesuperior", - "twosuperior", - "threesuperior", - "foursuperior", - "fivesuperior", - "sixsuperior", - "sevensuperior", - "eightsuperior", - "ninesuperior", - "zeroinferior", - "oneinferior", - "twoinferior", - "threeinferior", - "fourinferior", - "fiveinferior", - "sixinferior", - "seveninferior", - "eightinferior", - "nineinferior", - "centinferior", - "dollarinferior", - "periodinferior", - "commainferior", - "Agravesmall", - "Aacutesmall", - "Acircumflexsmall", - "Atildesmall", - "Adieresissmall", - "Aringsmall", - "AEsmall", - "Ccedillasmall", - "Egravesmall", - "Eacutesmall", - "Ecircumflexsmall", - "Edieresissmall", - "Igravesmall", - "Iacutesmall", - "Icircumflexsmall", - "Idieresissmall", - "Ethsmall", - "Ntildesmall", - "Ogravesmall", - "Oacutesmall", - "Ocircumflexsmall", - "Otildesmall", - "Odieresissmall", - "OEsmall", - "Oslashsmall", - "Ugravesmall", - "Uacutesmall", - "Ucircumflexsmall", - "Udieresissmall", - "Yacutesmall", - "Thornsmall", - "Ydieresissmall", -] - -cffExpertStringCount = 166 -assert len(cffIExpertStrings) == cffExpertStringCount - -cffExpertSubsetStrings = [ - ".notdef", - "space", - "dollaroldstyle", - "dollarsuperior", - "parenleftsuperior", - "parenrightsuperior", - "twodotenleader", - "onedotenleader", - "comma", - "hyphen", - "period", - "fraction", - "zerooldstyle", - "oneoldstyle", - "twooldstyle", - "threeoldstyle", - "fouroldstyle", - "fiveoldstyle", - "sixoldstyle", - "sevenoldstyle", - "eightoldstyle", - "nineoldstyle", - "colon", - "semicolon", - "commasuperior", - "threequartersemdash", - "periodsuperior", - "asuperior", - "bsuperior", - "centsuperior", - "dsuperior", - "esuperior", - "isuperior", - "lsuperior", - "msuperior", - "nsuperior", - "osuperior", - "rsuperior", - "ssuperior", - "tsuperior", - "ff", - "fi", - "fl", - "ffi", - "ffl", - "parenleftinferior", - "parenrightinferior", - "hyphensuperior", - "colonmonetary", - "onefitted", - "rupiah", - "centoldstyle", - "figuredash", - "hypheninferior", - "onequarter", - "onehalf", - "threequarters", - "oneeighth", - "threeeighths", - "fiveeighths", - "seveneighths", - "onethird", - "twothirds", - "zerosuperior", - "onesuperior", - "twosuperior", - "threesuperior", - "foursuperior", - "fivesuperior", - "sixsuperior", - "sevensuperior", - "eightsuperior", - "ninesuperior", - "zeroinferior", - "oneinferior", - "twoinferior", - "threeinferior", - "fourinferior", - "fiveinferior", - "sixinferior", - "seveninferior", - "eightinferior", - "nineinferior", - "centinferior", - "dollarinferior", - "periodinferior", - "commainferior", -] - -cffExpertSubsetStringCount = 87 -assert len(cffExpertSubsetStrings) == cffExpertSubsetStringCount diff --git a/.venv/Lib/site-packages/fontTools/cffLib/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/cffLib/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 465e4e27fa0da4da5e33e93903a593dfa57f5e88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145452 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

    wWTqotwsF&1ny(1u&E>E>JZ9JOo9-$WzF20^9y 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 diff --git a/.venv/Lib/site-packages/fontTools/cffLib/__pycache__/specializer.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/cffLib/__pycache__/specializer.cpython-311.pyc deleted file mode 100644 index c642fd8373b1a2c6d9dbb447c9e282824147d64d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33326 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 diff --git a/.venv/Lib/site-packages/fontTools/cffLib/__pycache__/width.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/cffLib/__pycache__/width.cpython-311.pyc deleted file mode 100644 index b8deecf3557dfccd7d114a1b5841cc85207bf2cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11489 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 1: - raise ValueError(args) - if len(args) % 2 == 1: - yield ("rrcurveto", [args[1], args[0], args[2], args[3], args[4], 0]) - args = args[5:] - for args in _everyN(args, 4): - yield ("rrcurveto", [args[0], 0, args[1], args[2], args[3], 0]) - - @staticmethod - def vvcurveto(args): - if len(args) < 4 or len(args) % 4 > 1: - raise ValueError(args) - if len(args) % 2 == 1: - yield ("rrcurveto", [args[0], args[1], args[2], args[3], 0, args[4]]) - args = args[5:] - for args in _everyN(args, 4): - yield ("rrcurveto", [0, args[0], args[1], args[2], 0, args[3]]) - - @staticmethod - def hvcurveto(args): - if len(args) < 4 or len(args) % 8 not in {0, 1, 4, 5}: - raise ValueError(args) - last_args = None - if len(args) % 2 == 1: - lastStraight = len(args) % 8 == 5 - args, last_args = args[:-5], args[-5:] - it = _everyN(args, 4) - try: - while True: - args = next(it) - yield ("rrcurveto", [args[0], 0, args[1], args[2], 0, args[3]]) - args = next(it) - yield ("rrcurveto", [0, args[0], args[1], args[2], args[3], 0]) - except StopIteration: - pass - if last_args: - args = last_args - if lastStraight: - yield ("rrcurveto", [args[0], 0, args[1], args[2], args[4], args[3]]) - else: - yield ("rrcurveto", [0, args[0], args[1], args[2], args[3], args[4]]) - - @staticmethod - def vhcurveto(args): - if len(args) < 4 or len(args) % 8 not in {0, 1, 4, 5}: - raise ValueError(args) - last_args = None - if len(args) % 2 == 1: - lastStraight = len(args) % 8 == 5 - args, last_args = args[:-5], args[-5:] - it = _everyN(args, 4) - try: - while True: - args = next(it) - yield ("rrcurveto", [0, args[0], args[1], args[2], args[3], 0]) - args = next(it) - yield ("rrcurveto", [args[0], 0, args[1], args[2], 0, args[3]]) - except StopIteration: - pass - if last_args: - args = last_args - if lastStraight: - yield ("rrcurveto", [0, args[0], args[1], args[2], args[3], args[4]]) - else: - yield ("rrcurveto", [args[0], 0, args[1], args[2], args[4], args[3]]) - - @staticmethod - def rcurveline(args): - if len(args) < 8 or len(args) % 6 != 2: - raise ValueError(args) - args, last_args = args[:-2], args[-2:] - for args in _everyN(args, 6): - yield ("rrcurveto", args) - yield ("rlineto", last_args) - - @staticmethod - def rlinecurve(args): - if len(args) < 8 or len(args) % 2 != 0: - raise ValueError(args) - args, last_args = args[:-6], args[-6:] - for args in _everyN(args, 2): - yield ("rlineto", args) - yield ("rrcurveto", last_args) - - -def _convertBlendOpToArgs(blendList): - # args is list of blend op args. Since we are supporting - # recursive blend op calls, some of these args may also - # be a list of blend op args, and need to be converted before - # we convert the current list. - if any([isinstance(arg, list) for arg in blendList]): - args = [ - i - for e in blendList - for i in (_convertBlendOpToArgs(e) if isinstance(e, list) else [e]) - ] - else: - args = blendList - - # We now know that blendList contains a blend op argument list, even if - # some of the args are lists that each contain a blend op argument list. - # Convert from: - # [default font arg sequence x0,...,xn] + [delta tuple for x0] + ... + [delta tuple for xn] - # to: - # [ [x0] + [delta tuple for x0], - # ..., - # [xn] + [delta tuple for xn] ] - numBlends = args[-1] - # Can't use args.pop() when the args are being used in a nested list - # comprehension. See calling context - args = args[:-1] - - numRegions = len(args) // numBlends - 1 - if not (numBlends * (numRegions + 1) == len(args)): - raise ValueError(blendList) - - defaultArgs = [[arg] for arg in args[:numBlends]] - deltaArgs = args[numBlends:] - numDeltaValues = len(deltaArgs) - deltaList = [ - deltaArgs[i : i + numRegions] for i in range(0, numDeltaValues, numRegions) - ] - blend_args = [a + b + [1] for a, b in zip(defaultArgs, deltaList)] - return blend_args - - -def generalizeCommands(commands, ignoreErrors=False): - result = [] - mapping = _GeneralizerDecombinerCommandsMap - for op, args in commands: - # First, generalize any blend args in the arg list. - if any([isinstance(arg, list) for arg in args]): - try: - args = [ - n - for arg in args - for n in ( - _convertBlendOpToArgs(arg) if isinstance(arg, list) else [arg] - ) - ] - except ValueError: - if ignoreErrors: - # Store op as data, such that consumers of commands do not have to - # deal with incorrect number of arguments. - result.append(("", args)) - result.append(("", [op])) - else: - raise - - func = getattr(mapping, op, None) - if not func: - result.append((op, args)) - continue - try: - for command in func(args): - result.append(command) - except ValueError: - if ignoreErrors: - # Store op as data, such that consumers of commands do not have to - # deal with incorrect number of arguments. - result.append(("", args)) - result.append(("", [op])) - else: - raise - return result - - -def generalizeProgram(program, getNumRegions=None, **kwargs): - return commandsToProgram( - generalizeCommands(programToCommands(program, getNumRegions), **kwargs) - ) - - -def _categorizeVector(v): - """ - Takes X,Y vector v and returns one of r, h, v, or 0 depending on which - of X and/or Y are zero, plus tuple of nonzero ones. If both are zero, - it returns a single zero still. - - >>> _categorizeVector((0,0)) - ('0', (0,)) - >>> _categorizeVector((1,0)) - ('h', (1,)) - >>> _categorizeVector((0,2)) - ('v', (2,)) - >>> _categorizeVector((1,2)) - ('r', (1, 2)) - """ - if not v[0]: - if not v[1]: - return "0", v[:1] - else: - return "v", v[1:] - else: - if not v[1]: - return "h", v[:1] - else: - return "r", v - - -def _mergeCategories(a, b): - if a == "0": - return b - if b == "0": - return a - if a == b: - return a - return None - - -def _negateCategory(a): - if a == "h": - return "v" - if a == "v": - return "h" - assert a in "0r" - return a - - -def _convertToBlendCmds(args): - # return a list of blend commands, and - # the remaining non-blended args, if any. - num_args = len(args) - stack_use = 0 - new_args = [] - i = 0 - while i < num_args: - arg = args[i] - if not isinstance(arg, list): - new_args.append(arg) - i += 1 - stack_use += 1 - else: - prev_stack_use = stack_use - # The arg is a tuple of blend values. - # These are each (master 0,delta 1..delta n, 1) - # Combine as many successive tuples as we can, - # up to the max stack limit. - num_sources = len(arg) - 1 - blendlist = [arg] - i += 1 - stack_use += 1 + num_sources # 1 for the num_blends arg - while (i < num_args) and isinstance(args[i], list): - blendlist.append(args[i]) - i += 1 - stack_use += num_sources - if stack_use + num_sources > maxStackLimit: - # if we are here, max stack is the CFF2 max stack. - # I use the CFF2 max stack limit here rather than - # the 'maxstack' chosen by the client, as the default - # maxstack may have been used unintentionally. For all - # the other operators, this just produces a little less - # optimization, but here it puts a hard (and low) limit - # on the number of source fonts that can be used. - break - # blendList now contains as many single blend tuples as can be - # combined without exceeding the CFF2 stack limit. - num_blends = len(blendlist) - # append the 'num_blends' default font values - blend_args = [] - for arg in blendlist: - blend_args.append(arg[0]) - for arg in blendlist: - assert arg[-1] == 1 - blend_args.extend(arg[1:-1]) - blend_args.append(num_blends) - new_args.append(blend_args) - stack_use = prev_stack_use + num_blends - - return new_args - - -def _addArgs(a, b): - if isinstance(b, list): - if isinstance(a, list): - if len(a) != len(b) or a[-1] != b[-1]: - raise ValueError() - return [_addArgs(va, vb) for va, vb in zip(a[:-1], b[:-1])] + [a[-1]] - else: - a, b = b, a - if isinstance(a, list): - assert a[-1] == 1 - return [_addArgs(a[0], b)] + a[1:] - return a + b - - -def specializeCommands( - commands, - ignoreErrors=False, - generalizeFirst=True, - preserveTopology=False, - maxstack=48, -): - # We perform several rounds of optimizations. They are carefully ordered and are: - # - # 0. Generalize commands. - # This ensures that they are in our expected simple form, with each line/curve only - # having arguments for one segment, and using the generic form (rlineto/rrcurveto). - # If caller is sure the input is in this form, they can turn off generalization to - # save time. - # - # 1. Combine successive rmoveto operations. - # - # 2. Specialize rmoveto/rlineto/rrcurveto operators into horizontal/vertical variants. - # We specialize into some, made-up, variants as well, which simplifies following - # passes. - # - # 3. Merge or delete redundant operations, to the extent requested. - # OpenType spec declares point numbers in CFF undefined. As such, we happily - # change topology. If client relies on point numbers (in GPOS anchors, or for - # hinting purposes(what?)) they can turn this off. - # - # 4. Peephole optimization to revert back some of the h/v variants back into their - # original "relative" operator (rline/rrcurveto) if that saves a byte. - # - # 5. Combine adjacent operators when possible, minding not to go over max stack size. - # - # 6. Resolve any remaining made-up operators into real operators. - # - # I have convinced myself that this produces optimal bytecode (except for, possibly - # one byte each time maxstack size prohibits combining.) YMMV, but you'd be wrong. :-) - # A dynamic-programming approach can do the same but would be significantly slower. - # - # 7. For any args which are blend lists, convert them to a blend command. - - # 0. Generalize commands. - if generalizeFirst: - commands = generalizeCommands(commands, ignoreErrors=ignoreErrors) - else: - commands = list(commands) # Make copy since we modify in-place later. - - # 1. Combine successive rmoveto operations. - for i in range(len(commands) - 1, 0, -1): - if "rmoveto" == commands[i][0] == commands[i - 1][0]: - v1, v2 = commands[i - 1][1], commands[i][1] - commands[i - 1] = ("rmoveto", [v1[0] + v2[0], v1[1] + v2[1]]) - del commands[i] - - # 2. Specialize rmoveto/rlineto/rrcurveto operators into horizontal/vertical variants. - # - # We, in fact, specialize into more, made-up, variants that special-case when both - # X and Y components are zero. This simplifies the following optimization passes. - # This case is rare, but OCD does not let me skip it. - # - # After this round, we will have four variants that use the following mnemonics: - # - # - 'r' for relative, ie. non-zero X and non-zero Y, - # - 'h' for horizontal, ie. zero X and non-zero Y, - # - 'v' for vertical, ie. non-zero X and zero Y, - # - '0' for zeros, ie. zero X and zero Y. - # - # The '0' pseudo-operators are not part of the spec, but help simplify the following - # optimization rounds. We resolve them at the end. So, after this, we will have four - # moveto and four lineto variants: - # - # - 0moveto, 0lineto - # - hmoveto, hlineto - # - vmoveto, vlineto - # - rmoveto, rlineto - # - # and sixteen curveto variants. For example, a '0hcurveto' operator means a curve - # dx0,dy0,dx1,dy1,dx2,dy2,dx3,dy3 where dx0, dx1, and dy3 are zero but not dx3. - # An 'rvcurveto' means dx3 is zero but not dx0,dy0,dy3. - # - # There are nine different variants of curves without the '0'. Those nine map exactly - # to the existing curve variants in the spec: rrcurveto, and the four variants hhcurveto, - # vvcurveto, hvcurveto, and vhcurveto each cover two cases, one with an odd number of - # arguments and one without. Eg. an hhcurveto with an extra argument (odd number of - # arguments) is in fact an rhcurveto. The operators in the spec are designed such that - # all four of rhcurveto, rvcurveto, hrcurveto, and vrcurveto are encodable for one curve. - # - # Of the curve types with '0', the 00curveto is equivalent to a lineto variant. The rest - # of the curve types with a 0 need to be encoded as a h or v variant. Ie. a '0' can be - # thought of a "don't care" and can be used as either an 'h' or a 'v'. As such, we always - # encode a number 0 as argument when we use a '0' variant. Later on, we can just substitute - # the '0' with either 'h' or 'v' and it works. - # - # When we get to curve splines however, things become more complicated... XXX finish this. - # There's one more complexity with splines. If one side of the spline is not horizontal or - # vertical (or zero), ie. if it's 'r', then it limits which spline types we can encode. - # Only hhcurveto and vvcurveto operators can encode a spline starting with 'r', and - # only hvcurveto and vhcurveto operators can encode a spline ending with 'r'. - # This limits our merge opportunities later. - # - for i in range(len(commands)): - op, args = commands[i] - - if op in {"rmoveto", "rlineto"}: - c, args = _categorizeVector(args) - commands[i] = c + op[1:], args - continue - - if op == "rrcurveto": - c1, args1 = _categorizeVector(args[:2]) - c2, args2 = _categorizeVector(args[-2:]) - commands[i] = c1 + c2 + "curveto", args1 + args[2:4] + args2 - continue - - # 3. Merge or delete redundant operations, to the extent requested. - # - # TODO - # A 0moveto that comes before all other path operations can be removed. - # though I find conflicting evidence for this. - # - # TODO - # "If hstem and vstem hints are both declared at the beginning of a - # CharString, and this sequence is followed directly by the hintmask or - # cntrmask operators, then the vstem hint operator (or, if applicable, - # the vstemhm operator) need not be included." - # - # "The sequence and form of a CFF2 CharString program may be represented as: - # {hs* vs* cm* hm* mt subpath}? {mt subpath}*" - # - # https://www.microsoft.com/typography/otspec/cff2charstr.htm#section3.1 - # - # For Type2 CharStrings the sequence is: - # w? {hs* vs* cm* hm* mt subpath}? {mt subpath}* endchar" - - # Some other redundancies change topology (point numbers). - if not preserveTopology: - for i in range(len(commands) - 1, -1, -1): - op, args = commands[i] - - # A 00curveto is demoted to a (specialized) lineto. - if op == "00curveto": - assert len(args) == 4 - c, args = _categorizeVector(args[1:3]) - op = c + "lineto" - commands[i] = op, args - # and then... - - # A 0lineto can be deleted. - if op == "0lineto": - del commands[i] - continue - - # Merge adjacent hlineto's and vlineto's. - # In CFF2 charstrings from variable fonts, each - # arg item may be a list of blendable values, one from - # each source font. - if i and op in {"hlineto", "vlineto"} and (op == commands[i - 1][0]): - _, other_args = commands[i - 1] - assert len(args) == 1 and len(other_args) == 1 - try: - new_args = [_addArgs(args[0], other_args[0])] - except ValueError: - continue - commands[i - 1] = (op, new_args) - del commands[i] - continue - - # 4. Peephole optimization to revert back some of the h/v variants back into their - # original "relative" operator (rline/rrcurveto) if that saves a byte. - for i in range(1, len(commands) - 1): - op, args = commands[i] - prv, nxt = commands[i - 1][0], commands[i + 1][0] - - if op in {"0lineto", "hlineto", "vlineto"} and prv == nxt == "rlineto": - assert len(args) == 1 - args = [0, args[0]] if op[0] == "v" else [args[0], 0] - commands[i] = ("rlineto", args) - continue - - if op[2:] == "curveto" and len(args) == 5 and prv == nxt == "rrcurveto": - assert (op[0] == "r") ^ (op[1] == "r") - if op[0] == "v": - pos = 0 - elif op[0] != "r": - pos = 1 - elif op[1] == "v": - pos = 4 - else: - pos = 5 - # Insert, while maintaining the type of args (can be tuple or list). - args = args[:pos] + type(args)((0,)) + args[pos:] - commands[i] = ("rrcurveto", args) - continue - - # 5. Combine adjacent operators when possible, minding not to go over max stack size. - for i in range(len(commands) - 1, 0, -1): - op1, args1 = commands[i - 1] - op2, args2 = commands[i] - new_op = None - - # Merge logic... - if {op1, op2} <= {"rlineto", "rrcurveto"}: - if op1 == op2: - new_op = op1 - else: - if op2 == "rrcurveto" and len(args2) == 6: - new_op = "rlinecurve" - elif len(args2) == 2: - new_op = "rcurveline" - - elif (op1, op2) in {("rlineto", "rlinecurve"), ("rrcurveto", "rcurveline")}: - new_op = op2 - - elif {op1, op2} == {"vlineto", "hlineto"}: - new_op = op1 - - elif "curveto" == op1[2:] == op2[2:]: - d0, d1 = op1[:2] - d2, d3 = op2[:2] - - if d1 == "r" or d2 == "r" or d0 == d3 == "r": - continue - - d = _mergeCategories(d1, d2) - if d is None: - continue - if d0 == "r": - d = _mergeCategories(d, d3) - if d is None: - continue - new_op = "r" + d + "curveto" - elif d3 == "r": - d0 = _mergeCategories(d0, _negateCategory(d)) - if d0 is None: - continue - new_op = d0 + "r" + "curveto" - else: - d0 = _mergeCategories(d0, d3) - if d0 is None: - continue - new_op = d0 + d + "curveto" - - # Make sure the stack depth does not exceed (maxstack - 1), so - # that subroutinizer can insert subroutine calls at any point. - if new_op and len(args1) + len(args2) < maxstack: - commands[i - 1] = (new_op, args1 + args2) - del commands[i] - - # 6. Resolve any remaining made-up operators into real operators. - for i in range(len(commands)): - op, args = commands[i] - - if op in {"0moveto", "0lineto"}: - commands[i] = "h" + op[1:], args - continue - - if op[2:] == "curveto" and op[:2] not in {"rr", "hh", "vv", "vh", "hv"}: - op0, op1 = op[:2] - if (op0 == "r") ^ (op1 == "r"): - assert len(args) % 2 == 1 - if op0 == "0": - op0 = "h" - if op1 == "0": - op1 = "h" - if op0 == "r": - op0 = op1 - if op1 == "r": - op1 = _negateCategory(op0) - assert {op0, op1} <= {"h", "v"}, (op0, op1) - - if len(args) % 2: - if op0 != op1: # vhcurveto / hvcurveto - if (op0 == "h") ^ (len(args) % 8 == 1): - # Swap last two args order - args = args[:-2] + args[-1:] + args[-2:-1] - else: # hhcurveto / vvcurveto - if op0 == "h": # hhcurveto - # Swap first two args order - args = args[1:2] + args[:1] + args[2:] - - commands[i] = op0 + op1 + "curveto", args - continue - - # 7. For any series of args which are blend lists, convert the series to a single blend arg. - for i in range(len(commands)): - op, args = commands[i] - if any(isinstance(arg, list) for arg in args): - commands[i] = op, _convertToBlendCmds(args) - - return commands - - -def specializeProgram(program, getNumRegions=None, **kwargs): - return commandsToProgram( - specializeCommands(programToCommands(program, getNumRegions), **kwargs) - ) - - -if __name__ == "__main__": - import sys - - if len(sys.argv) == 1: - import doctest - - sys.exit(doctest.testmod().failed) - - import argparse - - parser = argparse.ArgumentParser( - "fonttools cffLib.specialer", - description="CFF CharString generalizer/specializer", - ) - parser.add_argument("program", metavar="command", nargs="*", help="Commands.") - parser.add_argument( - "--num-regions", - metavar="NumRegions", - nargs="*", - default=None, - help="Number of variable-font regions for blend opertaions.", - ) - - options = parser.parse_args(sys.argv[1:]) - - getNumRegions = ( - None - if options.num_regions is None - else lambda vsIndex: int(options.num_regions[0 if vsIndex is None else vsIndex]) - ) - - program = stringToProgram(options.program) - print("Program:") - print(programToString(program)) - commands = programToCommands(program, getNumRegions) - print("Commands:") - print(commands) - program2 = commandsToProgram(commands) - print("Program from commands:") - print(programToString(program2)) - assert program == program2 - print("Generalized program:") - print(programToString(generalizeProgram(program, getNumRegions))) - print("Specialized program:") - print(programToString(specializeProgram(program, getNumRegions))) diff --git a/.venv/Lib/site-packages/fontTools/cffLib/width.py b/.venv/Lib/site-packages/fontTools/cffLib/width.py deleted file mode 100644 index 0ba3ed3..0000000 --- a/.venv/Lib/site-packages/fontTools/cffLib/width.py +++ /dev/null @@ -1,207 +0,0 @@ -# -*- coding: utf-8 -*- - -"""T2CharString glyph width optimizer. - -CFF glyphs whose width equals the CFF Private dictionary's ``defaultWidthX`` -value do not need to specify their width in their charstring, saving bytes. -This module determines the optimum ``defaultWidthX`` and ``nominalWidthX`` -values for a font, when provided with a list of glyph widths.""" - -from fontTools.ttLib import TTFont -from collections import defaultdict -from operator import add -from functools import reduce - - -class missingdict(dict): - def __init__(self, missing_func): - self.missing_func = missing_func - - def __missing__(self, v): - return self.missing_func(v) - - -def cumSum(f, op=add, start=0, decreasing=False): - keys = sorted(f.keys()) - minx, maxx = keys[0], keys[-1] - - total = reduce(op, f.values(), start) - - if decreasing: - missing = lambda x: start if x > maxx else total - domain = range(maxx, minx - 1, -1) - else: - missing = lambda x: start if x < minx else total - domain = range(minx, maxx + 1) - - out = missingdict(missing) - - v = start - for x in domain: - v = op(v, f[x]) - out[x] = v - - return out - - -def byteCost(widths, default, nominal): - if not hasattr(widths, "items"): - d = defaultdict(int) - for w in widths: - d[w] += 1 - widths = d - - cost = 0 - for w, freq in widths.items(): - if w == default: - continue - diff = abs(w - nominal) - if diff <= 107: - cost += freq - elif diff <= 1131: - cost += freq * 2 - else: - cost += freq * 5 - return cost - - -def optimizeWidthsBruteforce(widths): - """Bruteforce version. Veeeeeeeeeeeeeeeeery slow. Only works for smallests of fonts.""" - - d = defaultdict(int) - for w in widths: - d[w] += 1 - - # Maximum number of bytes using default can possibly save - maxDefaultAdvantage = 5 * max(d.values()) - - minw, maxw = min(widths), max(widths) - domain = list(range(minw, maxw + 1)) - - bestCostWithoutDefault = min(byteCost(widths, None, nominal) for nominal in domain) - - bestCost = len(widths) * 5 + 1 - for nominal in domain: - if byteCost(widths, None, nominal) > bestCost + maxDefaultAdvantage: - continue - for default in domain: - cost = byteCost(widths, default, nominal) - if cost < bestCost: - bestCost = cost - bestDefault = default - bestNominal = nominal - - return bestDefault, bestNominal - - -def optimizeWidths(widths): - """Given a list of glyph widths, or dictionary mapping glyph width to number of - glyphs having that, returns a tuple of best CFF default and nominal glyph widths. - - This algorithm is linear in UPEM+numGlyphs.""" - - if not hasattr(widths, "items"): - d = defaultdict(int) - for w in widths: - d[w] += 1 - widths = d - - keys = sorted(widths.keys()) - minw, maxw = keys[0], keys[-1] - domain = list(range(minw, maxw + 1)) - - # Cumulative sum/max forward/backward. - cumFrqU = cumSum(widths, op=add) - cumMaxU = cumSum(widths, op=max) - cumFrqD = cumSum(widths, op=add, decreasing=True) - cumMaxD = cumSum(widths, op=max, decreasing=True) - - # Cost per nominal choice, without default consideration. - nomnCostU = missingdict( - lambda x: cumFrqU[x] + cumFrqU[x - 108] + cumFrqU[x - 1132] * 3 - ) - nomnCostD = missingdict( - lambda x: cumFrqD[x] + cumFrqD[x + 108] + cumFrqD[x + 1132] * 3 - ) - nomnCost = missingdict(lambda x: nomnCostU[x] + nomnCostD[x] - widths[x]) - - # Cost-saving per nominal choice, by best default choice. - dfltCostU = missingdict( - lambda x: max(cumMaxU[x], cumMaxU[x - 108] * 2, cumMaxU[x - 1132] * 5) - ) - dfltCostD = missingdict( - lambda x: max(cumMaxD[x], cumMaxD[x + 108] * 2, cumMaxD[x + 1132] * 5) - ) - dfltCost = missingdict(lambda x: max(dfltCostU[x], dfltCostD[x])) - - # Combined cost per nominal choice. - bestCost = missingdict(lambda x: nomnCost[x] - dfltCost[x]) - - # Best nominal. - nominal = min(domain, key=lambda x: bestCost[x]) - - # Work back the best default. - bestC = bestCost[nominal] - dfltC = nomnCost[nominal] - bestCost[nominal] - ends = [] - if dfltC == dfltCostU[nominal]: - starts = [nominal, nominal - 108, nominal - 1132] - for start in starts: - while cumMaxU[start] and cumMaxU[start] == cumMaxU[start - 1]: - start -= 1 - ends.append(start) - else: - starts = [nominal, nominal + 108, nominal + 1132] - for start in starts: - while cumMaxD[start] and cumMaxD[start] == cumMaxD[start + 1]: - start += 1 - ends.append(start) - default = min(ends, key=lambda default: byteCost(widths, default, nominal)) - - return default, nominal - - -def main(args=None): - """Calculate optimum defaultWidthX/nominalWidthX values""" - - import argparse - - parser = argparse.ArgumentParser( - "fonttools cffLib.width", - description=main.__doc__, - ) - parser.add_argument( - "inputs", metavar="FILE", type=str, nargs="+", help="Input TTF files" - ) - parser.add_argument( - "-b", - "--brute-force", - dest="brute", - action="store_true", - help="Use brute-force approach (VERY slow)", - ) - - args = parser.parse_args(args) - - for fontfile in args.inputs: - font = TTFont(fontfile) - hmtx = font["hmtx"] - widths = [m[0] for m in hmtx.metrics.values()] - if args.brute: - default, nominal = optimizeWidthsBruteforce(widths) - else: - default, nominal = optimizeWidths(widths) - print( - "glyphs=%d default=%d nominal=%d byteCost=%d" - % (len(widths), default, nominal, byteCost(widths, default, nominal)) - ) - - -if __name__ == "__main__": - import sys - - if len(sys.argv) == 1: - import doctest - - sys.exit(doctest.testmod().failed) - main() diff --git a/.venv/Lib/site-packages/fontTools/colorLib/__init__.py b/.venv/Lib/site-packages/fontTools/colorLib/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/Lib/site-packages/fontTools/colorLib/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/colorLib/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 045c5785cff80a2b7d355405f706af537b48438a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252 zcmZ3^%ge<81gXz_(?IlN5CH>>P{wCAAY(d13PUi1CZpdYDGzMPJU@hj7xrYX>Mv>Noq`RNoh)EX>N>*hf{b=h>?MT zL5!iHLU4XsNqJ&XYK(!Qf_tcEObJLLKD{(EMz1V2uPnwVGbyGxvm{lwATc>RF+H_7 zCM`d&BqTpSr&vEZKPSHks6anHJ~J<~BtBlRpz;@oO>TZlX-=wL5i8JrARiR-1BnmJ PjEsyQ7+^#ZGf)fw7Mw<` diff --git a/.venv/Lib/site-packages/fontTools/colorLib/__pycache__/builder.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/colorLib/__pycache__/builder.cpython-311.pyc deleted file mode 100644 index 7bbb447d8a5158f01a0273eae1fc5307694cb06f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33679 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

    >tc4}}!-76AaZ5i<*sf}G+}1g5 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 RAuROdlFBEVcQKOt{{a}^oOA#H diff --git a/.venv/Lib/site-packages/fontTools/colorLib/__pycache__/errors.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/colorLib/__pycache__/errors.cpython-311.pyc deleted file mode 100644 index 988fd03f9dd5ee6cdd4611ce5dcaccfd1a32b48b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 488 zcmZutO-}+b5N&rgE-3mJh&N({#hb=>PzaJJ7a%62NwaJV*|59CejwgBcs23HKhPNe zkl||L8G|QIw!7d(r|Ha_d9Rb1zT|RQppAZB_YQRYFv;3BS75QP!4z1a1_*cn1XA#9 z1MsGAY8^zrs?w0KS6Clxj>W?8s#G;ye?|cvGhZx2&%AwifAk;YDz@{ z6`{)I`3-6vxvq=K<$RO%9LRqBt0B@{=n-~fqE>K zEyhAo@>g@0s2N-ohxgq4L*mTJVo$rt?|I*FCKc|i6%D<5raJcNPzEecUv3#PQDih) kI;ZLKXM9_yNy}pm<~D?IZb6utgTL;n{$;A)|4>QmAC5hFI{*Lx diff --git a/.venv/Lib/site-packages/fontTools/colorLib/__pycache__/geometry.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/colorLib/__pycache__/geometry.cpython-311.pyc deleted file mode 100644 index df8c96a2b4ab5acd7918c9250e7fb368b13922bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5943 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 r-QIU+Ump3&_7* diff --git a/.venv/Lib/site-packages/fontTools/colorLib/__pycache__/table_builder.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/colorLib/__pycache__/table_builder.cpython-311.pyc deleted file mode 100644 index 07ff9beecf6e0b8ed0e2e177d9bbdaec08124162..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11813 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 SX2B3QlP~byms=!I3;iES#V?%z diff --git a/.venv/Lib/site-packages/fontTools/colorLib/__pycache__/unbuilder.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/colorLib/__pycache__/unbuilder.cpython-311.pyc deleted file mode 100644 index 8c8528f6a4d6b8e73776c56d6cdb302f26257d89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4301 zcmbVP+fN(W89#Hg$2SISz}y0pWRu3UcyZKhZiEfH1U8ptSAlFB%UjoY24XU{>C8A6 z>Zqt5wXzI~eHraz#s=tf@TG#spNwb#$J*{z1& zcDr{ULSfj&BZv2MmAsRH&?Jfo-{XZ5%H;F-pEZCGKwUtX$N%} zW@^vQ&!F)+vxa8T1GXD2ZC)i`1OMdlWr^`OoY{ z2u?^(q#f{~-vti_bLV3qzo*tv1{Kk#M;=hX270RHA-!I|#_mS-TQx%RJ9_!(B>DzL z7}N7!N|VQx`}4O>Rl`>m#l_bv>2rx28gwLN zRg$w}wxFe^6BF`1J+0&mQerfJyO5Q0x}2EQ3sR<#O^kl<-cJ%!CkF=y6S0^$nV-?` zrc^mG7!${DTu$hCAURveB%*iZ+?~X=%ydG_=<>jPDt$XOD{G0Fd`_Rr=N0YkbY97; zFyU?ISkd|Wuf0Q3CatIQ+4a zIv^8JugmGYDn(e+qu6uJz_cv~ywr4&5lw9ZmKt^94{-EeqvNHs~bY>?k}tUjVs^C~#{SgGfVEPh_FRDu<93;IG;~k>Yp$$EciXcN=xn{K zYSh|G;OKtIe1g{K-+;?pK3k-qO+jl|!luJan69zBnoR+ELma1W zRea4W9n0^2HT`AI=pEYh4V8UEFT%&y3r~Og_*Wa@(?`hC(<@rGuTj(xdfZs4<6O;%#Jf2V@QDwqW6_NHrkttZEE-8hr)*8l*SpNMzlS z2rzLz*jG= zxA3YMkVW)D=zMhS>)_*#4WZu<`pZ12LVraF8N!k0LjR`F|Mb*`5Ho~WnU5XB3vWp9 z>II}e$DZf^@Hkb>>b;Kc0lu|TLJ+9wCH`TZHp4E=o?kog#qNzQ0GH3|lCAwAzEKK| zU;o`=B(CN!`64a3_I8}yhXIVbzofzJ`3V)zI^erWK5-64a6U1M^NH{S3UUbOIav1V z&2Q=D4$vJ)b0KR|u{a>^`Qc@H)3+dXBKAqN#m*6k>x8hZKv=7W<>5Cd%zv=&x|r>( zAAsGo(?CefcC`d8WRtCqBM`IOI-j>5+iX3yKDW^tGg@O7V~>-WM5|0;ETd{VImzXm zB;PYV6NN1K)KqLiDmFM!d<>!5h1>3`dF(kQ79Xh^6tLrhup#FF4Qwi=OUoBjuqZr0 zkodVBM6fw5^#AV=oWLCZ1_Z};p>5@sA@qHH^6{{7bYxQ)DckiQEp0FS-4@+&RdV00 z)l4zz&1mjibAf?8Qo==AGBK>FxbX`?qagd z@PVdX1Z11>2EDroNXhlG1Nnv0ormX_&p$f6>FX~0x+|g1M~7F>mi;|jz_`Qc>i>48 zEL^~qzd#V5h`6xN&84z(GHH5~$!uOKD7fuUCVx>#Db*1b-yX(-$z)B%9*-!W86Z8$+P@SM{YU~> z)j|T!DLnZsz73<@*Gyp_PZe9f$)?oVJ0_3EW-^LwdWj8O!bde(`CdjhSv+R4a6#2{ z*N$s)WP8)&Xs;P?GFu!!O&fiYuv2cev~hJB-Hu`a!v64C)3yZt&w} zetav~w=z)S{mWj1@2S1TZH@`y+&$!4ylQz7=UW^ro!?-?1{*Hh)rugt3$Cu=#QraV R5e|LFwT&ENzU!fY{u|Ix*g*gQ diff --git a/.venv/Lib/site-packages/fontTools/colorLib/builder.py b/.venv/Lib/site-packages/fontTools/colorLib/builder.py deleted file mode 100644 index 6e45e7a..0000000 --- a/.venv/Lib/site-packages/fontTools/colorLib/builder.py +++ /dev/null @@ -1,664 +0,0 @@ -""" -colorLib.builder: Build COLR/CPAL tables from scratch - -""" - -import collections -import copy -import enum -from functools import partial -from math import ceil, log -from typing import ( - Any, - Dict, - Generator, - Iterable, - List, - Mapping, - Optional, - Sequence, - Tuple, - Type, - TypeVar, - Union, -) -from fontTools.misc.arrayTools import intRect -from fontTools.misc.fixedTools import fixedToFloat -from fontTools.misc.treeTools import build_n_ary_tree -from fontTools.ttLib.tables import C_O_L_R_ -from fontTools.ttLib.tables import C_P_A_L_ -from fontTools.ttLib.tables import _n_a_m_e -from fontTools.ttLib.tables import otTables as ot -from fontTools.ttLib.tables.otTables import ExtendMode, CompositeMode -from .errors import ColorLibError -from .geometry import round_start_circle_stable_containment -from .table_builder import BuildCallback, TableBuilder - - -# TODO move type aliases to colorLib.types? -T = TypeVar("T") -_Kwargs = Mapping[str, Any] -_PaintInput = Union[int, _Kwargs, ot.Paint, Tuple[str, "_PaintInput"]] -_PaintInputList = Sequence[_PaintInput] -_ColorGlyphsDict = Dict[str, Union[_PaintInputList, _PaintInput]] -_ColorGlyphsV0Dict = Dict[str, Sequence[Tuple[str, int]]] -_ClipBoxInput = Union[ - Tuple[int, int, int, int, int], # format 1, variable - Tuple[int, int, int, int], # format 0, non-variable - ot.ClipBox, -] - - -MAX_PAINT_COLR_LAYER_COUNT = 255 -_DEFAULT_ALPHA = 1.0 -_MAX_REUSE_LEN = 32 - - -def _beforeBuildPaintRadialGradient(paint, source): - x0 = source["x0"] - y0 = source["y0"] - r0 = source["r0"] - x1 = source["x1"] - y1 = source["y1"] - r1 = source["r1"] - - # TODO apparently no builder_test confirms this works (?) - - # avoid abrupt change after rounding when c0 is near c1's perimeter - c = round_start_circle_stable_containment((x0, y0), r0, (x1, y1), r1) - x0, y0 = c.centre - r0 = c.radius - - # update source to ensure paint is built with corrected values - source["x0"] = x0 - source["y0"] = y0 - source["r0"] = r0 - source["x1"] = x1 - source["y1"] = y1 - source["r1"] = r1 - - return paint, source - - -def _defaultColorStop(): - colorStop = ot.ColorStop() - colorStop.Alpha = _DEFAULT_ALPHA - return colorStop - - -def _defaultVarColorStop(): - colorStop = ot.VarColorStop() - colorStop.Alpha = _DEFAULT_ALPHA - return colorStop - - -def _defaultColorLine(): - colorLine = ot.ColorLine() - colorLine.Extend = ExtendMode.PAD - return colorLine - - -def _defaultVarColorLine(): - colorLine = ot.VarColorLine() - colorLine.Extend = ExtendMode.PAD - return colorLine - - -def _defaultPaintSolid(): - paint = ot.Paint() - paint.Alpha = _DEFAULT_ALPHA - return paint - - -def _buildPaintCallbacks(): - return { - ( - BuildCallback.BEFORE_BUILD, - ot.Paint, - ot.PaintFormat.PaintRadialGradient, - ): _beforeBuildPaintRadialGradient, - ( - BuildCallback.BEFORE_BUILD, - ot.Paint, - ot.PaintFormat.PaintVarRadialGradient, - ): _beforeBuildPaintRadialGradient, - (BuildCallback.CREATE_DEFAULT, ot.ColorStop): _defaultColorStop, - (BuildCallback.CREATE_DEFAULT, ot.VarColorStop): _defaultVarColorStop, - (BuildCallback.CREATE_DEFAULT, ot.ColorLine): _defaultColorLine, - (BuildCallback.CREATE_DEFAULT, ot.VarColorLine): _defaultVarColorLine, - ( - BuildCallback.CREATE_DEFAULT, - ot.Paint, - ot.PaintFormat.PaintSolid, - ): _defaultPaintSolid, - ( - BuildCallback.CREATE_DEFAULT, - ot.Paint, - ot.PaintFormat.PaintVarSolid, - ): _defaultPaintSolid, - } - - -def populateCOLRv0( - table: ot.COLR, - colorGlyphsV0: _ColorGlyphsV0Dict, - glyphMap: Optional[Mapping[str, int]] = None, -): - """Build v0 color layers and add to existing COLR table. - - Args: - table: a raw ``otTables.COLR()`` object (not ttLib's ``table_C_O_L_R_``). - colorGlyphsV0: map of base glyph names to lists of (layer glyph names, - color palette index) tuples. Can be empty. - glyphMap: a map from glyph names to glyph indices, as returned from - ``TTFont.getReverseGlyphMap()``, to optionally sort base records by GID. - """ - if glyphMap is not None: - colorGlyphItems = sorted( - colorGlyphsV0.items(), key=lambda item: glyphMap[item[0]] - ) - else: - colorGlyphItems = colorGlyphsV0.items() - baseGlyphRecords = [] - layerRecords = [] - for baseGlyph, layers in colorGlyphItems: - baseRec = ot.BaseGlyphRecord() - baseRec.BaseGlyph = baseGlyph - baseRec.FirstLayerIndex = len(layerRecords) - baseRec.NumLayers = len(layers) - baseGlyphRecords.append(baseRec) - - for layerGlyph, paletteIndex in layers: - layerRec = ot.LayerRecord() - layerRec.LayerGlyph = layerGlyph - layerRec.PaletteIndex = paletteIndex - layerRecords.append(layerRec) - - table.BaseGlyphRecordArray = table.LayerRecordArray = None - if baseGlyphRecords: - table.BaseGlyphRecordArray = ot.BaseGlyphRecordArray() - table.BaseGlyphRecordArray.BaseGlyphRecord = baseGlyphRecords - if layerRecords: - table.LayerRecordArray = ot.LayerRecordArray() - table.LayerRecordArray.LayerRecord = layerRecords - table.BaseGlyphRecordCount = len(baseGlyphRecords) - table.LayerRecordCount = len(layerRecords) - - -def buildCOLR( - colorGlyphs: _ColorGlyphsDict, - version: Optional[int] = None, - *, - glyphMap: Optional[Mapping[str, int]] = None, - varStore: Optional[ot.VarStore] = None, - varIndexMap: Optional[ot.DeltaSetIndexMap] = None, - clipBoxes: Optional[Dict[str, _ClipBoxInput]] = None, - allowLayerReuse: bool = True, -) -> C_O_L_R_.table_C_O_L_R_: - """Build COLR table from color layers mapping. - - Args: - - colorGlyphs: map of base glyph name to, either list of (layer glyph name, - color palette index) tuples for COLRv0; or a single ``Paint`` (dict) or - list of ``Paint`` for COLRv1. - version: the version of COLR table. If None, the version is determined - by the presence of COLRv1 paints or variation data (varStore), which - require version 1; otherwise, if all base glyphs use only simple color - layers, version 0 is used. - glyphMap: a map from glyph names to glyph indices, as returned from - TTFont.getReverseGlyphMap(), to optionally sort base records by GID. - varStore: Optional ItemVarationStore for deltas associated with v1 layer. - varIndexMap: Optional DeltaSetIndexMap for deltas associated with v1 layer. - clipBoxes: Optional map of base glyph name to clip box 4- or 5-tuples: - (xMin, yMin, xMax, yMax) or (xMin, yMin, xMax, yMax, varIndexBase). - - Returns: - A new COLR table. - """ - self = C_O_L_R_.table_C_O_L_R_() - - if varStore is not None and version == 0: - raise ValueError("Can't add VarStore to COLRv0") - - if version in (None, 0) and not varStore: - # split color glyphs into v0 and v1 and encode separately - colorGlyphsV0, colorGlyphsV1 = _split_color_glyphs_by_version(colorGlyphs) - if version == 0 and colorGlyphsV1: - raise ValueError("Can't encode COLRv1 glyphs in COLRv0") - else: - # unless explicitly requested for v1 or have variations, in which case - # we encode all color glyph as v1 - colorGlyphsV0, colorGlyphsV1 = {}, colorGlyphs - - colr = ot.COLR() - - populateCOLRv0(colr, colorGlyphsV0, glyphMap) - - colr.LayerList, colr.BaseGlyphList = buildColrV1( - colorGlyphsV1, - glyphMap, - allowLayerReuse=allowLayerReuse, - ) - - if version is None: - version = 1 if (varStore or colorGlyphsV1) else 0 - elif version not in (0, 1): - raise NotImplementedError(version) - self.version = colr.Version = version - - if version == 0: - self.ColorLayers = self._decompileColorLayersV0(colr) - else: - colr.ClipList = buildClipList(clipBoxes) if clipBoxes else None - colr.VarIndexMap = varIndexMap - colr.VarStore = varStore - self.table = colr - - return self - - -def buildClipList(clipBoxes: Dict[str, _ClipBoxInput]) -> ot.ClipList: - clipList = ot.ClipList() - clipList.Format = 1 - clipList.clips = {name: buildClipBox(box) for name, box in clipBoxes.items()} - return clipList - - -def buildClipBox(clipBox: _ClipBoxInput) -> ot.ClipBox: - if isinstance(clipBox, ot.ClipBox): - return clipBox - n = len(clipBox) - clip = ot.ClipBox() - if n not in (4, 5): - raise ValueError(f"Invalid ClipBox: expected 4 or 5 values, found {n}") - clip.xMin, clip.yMin, clip.xMax, clip.yMax = intRect(clipBox[:4]) - clip.Format = int(n == 5) + 1 - if n == 5: - clip.VarIndexBase = int(clipBox[4]) - return clip - - -class ColorPaletteType(enum.IntFlag): - USABLE_WITH_LIGHT_BACKGROUND = 0x0001 - USABLE_WITH_DARK_BACKGROUND = 0x0002 - - @classmethod - def _missing_(cls, value): - # enforce reserved bits - if isinstance(value, int) and (value < 0 or value & 0xFFFC != 0): - raise ValueError(f"{value} is not a valid {cls.__name__}") - return super()._missing_(value) - - -# None, 'abc' or {'en': 'abc', 'de': 'xyz'} -_OptionalLocalizedString = Union[None, str, Dict[str, str]] - - -def buildPaletteLabels( - labels: Iterable[_OptionalLocalizedString], nameTable: _n_a_m_e.table__n_a_m_e -) -> List[Optional[int]]: - return [ - ( - nameTable.addMultilingualName(l, mac=False) - if isinstance(l, dict) - else ( - C_P_A_L_.table_C_P_A_L_.NO_NAME_ID - if l is None - else nameTable.addMultilingualName({"en": l}, mac=False) - ) - ) - for l in labels - ] - - -def buildCPAL( - palettes: Sequence[Sequence[Tuple[float, float, float, float]]], - paletteTypes: Optional[Sequence[ColorPaletteType]] = None, - paletteLabels: Optional[Sequence[_OptionalLocalizedString]] = None, - paletteEntryLabels: Optional[Sequence[_OptionalLocalizedString]] = None, - nameTable: Optional[_n_a_m_e.table__n_a_m_e] = None, -) -> C_P_A_L_.table_C_P_A_L_: - """Build CPAL table from list of color palettes. - - Args: - palettes: list of lists of colors encoded as tuples of (R, G, B, A) floats - in the range [0..1]. - paletteTypes: optional list of ColorPaletteType, one for each palette. - paletteLabels: optional list of palette labels. Each lable can be either: - None (no label), a string (for for default English labels), or a - localized string (as a dict keyed with BCP47 language codes). - paletteEntryLabels: optional list of palette entry labels, one for each - palette entry (see paletteLabels). - nameTable: optional name table where to store palette and palette entry - labels. Required if either paletteLabels or paletteEntryLabels is set. - - Return: - A new CPAL v0 or v1 table, if custom palette types or labels are specified. - """ - if len({len(p) for p in palettes}) != 1: - raise ColorLibError("color palettes have different lengths") - - if (paletteLabels or paletteEntryLabels) and not nameTable: - raise TypeError( - "nameTable is required if palette or palette entries have labels" - ) - - cpal = C_P_A_L_.table_C_P_A_L_() - cpal.numPaletteEntries = len(palettes[0]) - - cpal.palettes = [] - for i, palette in enumerate(palettes): - colors = [] - for j, color in enumerate(palette): - if not isinstance(color, tuple) or len(color) != 4: - raise ColorLibError( - f"In palette[{i}][{j}]: expected (R, G, B, A) tuple, got {color!r}" - ) - if any(v > 1 or v < 0 for v in color): - raise ColorLibError( - f"palette[{i}][{j}] has invalid out-of-range [0..1] color: {color!r}" - ) - # input colors are RGBA, CPAL encodes them as BGRA - red, green, blue, alpha = color - colors.append( - C_P_A_L_.Color(*(round(v * 255) for v in (blue, green, red, alpha))) - ) - cpal.palettes.append(colors) - - if any(v is not None for v in (paletteTypes, paletteLabels, paletteEntryLabels)): - cpal.version = 1 - - if paletteTypes is not None: - if len(paletteTypes) != len(palettes): - raise ColorLibError( - f"Expected {len(palettes)} paletteTypes, got {len(paletteTypes)}" - ) - cpal.paletteTypes = [ColorPaletteType(t).value for t in paletteTypes] - else: - cpal.paletteTypes = [C_P_A_L_.table_C_P_A_L_.DEFAULT_PALETTE_TYPE] * len( - palettes - ) - - if paletteLabels is not None: - if len(paletteLabels) != len(palettes): - raise ColorLibError( - f"Expected {len(palettes)} paletteLabels, got {len(paletteLabels)}" - ) - cpal.paletteLabels = buildPaletteLabels(paletteLabels, nameTable) - else: - cpal.paletteLabels = [C_P_A_L_.table_C_P_A_L_.NO_NAME_ID] * len(palettes) - - if paletteEntryLabels is not None: - if len(paletteEntryLabels) != cpal.numPaletteEntries: - raise ColorLibError( - f"Expected {cpal.numPaletteEntries} paletteEntryLabels, " - f"got {len(paletteEntryLabels)}" - ) - cpal.paletteEntryLabels = buildPaletteLabels(paletteEntryLabels, nameTable) - else: - cpal.paletteEntryLabels = [ - C_P_A_L_.table_C_P_A_L_.NO_NAME_ID - ] * cpal.numPaletteEntries - else: - cpal.version = 0 - - return cpal - - -# COLR v1 tables -# See draft proposal at: https://github.com/googlefonts/colr-gradients-spec - - -def _is_colrv0_layer(layer: Any) -> bool: - # Consider as COLRv0 layer any sequence of length 2 (be it tuple or list) in which - # the first element is a str (the layerGlyph) and the second element is an int - # (CPAL paletteIndex). - # https://github.com/googlefonts/ufo2ft/issues/426 - try: - layerGlyph, paletteIndex = layer - except (TypeError, ValueError): - return False - else: - return isinstance(layerGlyph, str) and isinstance(paletteIndex, int) - - -def _split_color_glyphs_by_version( - colorGlyphs: _ColorGlyphsDict, -) -> Tuple[_ColorGlyphsV0Dict, _ColorGlyphsDict]: - colorGlyphsV0 = {} - colorGlyphsV1 = {} - for baseGlyph, layers in colorGlyphs.items(): - if all(_is_colrv0_layer(l) for l in layers): - colorGlyphsV0[baseGlyph] = layers - else: - colorGlyphsV1[baseGlyph] = layers - - # sanity check - assert set(colorGlyphs) == (set(colorGlyphsV0) | set(colorGlyphsV1)) - - return colorGlyphsV0, colorGlyphsV1 - - -def _reuse_ranges(num_layers: int) -> Generator[Tuple[int, int], None, None]: - # TODO feels like something itertools might have already - for lbound in range(num_layers): - # Reuse of very large #s of layers is relatively unlikely - # +2: we want sequences of at least 2 - # otData handles single-record duplication - for ubound in range( - lbound + 2, min(num_layers + 1, lbound + 2 + _MAX_REUSE_LEN) - ): - yield (lbound, ubound) - - -class LayerReuseCache: - reusePool: Mapping[Tuple[Any, ...], int] - tuples: Mapping[int, Tuple[Any, ...]] - keepAlive: List[ot.Paint] # we need id to remain valid - - def __init__(self): - self.reusePool = {} - self.tuples = {} - self.keepAlive = [] - - def _paint_tuple(self, paint: ot.Paint): - # start simple, who even cares about cyclic graphs or interesting field types - def _tuple_safe(value): - if isinstance(value, enum.Enum): - return value - elif hasattr(value, "__dict__"): - return tuple( - (k, _tuple_safe(v)) for k, v in sorted(value.__dict__.items()) - ) - elif isinstance(value, collections.abc.MutableSequence): - return tuple(_tuple_safe(e) for e in value) - return value - - # Cache the tuples for individual Paint instead of the whole sequence - # because the seq could be a transient slice - result = self.tuples.get(id(paint), None) - if result is None: - result = _tuple_safe(paint) - self.tuples[id(paint)] = result - self.keepAlive.append(paint) - return result - - def _as_tuple(self, paints: Sequence[ot.Paint]) -> Tuple[Any, ...]: - return tuple(self._paint_tuple(p) for p in paints) - - def try_reuse(self, layers: List[ot.Paint]) -> List[ot.Paint]: - found_reuse = True - while found_reuse: - found_reuse = False - - ranges = sorted( - _reuse_ranges(len(layers)), - key=lambda t: (t[1] - t[0], t[1], t[0]), - reverse=True, - ) - for lbound, ubound in ranges: - reuse_lbound = self.reusePool.get( - self._as_tuple(layers[lbound:ubound]), -1 - ) - if reuse_lbound == -1: - continue - new_slice = ot.Paint() - new_slice.Format = int(ot.PaintFormat.PaintColrLayers) - new_slice.NumLayers = ubound - lbound - new_slice.FirstLayerIndex = reuse_lbound - layers = layers[:lbound] + [new_slice] + layers[ubound:] - found_reuse = True - break - return layers - - def add(self, layers: List[ot.Paint], first_layer_index: int): - for lbound, ubound in _reuse_ranges(len(layers)): - self.reusePool[self._as_tuple(layers[lbound:ubound])] = ( - lbound + first_layer_index - ) - - -class LayerListBuilder: - layers: List[ot.Paint] - cache: LayerReuseCache - allowLayerReuse: bool - - def __init__(self, *, allowLayerReuse=True): - self.layers = [] - if allowLayerReuse: - self.cache = LayerReuseCache() - else: - self.cache = None - - # We need to intercept construction of PaintColrLayers - callbacks = _buildPaintCallbacks() - callbacks[ - ( - BuildCallback.BEFORE_BUILD, - ot.Paint, - ot.PaintFormat.PaintColrLayers, - ) - ] = self._beforeBuildPaintColrLayers - self.tableBuilder = TableBuilder(callbacks) - - # COLR layers is unusual in that it modifies shared state - # so we need a callback into an object - def _beforeBuildPaintColrLayers(self, dest, source): - # Sketchy gymnastics: a sequence input will have dropped it's layers - # into NumLayers; get it back - if isinstance(source.get("NumLayers", None), collections.abc.Sequence): - layers = source["NumLayers"] - else: - layers = source["Layers"] - - # Convert maps seqs or whatever into typed objects - layers = [self.buildPaint(l) for l in layers] - - # No reason to have a colr layers with just one entry - if len(layers) == 1: - return layers[0], {} - - if self.cache is not None: - # Look for reuse, with preference to longer sequences - # This may make the layer list smaller - layers = self.cache.try_reuse(layers) - - # The layer list is now final; if it's too big we need to tree it - is_tree = len(layers) > MAX_PAINT_COLR_LAYER_COUNT - layers = build_n_ary_tree(layers, n=MAX_PAINT_COLR_LAYER_COUNT) - - # We now have a tree of sequences with Paint leaves. - # Convert the sequences into PaintColrLayers. - def listToColrLayers(layer): - if isinstance(layer, collections.abc.Sequence): - return self.buildPaint( - { - "Format": ot.PaintFormat.PaintColrLayers, - "Layers": [listToColrLayers(l) for l in layer], - } - ) - return layer - - layers = [listToColrLayers(l) for l in layers] - - # No reason to have a colr layers with just one entry - if len(layers) == 1: - return layers[0], {} - - paint = ot.Paint() - paint.Format = int(ot.PaintFormat.PaintColrLayers) - paint.NumLayers = len(layers) - paint.FirstLayerIndex = len(self.layers) - self.layers.extend(layers) - - # Register our parts for reuse provided we aren't a tree - # If we are a tree the leaves registered for reuse and that will suffice - if self.cache is not None and not is_tree: - self.cache.add(layers, paint.FirstLayerIndex) - - # we've fully built dest; empty source prevents generalized build from kicking in - return paint, {} - - def buildPaint(self, paint: _PaintInput) -> ot.Paint: - return self.tableBuilder.build(ot.Paint, paint) - - def build(self) -> Optional[ot.LayerList]: - if not self.layers: - return None - layers = ot.LayerList() - layers.LayerCount = len(self.layers) - layers.Paint = self.layers - return layers - - -def buildBaseGlyphPaintRecord( - baseGlyph: str, layerBuilder: LayerListBuilder, paint: _PaintInput -) -> ot.BaseGlyphList: - self = ot.BaseGlyphPaintRecord() - self.BaseGlyph = baseGlyph - self.Paint = layerBuilder.buildPaint(paint) - return self - - -def _format_glyph_errors(errors: Mapping[str, Exception]) -> str: - lines = [] - for baseGlyph, error in sorted(errors.items()): - lines.append(f" {baseGlyph} => {type(error).__name__}: {error}") - return "\n".join(lines) - - -def buildColrV1( - colorGlyphs: _ColorGlyphsDict, - glyphMap: Optional[Mapping[str, int]] = None, - *, - allowLayerReuse: bool = True, -) -> Tuple[Optional[ot.LayerList], ot.BaseGlyphList]: - if glyphMap is not None: - colorGlyphItems = sorted( - colorGlyphs.items(), key=lambda item: glyphMap[item[0]] - ) - else: - colorGlyphItems = colorGlyphs.items() - - errors = {} - baseGlyphs = [] - layerBuilder = LayerListBuilder(allowLayerReuse=allowLayerReuse) - for baseGlyph, paint in colorGlyphItems: - try: - baseGlyphs.append(buildBaseGlyphPaintRecord(baseGlyph, layerBuilder, paint)) - - except (ColorLibError, OverflowError, ValueError, TypeError) as e: - errors[baseGlyph] = e - - if errors: - failed_glyphs = _format_glyph_errors(errors) - exc = ColorLibError(f"Failed to build BaseGlyphList:\n{failed_glyphs}") - exc.errors = errors - raise exc from next(iter(errors.values())) - - layers = layerBuilder.build() - glyphs = ot.BaseGlyphList() - glyphs.BaseGlyphCount = len(baseGlyphs) - glyphs.BaseGlyphPaintRecord = baseGlyphs - return (layers, glyphs) diff --git a/.venv/Lib/site-packages/fontTools/colorLib/errors.py b/.venv/Lib/site-packages/fontTools/colorLib/errors.py deleted file mode 100644 index 18cbebb..0000000 --- a/.venv/Lib/site-packages/fontTools/colorLib/errors.py +++ /dev/null @@ -1,2 +0,0 @@ -class ColorLibError(Exception): - pass diff --git a/.venv/Lib/site-packages/fontTools/colorLib/geometry.py b/.venv/Lib/site-packages/fontTools/colorLib/geometry.py deleted file mode 100644 index 1ce161b..0000000 --- a/.venv/Lib/site-packages/fontTools/colorLib/geometry.py +++ /dev/null @@ -1,143 +0,0 @@ -"""Helpers for manipulating 2D points and vectors in COLR table.""" - -from math import copysign, cos, hypot, isclose, pi -from fontTools.misc.roundTools import otRound - - -def _vector_between(origin, target): - return (target[0] - origin[0], target[1] - origin[1]) - - -def _round_point(pt): - return (otRound(pt[0]), otRound(pt[1])) - - -def _unit_vector(vec): - length = hypot(*vec) - if length == 0: - return None - return (vec[0] / length, vec[1] / length) - - -_CIRCLE_INSIDE_TOLERANCE = 1e-4 - - -# The unit vector's X and Y components are respectively -# U = (cos(α), sin(α)) -# where α is the angle between the unit vector and the positive x axis. -_UNIT_VECTOR_THRESHOLD = cos(3 / 8 * pi) # == sin(1/8 * pi) == 0.38268343236508984 - - -def _rounding_offset(direction): - # Return 2-tuple of -/+ 1.0 or 0.0 approximately based on the direction vector. - # We divide the unit circle in 8 equal slices oriented towards the cardinal - # (N, E, S, W) and intermediate (NE, SE, SW, NW) directions. To each slice we - # map one of the possible cases: -1, 0, +1 for either X and Y coordinate. - # E.g. Return (+1.0, -1.0) if unit vector is oriented towards SE, or - # (-1.0, 0.0) if it's pointing West, etc. - uv = _unit_vector(direction) - if not uv: - return (0, 0) - - result = [] - for uv_component in uv: - if -_UNIT_VECTOR_THRESHOLD <= uv_component < _UNIT_VECTOR_THRESHOLD: - # unit vector component near 0: direction almost orthogonal to the - # direction of the current axis, thus keep coordinate unchanged - result.append(0) - else: - # nudge coord by +/- 1.0 in direction of unit vector - result.append(copysign(1.0, uv_component)) - return tuple(result) - - -class Circle: - def __init__(self, centre, radius): - self.centre = centre - self.radius = radius - - def __repr__(self): - return f"Circle(centre={self.centre}, radius={self.radius})" - - def round(self): - return Circle(_round_point(self.centre), otRound(self.radius)) - - def inside(self, outer_circle, tolerance=_CIRCLE_INSIDE_TOLERANCE): - dist = self.radius + hypot(*_vector_between(self.centre, outer_circle.centre)) - return ( - isclose(outer_circle.radius, dist, rel_tol=_CIRCLE_INSIDE_TOLERANCE) - or outer_circle.radius > dist - ) - - def concentric(self, other): - return self.centre == other.centre - - def move(self, dx, dy): - self.centre = (self.centre[0] + dx, self.centre[1] + dy) - - -def round_start_circle_stable_containment(c0, r0, c1, r1): - """Round start circle so that it stays inside/outside end circle after rounding. - - The rounding of circle coordinates to integers may cause an abrupt change - if the start circle c0 is so close to the end circle c1's perimiter that - it ends up falling outside (or inside) as a result of the rounding. - To keep the gradient unchanged, we nudge it in the right direction. - - See: - https://github.com/googlefonts/colr-gradients-spec/issues/204 - https://github.com/googlefonts/picosvg/issues/158 - """ - start, end = Circle(c0, r0), Circle(c1, r1) - - inside_before_round = start.inside(end) - - round_start = start.round() - round_end = end.round() - inside_after_round = round_start.inside(round_end) - - if inside_before_round == inside_after_round: - return round_start - elif inside_after_round: - # start was outside before rounding: we need to push start away from end - direction = _vector_between(round_end.centre, round_start.centre) - radius_delta = +1.0 - else: - # start was inside before rounding: we need to push start towards end - direction = _vector_between(round_start.centre, round_end.centre) - radius_delta = -1.0 - dx, dy = _rounding_offset(direction) - - # At most 2 iterations ought to be enough to converge. Before the loop, we - # know the start circle didn't keep containment after normal rounding; thus - # we continue adjusting by -/+ 1.0 until containment is restored. - # Normal rounding can at most move each coordinates -/+0.5; in the worst case - # both the start and end circle's centres and radii will be rounded in opposite - # directions, e.g. when they move along a 45 degree diagonal: - # c0 = (1.5, 1.5) ===> (2.0, 2.0) - # r0 = 0.5 ===> 1.0 - # c1 = (0.499, 0.499) ===> (0.0, 0.0) - # r1 = 2.499 ===> 2.0 - # In this example, the relative distance between the circles, calculated - # as r1 - (r0 + distance(c0, c1)) is initially 0.57437 (c0 is inside c1), and - # -1.82842 after rounding (c0 is now outside c1). Nudging c0 by -1.0 on both - # x and y axes moves it towards c1 by hypot(-1.0, -1.0) = 1.41421. Two of these - # moves cover twice that distance, which is enough to restore containment. - max_attempts = 2 - for _ in range(max_attempts): - if round_start.concentric(round_end): - # can't move c0 towards c1 (they are the same), so we change the radius - round_start.radius += radius_delta - assert round_start.radius >= 0 - else: - round_start.move(dx, dy) - if inside_before_round == round_start.inside(round_end): - break - else: # likely a bug - raise AssertionError( - f"Rounding circle {start} " - f"{'inside' if inside_before_round else 'outside'} " - f"{end} failed after {max_attempts} attempts!" - ) - - return round_start diff --git a/.venv/Lib/site-packages/fontTools/colorLib/table_builder.py b/.venv/Lib/site-packages/fontTools/colorLib/table_builder.py deleted file mode 100644 index f1e182c..0000000 --- a/.venv/Lib/site-packages/fontTools/colorLib/table_builder.py +++ /dev/null @@ -1,223 +0,0 @@ -""" -colorLib.table_builder: Generic helper for filling in BaseTable derivatives from tuples and maps and such. - -""" - -import collections -import enum -from fontTools.ttLib.tables.otBase import ( - BaseTable, - FormatSwitchingBaseTable, - UInt8FormatSwitchingBaseTable, -) -from fontTools.ttLib.tables.otConverters import ( - ComputedInt, - SimpleValue, - Struct, - Short, - UInt8, - UShort, - IntValue, - FloatValue, - OptionalValue, -) -from fontTools.misc.roundTools import otRound - - -class BuildCallback(enum.Enum): - """Keyed on (BEFORE_BUILD, class[, Format if available]). - Receives (dest, source). - Should return (dest, source), which can be new objects. - """ - - BEFORE_BUILD = enum.auto() - - """Keyed on (AFTER_BUILD, class[, Format if available]). - Receives (dest). - Should return dest, which can be a new object. - """ - AFTER_BUILD = enum.auto() - - """Keyed on (CREATE_DEFAULT, class[, Format if available]). - Receives no arguments. - Should return a new instance of class. - """ - CREATE_DEFAULT = enum.auto() - - -def _assignable(convertersByName): - return {k: v for k, v in convertersByName.items() if not isinstance(v, ComputedInt)} - - -def _isNonStrSequence(value): - return isinstance(value, collections.abc.Sequence) and not isinstance(value, str) - - -def _split_format(cls, source): - if _isNonStrSequence(source): - assert len(source) > 0, f"{cls} needs at least format from {source}" - fmt, remainder = source[0], source[1:] - elif isinstance(source, collections.abc.Mapping): - assert "Format" in source, f"{cls} needs at least Format from {source}" - remainder = source.copy() - fmt = remainder.pop("Format") - else: - raise ValueError(f"Not sure how to populate {cls} from {source}") - - assert isinstance( - fmt, collections.abc.Hashable - ), f"{cls} Format is not hashable: {fmt!r}" - assert fmt in cls.convertersByName, f"{cls} invalid Format: {fmt!r}" - - return fmt, remainder - - -class TableBuilder: - """ - Helps to populate things derived from BaseTable from maps, tuples, etc. - - A table of lifecycle callbacks may be provided to add logic beyond what is possible - based on otData info for the target class. See BuildCallbacks. - """ - - def __init__(self, callbackTable=None): - if callbackTable is None: - callbackTable = {} - self._callbackTable = callbackTable - - def _convert(self, dest, field, converter, value): - enumClass = getattr(converter, "enumClass", None) - - if enumClass: - if isinstance(value, enumClass): - pass - elif isinstance(value, str): - try: - value = getattr(enumClass, value.upper()) - except AttributeError: - raise ValueError(f"{value} is not a valid {enumClass}") - else: - value = enumClass(value) - - elif isinstance(converter, IntValue): - value = otRound(value) - elif isinstance(converter, FloatValue): - value = float(value) - - elif isinstance(converter, Struct): - if converter.repeat: - if _isNonStrSequence(value): - value = [self.build(converter.tableClass, v) for v in value] - else: - value = [self.build(converter.tableClass, value)] - setattr(dest, converter.repeat, len(value)) - else: - value = self.build(converter.tableClass, value) - elif callable(converter): - value = converter(value) - - setattr(dest, field, value) - - def build(self, cls, source): - assert issubclass(cls, BaseTable) - - if isinstance(source, cls): - return source - - callbackKey = (cls,) - fmt = None - if issubclass(cls, FormatSwitchingBaseTable): - fmt, source = _split_format(cls, source) - callbackKey = (cls, fmt) - - dest = self._callbackTable.get( - (BuildCallback.CREATE_DEFAULT,) + callbackKey, lambda: cls() - )() - assert isinstance(dest, cls) - - convByName = _assignable(cls.convertersByName) - skippedFields = set() - - # For format switchers we need to resolve converters based on format - if issubclass(cls, FormatSwitchingBaseTable): - dest.Format = fmt - convByName = _assignable(convByName[dest.Format]) - skippedFields.add("Format") - - # Convert sequence => mapping so before thunk only has to handle one format - if _isNonStrSequence(source): - # Sequence (typically list or tuple) assumed to match fields in declaration order - assert len(source) <= len( - convByName - ), f"Sequence of {len(source)} too long for {cls}; expected <= {len(convByName)} values" - source = dict(zip(convByName.keys(), source)) - - dest, source = self._callbackTable.get( - (BuildCallback.BEFORE_BUILD,) + callbackKey, lambda d, s: (d, s) - )(dest, source) - - if isinstance(source, collections.abc.Mapping): - for field, value in source.items(): - if field in skippedFields: - continue - converter = convByName.get(field, None) - if not converter: - raise ValueError( - f"Unrecognized field {field} for {cls}; expected one of {sorted(convByName.keys())}" - ) - self._convert(dest, field, converter, value) - else: - # let's try as a 1-tuple - dest = self.build(cls, (source,)) - - for field, conv in convByName.items(): - if not hasattr(dest, field) and isinstance(conv, OptionalValue): - setattr(dest, field, conv.DEFAULT) - - dest = self._callbackTable.get( - (BuildCallback.AFTER_BUILD,) + callbackKey, lambda d: d - )(dest) - - return dest - - -class TableUnbuilder: - def __init__(self, callbackTable=None): - if callbackTable is None: - callbackTable = {} - self._callbackTable = callbackTable - - def unbuild(self, table): - assert isinstance(table, BaseTable) - - source = {} - - callbackKey = (type(table),) - if isinstance(table, FormatSwitchingBaseTable): - source["Format"] = int(table.Format) - callbackKey += (table.Format,) - - for converter in table.getConverters(): - if isinstance(converter, ComputedInt): - continue - value = getattr(table, converter.name) - - enumClass = getattr(converter, "enumClass", None) - if enumClass: - source[converter.name] = value.name.lower() - elif isinstance(converter, Struct): - if converter.repeat: - source[converter.name] = [self.unbuild(v) for v in value] - else: - source[converter.name] = self.unbuild(value) - elif isinstance(converter, SimpleValue): - # "simple" values (e.g. int, float, str) need no further un-building - source[converter.name] = value - else: - raise NotImplementedError( - "Don't know how unbuild {value!r} with {converter!r}" - ) - - source = self._callbackTable.get(callbackKey, lambda s: s)(source) - - return source diff --git a/.venv/Lib/site-packages/fontTools/colorLib/unbuilder.py b/.venv/Lib/site-packages/fontTools/colorLib/unbuilder.py deleted file mode 100644 index ac24355..0000000 --- a/.venv/Lib/site-packages/fontTools/colorLib/unbuilder.py +++ /dev/null @@ -1,81 +0,0 @@ -from fontTools.ttLib.tables import otTables as ot -from .table_builder import TableUnbuilder - - -def unbuildColrV1(layerList, baseGlyphList): - layers = [] - if layerList: - layers = layerList.Paint - unbuilder = LayerListUnbuilder(layers) - return { - rec.BaseGlyph: unbuilder.unbuildPaint(rec.Paint) - for rec in baseGlyphList.BaseGlyphPaintRecord - } - - -def _flatten_layers(lst): - for paint in lst: - if paint["Format"] == ot.PaintFormat.PaintColrLayers: - yield from _flatten_layers(paint["Layers"]) - else: - yield paint - - -class LayerListUnbuilder: - def __init__(self, layers): - self.layers = layers - - callbacks = { - ( - ot.Paint, - ot.PaintFormat.PaintColrLayers, - ): self._unbuildPaintColrLayers, - } - self.tableUnbuilder = TableUnbuilder(callbacks) - - def unbuildPaint(self, paint): - assert isinstance(paint, ot.Paint) - return self.tableUnbuilder.unbuild(paint) - - def _unbuildPaintColrLayers(self, source): - assert source["Format"] == ot.PaintFormat.PaintColrLayers - - layers = list( - _flatten_layers( - [ - self.unbuildPaint(childPaint) - for childPaint in self.layers[ - source["FirstLayerIndex"] : source["FirstLayerIndex"] - + source["NumLayers"] - ] - ] - ) - ) - - if len(layers) == 1: - return layers[0] - - return {"Format": source["Format"], "Layers": layers} - - -if __name__ == "__main__": - from pprint import pprint - import sys - from fontTools.ttLib import TTFont - - try: - fontfile = sys.argv[1] - except IndexError: - sys.exit("usage: fonttools colorLib.unbuilder FONTFILE") - - font = TTFont(fontfile) - colr = font["COLR"] - if colr.version < 1: - sys.exit(f"error: No COLR table version=1 found in {fontfile}") - - colorGlyphs = unbuildColrV1( - colr.table.LayerList, - colr.table.BaseGlyphList, - ) - - pprint(colorGlyphs) diff --git a/.venv/Lib/site-packages/fontTools/config/__init__.py b/.venv/Lib/site-packages/fontTools/config/__init__.py deleted file mode 100644 index 41ab8f7..0000000 --- a/.venv/Lib/site-packages/fontTools/config/__init__.py +++ /dev/null @@ -1,75 +0,0 @@ -""" -Define all configuration options that can affect the working of fontTools -modules. E.g. optimization levels of varLib IUP, otlLib GPOS compression level, -etc. If this file gets too big, split it into smaller files per-module. - -An instance of the Config class can be attached to a TTFont object, so that -the various modules can access their configuration options from it. -""" - -from textwrap import dedent - -from fontTools.misc.configTools import * - - -class Config(AbstractConfig): - options = Options() - - -OPTIONS = Config.options - - -Config.register_option( - name="fontTools.otlLib.optimize.gpos:COMPRESSION_LEVEL", - help=dedent( - """\ - GPOS Lookup type 2 (PairPos) compression level: - 0 = do not attempt to compact PairPos lookups; - 1 to 8 = create at most 1 to 8 new subtables for each existing - subtable, provided that it would yield a 50%% file size saving; - 9 = create as many new subtables as needed to yield a file size saving. - Default: 0. - - This compaction aims to save file size, by splitting large class - kerning subtables (Format 2) that contain many zero values into - smaller and denser subtables. It's a trade-off between the overhead - of several subtables versus the sparseness of one big subtable. - - See the pull request: https://github.com/fonttools/fonttools/pull/2326 - """ - ), - default=0, - parse=int, - validate=lambda v: v in range(10), -) - -Config.register_option( - name="fontTools.ttLib.tables.otBase:USE_HARFBUZZ_REPACKER", - help=dedent( - """\ - FontTools tries to use the HarfBuzz Repacker to serialize GPOS/GSUB tables - if the uharfbuzz python bindings are importable, otherwise falls back to its - slower, less efficient serializer. Set to False to always use the latter. - Set to True to explicitly request the HarfBuzz Repacker (will raise an - error if uharfbuzz cannot be imported). - """ - ), - default=None, - parse=Option.parse_optional_bool, - validate=Option.validate_optional_bool, -) - -Config.register_option( - name="fontTools.otlLib.builder:WRITE_GPOS7", - help=dedent( - """\ - macOS before 13.2 didn’t support GPOS LookupType 7 (non-chaining - ContextPos lookups), so FontTools.otlLib.builder disables a file size - optimisation that would use LookupType 7 instead of 8 when there is no - chaining (no prefix or suffix). Set to True to enable the optimization. - """ - ), - default=False, - parse=Option.parse_optional_bool, - validate=Option.validate_optional_bool, -) diff --git a/.venv/Lib/site-packages/fontTools/config/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/config/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 4924874adc671aa238cb09e96269a50eb2968fb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3421 zcmb7G-ESMm5#OUeDAA&<#HiXdeOS0QDkU=YVYEq=)~IDmvQS47M5+MC7~!(AP+8(0(mn6v_+m=6z(5m6agymsc3)zd81)J<*74wyrUE&K)dA4?cMGE zc4l_wH~Y78xx}!+S06V2ioGxCA#24!=jC08u_w%D2h4Z;Lf~`?2L*@vBf&_G71$>8 zM?Yr%7>qt0VeA=RX*(E$u?OS%QxV2KpU9rh-~I6dgMwdtit9YXD{a05lm5iV>>ra) z$M8K~X>-_j;*=7cOW(qog3^Oa*=+1jW&QsHxtt(Re+&8Y|BmcWRoVQEuxMWCE;MBb zTm%94RM?cQSPLsv$W=r)!);qw?un3#W)nP%&%nD%Ka^pMt0r%%(AJa+OsS*%H~>@O z>y=g|nck5nDOLc75EvSMDD-{V;9L8<3tZWN`kT8uRb0ChX)uOXPDU@3zUJGCV)-`8XkeZk?K<^m2QVP#8?q}Kq`;{cM?;% z7YJh#;~MA!YlYVaA6MXl*J>MR8CQ)5Xf!US5=WG1GTI-~7p2t?wJq zrViSN4)4T9H0s-MWW7Mee*La`7K zX_;^CZ`Cb*a9gpgR}LXOtmA&yjkIth65d160#nc9XE6=GMc0*~w60r;jy2_LA}(Xc zyoKU4|D8>L?{Vvo@)LQwNk3iA#-1$Yn3XidDr6-FBUDP>x=bVA$N8QHVJR9hzKrFA_aSt-i5pflFvT$GGzSb;4oA{h%)|>& zq)9e*fk#>$N{qB5ekonLDh_;pECHq9KV7T zgD)_alhnz8lZ-uwS;=)o$`Ns3SNReqCn-yHNV7NxdI&nCZOHM#5%;+FSw-S-$I2oac(C3(@ zm=r@u3Om=8!7T41# zznS<&AUX|S+|pO@@m;*k42o0s>7&1_e}46|tv_#l`ukIsq_#a&ws8)*_))(xkv#UlRsa_p9sfz1w>mYx@TW?%w+D?K{6--xGg8 zttiZ>ZDb`2w@>1>W0b`v_3J&Mn``mO3Eu-^DBN=jLC_Kx$Lt_(Slq1cukm!v+>tUZ zD{&j=H)wuzY}**c4H^0vj2J2!xa>qqCljgmwLy0!F5ASqWq1QuqqU?pIj9L#7xV(w zLyQY(Hl-(#dWY)h3a>)KFdHHu1F&udU2$x3a{^)^J1XJOI3kCp2Z)rhYed-Z@wrfiH@r3` zIXXXA7i*-&N`^$9QSf|H*zzy7zx zujsnI^04|(klkG^B25Y2`{8gGI?{MZ7zD!FnomhLto!uIi z%xdqlh8C6`&~AEq=#3z8_QrRTGez%8lCOhLB5)hXLcQ56doRA%bo@;#_kb_b1IsP_ zWBfowVs4@Ak2sFgFBF~8J|poabAI%ky?y@wZ#MTl`}fBk=LdcEx_JEC7xebk@Y4jl z^u{NZ(_(*|ImLgm*?+Rxv&j$6CNDpp?H8ser(TTAl*V5%6#c8LJbhLwpOvpaFJJG! z%bf4OV6#r)6^VW#md;_^8eohQ#sp!YK*h^%oRwz2C|x@%U-_c^PXFx$W}0A7^b^6) h!7L77#t5cJFev&nto-H$n70y`GQpteUlfUd{|n`t;m-g7 diff --git a/.venv/Lib/site-packages/fontTools/cu2qu/__init__.py b/.venv/Lib/site-packages/fontTools/cu2qu/__init__.py deleted file mode 100644 index 4ae6356..0000000 --- a/.venv/Lib/site-packages/fontTools/cu2qu/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2016 Google Inc. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from .cu2qu import * diff --git a/.venv/Lib/site-packages/fontTools/cu2qu/__main__.py b/.venv/Lib/site-packages/fontTools/cu2qu/__main__.py deleted file mode 100644 index 084bf8f..0000000 --- a/.venv/Lib/site-packages/fontTools/cu2qu/__main__.py +++ /dev/null @@ -1,6 +0,0 @@ -import sys -from .cli import main - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/.venv/Lib/site-packages/fontTools/cu2qu/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/cu2qu/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 8848b730bd7c38e98bc694728c514287ec6ee930..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmZ3^%ge<81gXz_(<+%57#@Q-FaYF(!Dl`oHJu@aA%!uAA%r1?DVRZ%`6VMzP?PZ% zqn00#WKAwLDlA>e@EN4xS5LB4OlWaxQE^OaQA%pALT+hsVp5D>YDGzMPJU@hj7xrY zX>Mv>Noq`RNoh)EX>N>*hf{b=h>?MTL5!iHLU4XsNqJ&XYK(!Qf_tcEObJLLKD{(E zMz1V2uPnwVGbyGxvm{lwATc>RF+H_7CM`d&BqTpSr&u5C5dHZ0%)HE!_;|g7%3mBd ox%nxjIjMF<96-l`oLwvlBt9@RGBSRUV_+1$z#xK*ir9d%087A6)Bpeg diff --git a/.venv/Lib/site-packages/fontTools/cu2qu/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/cu2qu/__pycache__/__main__.cpython-311.pyc deleted file mode 100644 index 834a6d37a35b59b6707db09ed38529257d9d153b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457 zcmY*UJ5K^Z5Z=983_<9yfQptvI4F&=P!cgw8XiWn$>q3R$jLqM_7=g4!U7X|{{hDM zXV6%XYfVh(Na(2CMX&JNd4DsL*_Tu*0R-sxRrf~tFPTI@f5E0Lf@eSgfi`FZq7c=F zj?z{jpejLqMfUkw1yFDs%>a=pb5VbjKZ; zORwwsSg5iw3suv$e7RmyuHjH!4-p+%!7JFv`R&X+!c9hfhN(}elXEyTI=DthfoXf3 z;ELDh4s`>H>j5VgcW|Y8dW{=pP1A6xl&gE);NI{l)=Iha<^>KUq4&6j3q$G-@uk(l z%nIn?z%ctpk22i#+@RrkHY=LEe8-E?$%Vmq8$WhD!fkrur^IpcYpgEJT7?iUL1MCd yOK`CGFY7&klGBF|HM3ANOO%|PJyxfUY2&FiYrUiNCrU3OS*rkLMVG%X_Wl5QQ+iDR diff --git a/.venv/Lib/site-packages/fontTools/cu2qu/__pycache__/benchmark.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/cu2qu/__pycache__/benchmark.cpython-311.pyc deleted file mode 100644 index 6b4469383b5fcdedc1a27971ef39c8add71b47bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3549 zcmai0U2GFq7QS~pwkM8lNJ2{UQ)IP-#0exeU8*G;hze<7x2>gZfTWRkU1w%&47SI; zGX`ook}E~3sh|oHRm^UY^2CDZN<8dCceN|^rBWX~l^>#!A|X|*nm4bqm8v}LIWxB7 zNhy10=FI&)=ey^gpZgb|&qJWd|9&@7bQ1DCHk!rJsBC`cw7kSCGLKdBp8>mYXfV!o9l6QqJ3X%_69kNIAU*(V|8{~-0UFmG_2d)n& zA&=p+3MDY!@cq{33#;+#`0m?J}>J=K(9=bU{9}9=Cez@-C4zO3AHZiNnn@uoaTRT}FZq!tQO=9Zaic-MMYtfihKiso!jDM^r9*=H7YYn&IB@fHNF&$$Tu`Gt>mTX zjB+)fk+Yf{ozwDCDxZnYoIf)ky>L7f3Pr==z?_oMuE&`i4TS^eF8(&E;Xo{zPesSC z$=PescT!7HHKobNa&hr$JSnTugp$=RC`wwLFzsYwscAdoxsP@_rjl}2zL8_63rDfW z;+h;2^X!^DK9yF)cv?LTm6WQ9N+t)@=4>zQMtuXw5Ac*o)pr)&C%w1j&u8yO*2C+P zeqgM2U`+QPt@)2yqwRDXR+24L2`I^_<#TD-aDv*Ba*$)l+i>O-P+>!B%nw~Vo?Re? zSN}g)bT9QSASF^K4zFvMJoR?{=pY?_3(>!ZzNUX4`R53;$KtMj%9wI_#LH z#6HZ&B{=?+$Od6z7kn!2vqUyK`}EF%TIaz1`D*9kDu4LrI8iSq&InX6ek?=Gu*Z-h zu{+dW_io=ok`_q;Tnu*tk!1^6+Z-L`A-L^PQ=S=K_S@aut{(^&U30`#0h}M|rDbTQ zwYM7@>xJRMu{QOnHvK%$Gf=ncAt2xj-c#1QK6Lw!y6=^m@0C`UsX360*x3LOh|HdB zK4YDNs$vKYSSHo?i}Km4FbgrN6F^F2qpQ30yA4z7Ur#*g*T<%6V^bhf_nxYGPkrP5 z>Z5Nb_34Y%&P!GPl8L||TNuE$egMUaSZfv+RLpbq0}?#PA}v7Iva`ssKzr~m(mz8g zEOI~{_j!r`(rFK#loXwktH|N%f)6=l545kB+`t*6J#Qr@&t=#1!!$>Vt|Be&kydmR z`7b*j0P@F(-Ym;*n>>$($)Qn-Zo4f?ooH=Ez5p=;QQ1c!^%Af{Z^Up}XHswlu0x^? z?9fT}8nA>zbjVrBps|8uNSzehd=WBv!%`Da`GkBzU*yF%NnZmYA)mg$+i%jgd9+N* zG{Hg67M9^eFeygF78|IvoCWRkb8ZbV-NcVRfcEYU<1^SK>xVAOOE^PFPtX=0`u(|Sp9Wnv9fqC z`bD(bGg|eIT5duOcQUOkK@Nh1dkle%BSE8A@t8mOpy4VF7_4yU#W2us%#838h~4bz zzjN~L$;v{l=SW%D>>a%G{@wR0g<9`u*;D6f$5@^G5^<6J2h0A3FGJdwb26rX@Z%+! z6@-qV6XW4TUQL2HQd${*Gsr_aW01}amzK)NDUBV65yO#5WrKp@$|zDkEt@+uyq2cb zd?Jy$VNPSO!(40UVO-^AvYJn8s)|>vK%-d4;j?X@O~M2`PxT)_FiiAS&g)%=Ay&A1 z>V$WWYzn^04SXIB;#2j%@zt5CFs%#IHDMYm8$$Q0Sb0Z(X+#%B%AT_4ncyqStCw~E zp>>!ztP8_6VHhfP-t9bCCr$EWH`&*FD^odFIk$fP;T3)GWNq-|*GH@feD=t)%Z}A4{cfZ^ G;r{?gw@}GR*PI*qDWi^Rsr{;K!CRB4Nw&Q+!eO)VgUjMiWIm%1%u=QM$nI*ndMWD z)E6D@o}HaJb7tn8Gv~~l<==WdP6`tLUzex;tc9Zf6Tg&`rIh*ce<1UO;wX+zQsc&x z9;eB>Y1~Af=5aH5GUFC_nv&L(ZQMpi z_c{!!zHx85yPM+uJrruEsZwbGN`s|R=Xmfv+#>jXFl{%Uv-B)=&-@-WOTR~@nR4Dl z@ur!E@>DqMQ<|cl!)>JT5NCTxjW=?3fK8l-b3CNSn>i=EwQw$gtx)EMvNn#sL501) z$IZsVv~G(h1u>DH#@S2^Nr_nU_n2zfqz9&iv=o(u=m*&thhkD9t_N|ESXY+w;j){8 zkQDpl+5I16#$iTx4_m7tVJOKtsl_68qOeOymYM;Yxq#IN>CE=E(1k7V-3bW}3 zRc1%nG={J|!)D!-%IJ=GCL4_l*|elLj0w_(R3^!%__V}x!w3oJ8|p_)>*tT-M<;HH zJQ62(#PKOMl@()?6Jz{63D}V3Ce8|XvZUF>4JpedvZ;x)=TE;oadZFPy?ZD2?PG5U zQ_^e<@e_OZvFC1Gn2>NqbUK@u=)cRS?@nAwOiqXiiH~Gr@jJ0;UYw{f=WW8Ax8un~ zf9AgKj8+DWd@!_`ErBY~eE!7`7C$JO zq4f3Z*Pe?JH zk0rYy%~AELd4rN_@T$FR!~>b?jF92eVMe#zj)^fzLb@|MB}7vKmre3IGXkoH0?;L> zE0c*yw?#Zr7I^{ccHA@y=%@)7!Yv*Lus{`T-cNE%ALgx!txvV}VK(k6_*$1feCg|6 z^L6LXD!#Dl3(NL!!PU4lv~o~!v8s!e85VhfK)k{Tc)>d7g8Rq4&~rUA*H38PT+6n6 zEfpYOB#wqwb-&XA$)fbkaG;x_<5Yn;L5ql$Bz>fE+)rocEq zzWC8a*}v=AsKN}Y%%IE+7Hlmm4YI8duDsQF7Ac!$cfs!c)b-f4d@T=?UgXfFTq@Z%FQ)4EZ`u#kz0 z{WoORTfz0~A9cKe-CD?%HKVVyn*IDxc)M0g^*wW8ZrAGWr?BFlS5_UF=bMb$411JK9Rjz9ivZXAxwlvMZs6foZT4~d zq0IsA;3jS8Jm~Spv|+c$NTDj$LL=y5&910g!wuAHJ+-!}AuYz1#vEb%o<|menKcsY_i|OrYv7zt!VGA7n+K4#25M3~fD&qxJ2{ zEP`d)=r4duvToaHt@tQ4OPj^*~tmVMou_U=~QjaoVETWahCekr3qN|^NxAv z8;tDKoU^_?XsHu5%{lVhtG!fnfL*tPpsA(9TjADQGQhmdHNZi)cJwtI*km5fWFD@0 zCydB14cCmqwQv|!xVs`;64IS*~>GQlaItO3xa5T+VFliOE1 zDzh>6*2on&CZ{EK3JEDVH%}(wtR%3N$Xw|tty@Txi9|<`Fr9NmB5>9g6GB?Il`?SV zu*TvN6rqDK2Hgf{YuKrZKhwK)%Z0J4w{GTog*4B?nLH)He%9FP;{HV;i{i$xc+7e}S}k%J zeNM%aBA@Hw1U4;5Yzd7VAb=qfaGR|(0cJBCFG_@e&a% zr$7b>#||89!JK8q+d?+Uv3PXAuyP|@6Bkl&eo0Iwk_qX4Nk-*9W^&d@WJZ_-{TLzv zSDhZq9Vshj7Ke`6F^Hokr38drSrAg37exr_RHe~d&W6P>M0T+4M@KNgBEjmBhItVg zmBb_DJducTu!>;a)U8);-NcFs8i=DiQ2N=^_t}yzkVRu0 z%piuCm`WJhl1awmd_Q~hc0y!@bn-qsE1)|fJDZSh!(zjeg1HdQ2Q@cDTsuH6=dKJ8 zM5H^;UbsGd=H`{_@8wG4E=f*6KpGSZj)el83h%BPshB%53|)f4L4*oo$NTZBgOS5@ z$XOEcA7nv~INTa#(=b&SuNX&(jMT5&-aU1F?84YNow+bJaz(eC9X@^Q9ISjx67(&Z z+aD3$t_%`$k&VaFeG)s#8>&s_O5|3as+eo;>lOQ0=mYCxtU8Cfa5CPjTz_4Tjbec3y();sVbrt}_Gdk-t_BdYsI z(OlPt9H4LFFeaBxWul@KgBXAl>|PX%T$E2Cyrcp?utfBb}$;%EmKJ$Cg~j*IhB>N(8K*Ge=nW{ zb9R@HP9q_k(am5Z$)_3JN&3QMMTA+YTMQ?KJu2~VHXNpg0qZW%wL~0bGnJUu%}G9u z4q^OqP#Uj7bR9~nN{S+cVCoJwBbJ1S9}Jg>OS<2%Y1njQO%RZw2o~a!bZ^yyW3x{} zN~jH!#(^%~oJ(X7-t3dGkPa(h62joAL>l2!9*J}#toaBZZFS}YN~l@JX>_~5BCIQEWM$db5~5y28j z%~UoWhp#x$H(`p14-9O5I%!1f8N3$J9MqqITP%Q5!{Yni)2MoSp7qI|{fcM5>e;_A zqA|{wO!FGkyyALx;h*oTLpNonSz&Ie%q^L@RjJkN0nHoG{LPx@V9`NYT7IA`7VA$K z6bW!s7FUT7vvTJ}-|zMjI>Rb6EHlG3bljS~qu>c*QvQ(UxmffNYBo#_0R9|cE&40e zG&?kajvF;!yXF}xx(K!vV*@A>;H|-K(>$!^>(D$0HXWvyYG{2K99RnuD8WHBIJj_8 zV|*`}jy0x(^wdVWxq{nvZZbuG4XVH3@e`f|3f`7S$)%*`Z_qsFiviNqfkz0SNI(5Z&#jCyuGTocj4Ukwt#GFg#e}z)4ZzKuc`KHvi;gCS8!)U|SI&Cw}4IyHY2E_>x~UbGY#mkOG~%S?~L^r%b^WWKjK7YCPy z6kEG$YhQ`2*}7y~SN@#ZGYHR0Zx|1o=Pq(w5 zK6w0KWybifh`;-sqHzTN{PMWsW>q&UldBMD_`LZ^=VzTOIVG@54eWx*D`0BwAod_~ z>;4zxO6!o~KB>A-%I=dzQ=Q`=Zbv&a`maO8qx^tf(N7pGx)$UtLkygDQJaX+F5<{@xSN8rnV|%3oV+cnflB!)~o@yV`a@ z>w4?UdAaG(GQZ5f=qWlZUMuL57sLr*VWjA#>^{}jS)`gRBXsH0mmJ!!*bk`o1G4>q zM(qBx+0_rh*ekvv)i<=r6kMGvoa~Cgm7g-6Matau<|pSrI}ai6P*@FxWpceT3V%KN z`RFqIimo!jKX|D^@NlwEQOc zWph6CSDjyWDuF&VfWKdR&e6{f!lHTN{>;5{^Xmio*{?qQ)~$38tKGwje?;|<$o>)d zMhJKYwgG=2Eq@}gw)~g#@CSomMlfpsVBNq{vi_mB5xT_Gf`3Q;=(9hS{ljp5J7qi# zh(`<7f?$g{b}0Any4Gt}dYNlso3e)nh`OOT+-`W!_aKir4Eh1+KH~^t96!Jp8=lPx zPE>+_cO(;&#NWY|0Gy75|Eywo!U;@(#Q*|)hVwLhysfk&*In>m5&=oW zplOYAERdf@`4-4eqr3~`r%|2-^3$jexqNBVHo5-Ns7|^5dPVu=@}*IS*W?p7Z2`100B^9!7(Y;=*Z8Bg2WMUv zZ9on`y_Bc`jiK9cixTi! z=?FN}G6K`np8qNR6oT5zsLPPF5%5utQ`Obn%zjKnj&y4dS GT>HOzs-h?W diff --git a/.venv/Lib/site-packages/fontTools/cu2qu/__pycache__/cu2qu.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/cu2qu/__pycache__/cu2qu.cpython-311.pyc deleted file mode 100644 index d1e70feb6237313c3f17d8a4eaefcb73ba58addf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22781 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 IB`=!(A0xhvs{jB1 diff --git a/.venv/Lib/site-packages/fontTools/cu2qu/__pycache__/errors.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/cu2qu/__pycache__/errors.cpython-311.pyc deleted file mode 100644 index cb6f80ac0c5f4dc6045705f9519482bef20590bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5897 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 Y=M6TmZSeNHuxlkjiJ^6^3X2)&e;o1Xm;e9( diff --git a/.venv/Lib/site-packages/fontTools/cu2qu/__pycache__/ufo.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/cu2qu/__pycache__/ufo.cpython-311.pyc deleted file mode 100644 index a3d32b01ac11ece7e0239a656d92d23894702dad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17155 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 WHh9Krr`UetK{K diff --git a/.venv/Lib/site-packages/fontTools/cu2qu/benchmark.py b/.venv/Lib/site-packages/fontTools/cu2qu/benchmark.py deleted file mode 100644 index 2ab1e96..0000000 --- a/.venv/Lib/site-packages/fontTools/cu2qu/benchmark.py +++ /dev/null @@ -1,55 +0,0 @@ -"""Benchmark the cu2qu algorithm performance.""" - -from .cu2qu import * -import random -import timeit - -MAX_ERR = 0.05 - - -def generate_curve(): - return [ - tuple(float(random.randint(0, 2048)) for coord in range(2)) - for point in range(4) - ] - - -def setup_curve_to_quadratic(): - return generate_curve(), MAX_ERR - - -def setup_curves_to_quadratic(): - num_curves = 3 - return ([generate_curve() for curve in range(num_curves)], [MAX_ERR] * num_curves) - - -def run_benchmark(module, function, setup_suffix="", repeat=5, number=1000): - setup_func = "setup_" + function - if setup_suffix: - print("%s with %s:" % (function, setup_suffix), end="") - setup_func += "_" + setup_suffix - else: - print("%s:" % function, end="") - - def wrapper(function, setup_func): - function = globals()[function] - setup_func = globals()[setup_func] - - def wrapped(): - return function(*setup_func()) - - return wrapped - - results = timeit.repeat(wrapper(function, setup_func), repeat=repeat, number=number) - print("\t%5.1fus" % (min(results) * 1000000.0 / number)) - - -def main(): - """Benchmark the cu2qu algorithm performance.""" - run_benchmark("cu2qu", "curve_to_quadratic") - run_benchmark("cu2qu", "curves_to_quadratic") - - -if __name__ == "__main__": - random.seed(1) - main() diff --git a/.venv/Lib/site-packages/fontTools/cu2qu/cli.py b/.venv/Lib/site-packages/fontTools/cu2qu/cli.py deleted file mode 100644 index 9144043..0000000 --- a/.venv/Lib/site-packages/fontTools/cu2qu/cli.py +++ /dev/null @@ -1,198 +0,0 @@ -import os -import argparse -import logging -import shutil -import multiprocessing as mp -from contextlib import closing -from functools import partial - -import fontTools -from .ufo import font_to_quadratic, fonts_to_quadratic - -ufo_module = None -try: - import ufoLib2 as ufo_module -except ImportError: - try: - import defcon as ufo_module - except ImportError as e: - pass - - -logger = logging.getLogger("fontTools.cu2qu") - - -def _cpu_count(): - try: - return mp.cpu_count() - except NotImplementedError: # pragma: no cover - return 1 - - -def open_ufo(path): - if hasattr(ufo_module.Font, "open"): # ufoLib2 - return ufo_module.Font.open(path) - return ufo_module.Font(path) # defcon - - -def _font_to_quadratic(input_path, output_path=None, **kwargs): - ufo = open_ufo(input_path) - logger.info("Converting curves for %s", input_path) - if font_to_quadratic(ufo, **kwargs): - logger.info("Saving %s", output_path) - if output_path: - ufo.save(output_path) - else: - ufo.save() # save in-place - elif output_path: - _copytree(input_path, output_path) - - -def _samepath(path1, path2): - # TODO on python3+, there's os.path.samefile - path1 = os.path.normcase(os.path.abspath(os.path.realpath(path1))) - path2 = os.path.normcase(os.path.abspath(os.path.realpath(path2))) - return path1 == path2 - - -def _copytree(input_path, output_path): - if _samepath(input_path, output_path): - logger.debug("input and output paths are the same file; skipped copy") - return - if os.path.exists(output_path): - shutil.rmtree(output_path) - shutil.copytree(input_path, output_path) - - -def main(args=None): - """Convert a UFO font from cubic to quadratic curves""" - parser = argparse.ArgumentParser(prog="cu2qu") - parser.add_argument("--version", action="version", version=fontTools.__version__) - parser.add_argument( - "infiles", - nargs="+", - metavar="INPUT", - help="one or more input UFO source file(s).", - ) - parser.add_argument("-v", "--verbose", action="count", default=0) - parser.add_argument( - "-e", - "--conversion-error", - type=float, - metavar="ERROR", - default=None, - help="maxiumum approximation error measured in EM (default: 0.001)", - ) - parser.add_argument( - "-m", - "--mixed", - default=False, - action="store_true", - help="whether to used mixed quadratic and cubic curves", - ) - parser.add_argument( - "--keep-direction", - dest="reverse_direction", - action="store_false", - help="do not reverse the contour direction", - ) - - mode_parser = parser.add_mutually_exclusive_group() - mode_parser.add_argument( - "-i", - "--interpolatable", - action="store_true", - help="whether curve conversion should keep interpolation compatibility", - ) - mode_parser.add_argument( - "-j", - "--jobs", - type=int, - nargs="?", - default=1, - const=_cpu_count(), - metavar="N", - help="Convert using N multiple processes (default: %(default)s)", - ) - - output_parser = parser.add_mutually_exclusive_group() - output_parser.add_argument( - "-o", - "--output-file", - default=None, - metavar="OUTPUT", - help=( - "output filename for the converted UFO. By default fonts are " - "modified in place. This only works with a single input." - ), - ) - output_parser.add_argument( - "-d", - "--output-dir", - default=None, - metavar="DIRECTORY", - help="output directory where to save converted UFOs", - ) - - options = parser.parse_args(args) - - if ufo_module is None: - parser.error("Either ufoLib2 or defcon are required to run this script.") - - if not options.verbose: - level = "WARNING" - elif options.verbose == 1: - level = "INFO" - else: - level = "DEBUG" - logging.basicConfig(level=level) - - if len(options.infiles) > 1 and options.output_file: - parser.error("-o/--output-file can't be used with multile inputs") - - if options.output_dir: - output_dir = options.output_dir - if not os.path.exists(output_dir): - os.mkdir(output_dir) - elif not os.path.isdir(output_dir): - parser.error("'%s' is not a directory" % output_dir) - output_paths = [ - os.path.join(output_dir, os.path.basename(p)) for p in options.infiles - ] - elif options.output_file: - output_paths = [options.output_file] - else: - # save in-place - output_paths = [None] * len(options.infiles) - - kwargs = dict( - dump_stats=options.verbose > 0, - max_err_em=options.conversion_error, - reverse_direction=options.reverse_direction, - all_quadratic=False if options.mixed else True, - ) - - if options.interpolatable: - logger.info("Converting curves compatibly") - ufos = [open_ufo(infile) for infile in options.infiles] - if fonts_to_quadratic(ufos, **kwargs): - for ufo, output_path in zip(ufos, output_paths): - logger.info("Saving %s", output_path) - if output_path: - ufo.save(output_path) - else: - ufo.save() - else: - for input_path, output_path in zip(options.infiles, output_paths): - if output_path: - _copytree(input_path, output_path) - else: - jobs = min(len(options.infiles), options.jobs) if options.jobs > 1 else 1 - if jobs > 1: - func = partial(_font_to_quadratic, **kwargs) - logger.info("Running %d parallel processes", jobs) - with closing(mp.Pool(jobs)) as pool: - pool.starmap(func, zip(options.infiles, output_paths)) - else: - for input_path, output_path in zip(options.infiles, output_paths): - _font_to_quadratic(input_path, output_path, **kwargs) diff --git a/.venv/Lib/site-packages/fontTools/cu2qu/cu2qu.c b/.venv/Lib/site-packages/fontTools/cu2qu/cu2qu.c deleted file mode 100644 index 31ee805..0000000 --- a/.venv/Lib/site-packages/fontTools/cu2qu/cu2qu.c +++ /dev/null @@ -1,14915 +0,0 @@ -/* Generated by Cython 3.0.10 */ - -/* BEGIN: Cython Metadata -{ - "distutils": { - "define_macros": [ - [ - "CYTHON_TRACE_NOGIL", - "1" - ] - ], - "name": "fontTools.cu2qu.cu2qu", - "sources": [ - "Lib/fontTools/cu2qu/cu2qu.py" - ] - }, - "module_name": "fontTools.cu2qu.cu2qu" -} -END: Cython Metadata */ - -#ifndef PY_SSIZE_T_CLEAN -#define PY_SSIZE_T_CLEAN -#endif /* PY_SSIZE_T_CLEAN */ -#if defined(CYTHON_LIMITED_API) && 0 - #ifndef Py_LIMITED_API - #if CYTHON_LIMITED_API+0 > 0x03030000 - #define Py_LIMITED_API CYTHON_LIMITED_API - #else - #define Py_LIMITED_API 0x03030000 - #endif - #endif -#endif - -#include "Python.h" -#ifndef Py_PYTHON_H - #error Python headers needed to compile C extensions, please install development version of Python. -#elif PY_VERSION_HEX < 0x02070000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) - #error Cython requires Python 2.7+ or Python 3.3+. -#else -#if defined(CYTHON_LIMITED_API) && CYTHON_LIMITED_API -#define __PYX_EXTRA_ABI_MODULE_NAME "limited" -#else -#define __PYX_EXTRA_ABI_MODULE_NAME "" -#endif -#define CYTHON_ABI "3_0_10" __PYX_EXTRA_ABI_MODULE_NAME -#define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI -#define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." -#define CYTHON_HEX_VERSION 0x03000AF0 -#define CYTHON_FUTURE_DIVISION 1 -#include -#ifndef offsetof - #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) -#endif -#if !defined(_WIN32) && !defined(WIN32) && !defined(MS_WINDOWS) - #ifndef __stdcall - #define __stdcall - #endif - #ifndef __cdecl - #define __cdecl - #endif - #ifndef __fastcall - #define __fastcall - #endif -#endif -#ifndef DL_IMPORT - #define DL_IMPORT(t) t -#endif -#ifndef DL_EXPORT - #define DL_EXPORT(t) t -#endif -#define __PYX_COMMA , -#ifndef HAVE_LONG_LONG - #define HAVE_LONG_LONG -#endif -#ifndef PY_LONG_LONG - #define PY_LONG_LONG LONG_LONG -#endif -#ifndef Py_HUGE_VAL - #define Py_HUGE_VAL HUGE_VAL -#endif -#define __PYX_LIMITED_VERSION_HEX PY_VERSION_HEX -#if defined(GRAALVM_PYTHON) - /* For very preliminary testing purposes. Most variables are set the same as PyPy. - The existence of this section does not imply that anything works or is even tested */ - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #define CYTHON_COMPILING_IN_LIMITED_API 0 - #define CYTHON_COMPILING_IN_GRAAL 1 - #define CYTHON_COMPILING_IN_NOGIL 0 - #undef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 0 - #undef CYTHON_USE_TYPE_SPECS - #define CYTHON_USE_TYPE_SPECS 0 - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #if PY_VERSION_HEX < 0x03050000 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #undef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 0 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #undef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 1 - #undef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 0 - #undef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 0 - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_GIL - #define CYTHON_FAST_GIL 0 - #undef CYTHON_METH_FASTCALL - #define CYTHON_METH_FASTCALL 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #ifndef CYTHON_PEP487_INIT_SUBCLASS - #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) - #endif - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 1 - #undef CYTHON_USE_MODULE_STATE - #define CYTHON_USE_MODULE_STATE 0 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 - #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC - #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 - #endif - #undef CYTHON_USE_FREELISTS - #define CYTHON_USE_FREELISTS 0 -#elif defined(PYPY_VERSION) - #define CYTHON_COMPILING_IN_PYPY 1 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #define CYTHON_COMPILING_IN_LIMITED_API 0 - #define CYTHON_COMPILING_IN_GRAAL 0 - #define CYTHON_COMPILING_IN_NOGIL 0 - #undef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 0 - #ifndef CYTHON_USE_TYPE_SPECS - #define CYTHON_USE_TYPE_SPECS 0 - #endif - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #if PY_VERSION_HEX < 0x03050000 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #undef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 0 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #undef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 1 - #undef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 0 - #undef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 0 - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_GIL - #define CYTHON_FAST_GIL 0 - #undef CYTHON_METH_FASTCALL - #define CYTHON_METH_FASTCALL 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #ifndef CYTHON_PEP487_INIT_SUBCLASS - #define CYTHON_PEP487_INIT_SUBCLASS (PY_MAJOR_VERSION >= 3) - #endif - #if PY_VERSION_HEX < 0x03090000 - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) - #define CYTHON_PEP489_MULTI_PHASE_INIT 1 - #endif - #undef CYTHON_USE_MODULE_STATE - #define CYTHON_USE_MODULE_STATE 0 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1 && PYPY_VERSION_NUM >= 0x07030C00) - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 - #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC - #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 - #endif - #undef CYTHON_USE_FREELISTS - #define CYTHON_USE_FREELISTS 0 -#elif defined(CYTHON_LIMITED_API) - #ifdef Py_LIMITED_API - #undef __PYX_LIMITED_VERSION_HEX - #define __PYX_LIMITED_VERSION_HEX Py_LIMITED_API - #endif - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #define CYTHON_COMPILING_IN_LIMITED_API 1 - #define CYTHON_COMPILING_IN_GRAAL 0 - #define CYTHON_COMPILING_IN_NOGIL 0 - #undef CYTHON_CLINE_IN_TRACEBACK - #define CYTHON_CLINE_IN_TRACEBACK 0 - #undef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 0 - #undef CYTHON_USE_TYPE_SPECS - #define CYTHON_USE_TYPE_SPECS 1 - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #undef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 0 - #ifndef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #endif - #undef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #undef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 0 - #undef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 0 - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_GIL - #define CYTHON_FAST_GIL 0 - #undef CYTHON_METH_FASTCALL - #define CYTHON_METH_FASTCALL 0 - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #ifndef CYTHON_PEP487_INIT_SUBCLASS - #define CYTHON_PEP487_INIT_SUBCLASS 1 - #endif - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #undef CYTHON_USE_MODULE_STATE - #define CYTHON_USE_MODULE_STATE 1 - #ifndef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #endif - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 - #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC - #define CYTHON_UPDATE_DESCRIPTOR_DOC 0 - #endif - #undef CYTHON_USE_FREELISTS - #define CYTHON_USE_FREELISTS 0 -#elif defined(Py_GIL_DISABLED) || defined(Py_NOGIL) - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_CPYTHON 0 - #define CYTHON_COMPILING_IN_LIMITED_API 0 - #define CYTHON_COMPILING_IN_GRAAL 0 - #define CYTHON_COMPILING_IN_NOGIL 1 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #ifndef CYTHON_USE_TYPE_SPECS - #define CYTHON_USE_TYPE_SPECS 0 - #endif - #undef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 0 - #ifndef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #ifndef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 0 - #endif - #undef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 0 - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #undef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 0 - #undef CYTHON_FAST_GIL - #define CYTHON_FAST_GIL 0 - #ifndef CYTHON_METH_FASTCALL - #define CYTHON_METH_FASTCALL 1 - #endif - #undef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 0 - #ifndef CYTHON_PEP487_INIT_SUBCLASS - #define CYTHON_PEP487_INIT_SUBCLASS 1 - #endif - #ifndef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 1 - #endif - #ifndef CYTHON_USE_MODULE_STATE - #define CYTHON_USE_MODULE_STATE 0 - #endif - #ifndef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 1 - #endif - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 - #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC - #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 - #endif - #ifndef CYTHON_USE_FREELISTS - #define CYTHON_USE_FREELISTS 0 - #endif -#else - #define CYTHON_COMPILING_IN_PYPY 0 - #define CYTHON_COMPILING_IN_CPYTHON 1 - #define CYTHON_COMPILING_IN_LIMITED_API 0 - #define CYTHON_COMPILING_IN_GRAAL 0 - #define CYTHON_COMPILING_IN_NOGIL 0 - #ifndef CYTHON_USE_TYPE_SLOTS - #define CYTHON_USE_TYPE_SLOTS 1 - #endif - #ifndef CYTHON_USE_TYPE_SPECS - #define CYTHON_USE_TYPE_SPECS 0 - #endif - #ifndef CYTHON_USE_PYTYPE_LOOKUP - #define CYTHON_USE_PYTYPE_LOOKUP 1 - #endif - #if PY_MAJOR_VERSION < 3 - #undef CYTHON_USE_ASYNC_SLOTS - #define CYTHON_USE_ASYNC_SLOTS 0 - #elif !defined(CYTHON_USE_ASYNC_SLOTS) - #define CYTHON_USE_ASYNC_SLOTS 1 - #endif - #ifndef CYTHON_USE_PYLONG_INTERNALS - #define CYTHON_USE_PYLONG_INTERNALS 1 - #endif - #ifndef CYTHON_USE_PYLIST_INTERNALS - #define CYTHON_USE_PYLIST_INTERNALS 1 - #endif - #ifndef CYTHON_USE_UNICODE_INTERNALS - #define CYTHON_USE_UNICODE_INTERNALS 1 - #endif - #if PY_VERSION_HEX < 0x030300F0 || PY_VERSION_HEX >= 0x030B00A2 - #undef CYTHON_USE_UNICODE_WRITER - #define CYTHON_USE_UNICODE_WRITER 0 - #elif !defined(CYTHON_USE_UNICODE_WRITER) - #define CYTHON_USE_UNICODE_WRITER 1 - #endif - #ifndef CYTHON_AVOID_BORROWED_REFS - #define CYTHON_AVOID_BORROWED_REFS 0 - #endif - #ifndef CYTHON_ASSUME_SAFE_MACROS - #define CYTHON_ASSUME_SAFE_MACROS 1 - #endif - #ifndef CYTHON_UNPACK_METHODS - #define CYTHON_UNPACK_METHODS 1 - #endif - #ifndef CYTHON_FAST_THREAD_STATE - #define CYTHON_FAST_THREAD_STATE 1 - #endif - #ifndef CYTHON_FAST_GIL - #define CYTHON_FAST_GIL (PY_MAJOR_VERSION < 3 || PY_VERSION_HEX >= 0x03060000 && PY_VERSION_HEX < 0x030C00A6) - #endif - #ifndef CYTHON_METH_FASTCALL - #define CYTHON_METH_FASTCALL (PY_VERSION_HEX >= 0x030700A1) - #endif - #ifndef CYTHON_FAST_PYCALL - #define CYTHON_FAST_PYCALL 1 - #endif - #ifndef CYTHON_PEP487_INIT_SUBCLASS - #define CYTHON_PEP487_INIT_SUBCLASS 1 - #endif - #if PY_VERSION_HEX < 0x03050000 - #undef CYTHON_PEP489_MULTI_PHASE_INIT - #define CYTHON_PEP489_MULTI_PHASE_INIT 0 - #elif !defined(CYTHON_PEP489_MULTI_PHASE_INIT) - #define CYTHON_PEP489_MULTI_PHASE_INIT 1 - #endif - #ifndef CYTHON_USE_MODULE_STATE - #define CYTHON_USE_MODULE_STATE 0 - #endif - #if PY_VERSION_HEX < 0x030400a1 - #undef CYTHON_USE_TP_FINALIZE - #define CYTHON_USE_TP_FINALIZE 0 - #elif !defined(CYTHON_USE_TP_FINALIZE) - #define CYTHON_USE_TP_FINALIZE 1 - #endif - #if PY_VERSION_HEX < 0x030600B1 - #undef CYTHON_USE_DICT_VERSIONS - #define CYTHON_USE_DICT_VERSIONS 0 - #elif !defined(CYTHON_USE_DICT_VERSIONS) - #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX < 0x030C00A5) - #endif - #if PY_VERSION_HEX < 0x030700A3 - #undef CYTHON_USE_EXC_INFO_STACK - #define CYTHON_USE_EXC_INFO_STACK 0 - #elif !defined(CYTHON_USE_EXC_INFO_STACK) - #define CYTHON_USE_EXC_INFO_STACK 1 - #endif - #ifndef CYTHON_UPDATE_DESCRIPTOR_DOC - #define CYTHON_UPDATE_DESCRIPTOR_DOC 1 - #endif - #ifndef CYTHON_USE_FREELISTS - #define CYTHON_USE_FREELISTS 1 - #endif -#endif -#if !defined(CYTHON_FAST_PYCCALL) -#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) -#endif -#if !defined(CYTHON_VECTORCALL) -#define CYTHON_VECTORCALL (CYTHON_FAST_PYCCALL && PY_VERSION_HEX >= 0x030800B1) -#endif -#define CYTHON_BACKPORT_VECTORCALL (CYTHON_METH_FASTCALL && PY_VERSION_HEX < 0x030800B1) -#if CYTHON_USE_PYLONG_INTERNALS - #if PY_MAJOR_VERSION < 3 - #include "longintrepr.h" - #endif - #undef SHIFT - #undef BASE - #undef MASK - #ifdef SIZEOF_VOID_P - enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; - #endif -#endif -#ifndef __has_attribute - #define __has_attribute(x) 0 -#endif -#ifndef __has_cpp_attribute - #define __has_cpp_attribute(x) 0 -#endif -#ifndef CYTHON_RESTRICT - #if defined(__GNUC__) - #define CYTHON_RESTRICT __restrict__ - #elif defined(_MSC_VER) && _MSC_VER >= 1400 - #define CYTHON_RESTRICT __restrict - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_RESTRICT restrict - #else - #define CYTHON_RESTRICT - #endif -#endif -#ifndef CYTHON_UNUSED - #if defined(__cplusplus) - /* for clang __has_cpp_attribute(maybe_unused) is true even before C++17 - * but leads to warnings with -pedantic, since it is a C++17 feature */ - #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) - #if __has_cpp_attribute(maybe_unused) - #define CYTHON_UNUSED [[maybe_unused]] - #endif - #endif - #endif -#endif -#ifndef CYTHON_UNUSED -# if defined(__GNUC__) -# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) -# define CYTHON_UNUSED __attribute__ ((__unused__)) -# else -# define CYTHON_UNUSED -# endif -#endif -#ifndef CYTHON_UNUSED_VAR -# if defined(__cplusplus) - template void CYTHON_UNUSED_VAR( const T& ) { } -# else -# define CYTHON_UNUSED_VAR(x) (void)(x) -# endif -#endif -#ifndef CYTHON_MAYBE_UNUSED_VAR - #define CYTHON_MAYBE_UNUSED_VAR(x) CYTHON_UNUSED_VAR(x) -#endif -#ifndef CYTHON_NCP_UNUSED -# if CYTHON_COMPILING_IN_CPYTHON -# define CYTHON_NCP_UNUSED -# else -# define CYTHON_NCP_UNUSED CYTHON_UNUSED -# endif -#endif -#ifndef CYTHON_USE_CPP_STD_MOVE - #if defined(__cplusplus) && (\ - __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1600)) - #define CYTHON_USE_CPP_STD_MOVE 1 - #else - #define CYTHON_USE_CPP_STD_MOVE 0 - #endif -#endif -#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) -#ifdef _MSC_VER - #ifndef _MSC_STDINT_H_ - #if _MSC_VER < 1300 - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; - typedef unsigned int uint32_t; - #else - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; - #endif - #endif - #if _MSC_VER < 1300 - #ifdef _WIN64 - typedef unsigned long long __pyx_uintptr_t; - #else - typedef unsigned int __pyx_uintptr_t; - #endif - #else - #ifdef _WIN64 - typedef unsigned __int64 __pyx_uintptr_t; - #else - typedef unsigned __int32 __pyx_uintptr_t; - #endif - #endif -#else - #include - typedef uintptr_t __pyx_uintptr_t; -#endif -#ifndef CYTHON_FALLTHROUGH - #if defined(__cplusplus) - /* for clang __has_cpp_attribute(fallthrough) is true even before C++17 - * but leads to warnings with -pedantic, since it is a C++17 feature */ - #if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L) - #if __has_cpp_attribute(fallthrough) - #define CYTHON_FALLTHROUGH [[fallthrough]] - #endif - #endif - #ifndef CYTHON_FALLTHROUGH - #if __has_cpp_attribute(clang::fallthrough) - #define CYTHON_FALLTHROUGH [[clang::fallthrough]] - #elif __has_cpp_attribute(gnu::fallthrough) - #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] - #endif - #endif - #endif - #ifndef CYTHON_FALLTHROUGH - #if __has_attribute(fallthrough) - #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) - #else - #define CYTHON_FALLTHROUGH - #endif - #endif - #if defined(__clang__) && defined(__apple_build_version__) - #if __apple_build_version__ < 7000000 - #undef CYTHON_FALLTHROUGH - #define CYTHON_FALLTHROUGH - #endif - #endif -#endif -#ifdef __cplusplus - template - struct __PYX_IS_UNSIGNED_IMPL {static const bool value = T(0) < T(-1);}; - #define __PYX_IS_UNSIGNED(type) (__PYX_IS_UNSIGNED_IMPL::value) -#else - #define __PYX_IS_UNSIGNED(type) (((type)-1) > 0) -#endif -#if CYTHON_COMPILING_IN_PYPY == 1 - #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x030A0000) -#else - #define __PYX_NEED_TP_PRINT_SLOT (PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000) -#endif -#define __PYX_REINTERPRET_FUNCION(func_pointer, other_pointer) ((func_pointer)(void(*)(void))(other_pointer)) - -#ifndef CYTHON_INLINE - #if defined(__clang__) - #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) - #elif defined(__GNUC__) - #define CYTHON_INLINE __inline__ - #elif defined(_MSC_VER) - #define CYTHON_INLINE __inline - #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define CYTHON_INLINE inline - #else - #define CYTHON_INLINE - #endif -#endif - -#define __PYX_BUILD_PY_SSIZE_T "n" -#define CYTHON_FORMAT_SSIZE_T "z" -#if PY_MAJOR_VERSION < 3 - #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" - #define __Pyx_DefaultClassType PyClass_Type - #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) -#else - #define __Pyx_BUILTIN_MODULE_NAME "builtins" - #define __Pyx_DefaultClassType PyType_Type -#if CYTHON_COMPILING_IN_LIMITED_API - static CYTHON_INLINE PyObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, - PyObject *code, PyObject *c, PyObject* n, PyObject *v, - PyObject *fv, PyObject *cell, PyObject* fn, - PyObject *name, int fline, PyObject *lnos) { - PyObject *exception_table = NULL; - PyObject *types_module=NULL, *code_type=NULL, *result=NULL; - #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 - PyObject *version_info; - PyObject *py_minor_version = NULL; - #endif - long minor_version = 0; - PyObject *type, *value, *traceback; - PyErr_Fetch(&type, &value, &traceback); - #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 - minor_version = 11; - #else - if (!(version_info = PySys_GetObject("version_info"))) goto end; - if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; - minor_version = PyLong_AsLong(py_minor_version); - Py_DECREF(py_minor_version); - if (minor_version == -1 && PyErr_Occurred()) goto end; - #endif - if (!(types_module = PyImport_ImportModule("types"))) goto end; - if (!(code_type = PyObject_GetAttrString(types_module, "CodeType"))) goto end; - if (minor_version <= 7) { - (void)p; - result = PyObject_CallFunction(code_type, "iiiiiOOOOOOiOO", a, k, l, s, f, code, - c, n, v, fn, name, fline, lnos, fv, cell); - } else if (minor_version <= 10) { - result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOiOO", a,p, k, l, s, f, code, - c, n, v, fn, name, fline, lnos, fv, cell); - } else { - if (!(exception_table = PyBytes_FromStringAndSize(NULL, 0))) goto end; - result = PyObject_CallFunction(code_type, "iiiiiiOOOOOOOiOO", a,p, k, l, s, f, code, - c, n, v, fn, name, name, fline, lnos, exception_table, fv, cell); - } - end: - Py_XDECREF(code_type); - Py_XDECREF(exception_table); - Py_XDECREF(types_module); - if (type) { - PyErr_Restore(type, value, traceback); - } - return result; - } - #ifndef CO_OPTIMIZED - #define CO_OPTIMIZED 0x0001 - #endif - #ifndef CO_NEWLOCALS - #define CO_NEWLOCALS 0x0002 - #endif - #ifndef CO_VARARGS - #define CO_VARARGS 0x0004 - #endif - #ifndef CO_VARKEYWORDS - #define CO_VARKEYWORDS 0x0008 - #endif - #ifndef CO_ASYNC_GENERATOR - #define CO_ASYNC_GENERATOR 0x0200 - #endif - #ifndef CO_GENERATOR - #define CO_GENERATOR 0x0020 - #endif - #ifndef CO_COROUTINE - #define CO_COROUTINE 0x0080 - #endif -#elif PY_VERSION_HEX >= 0x030B0000 - static CYTHON_INLINE PyCodeObject* __Pyx_PyCode_New(int a, int p, int k, int l, int s, int f, - PyObject *code, PyObject *c, PyObject* n, PyObject *v, - PyObject *fv, PyObject *cell, PyObject* fn, - PyObject *name, int fline, PyObject *lnos) { - PyCodeObject *result; - PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); - if (!empty_bytes) return NULL; - result = - #if PY_VERSION_HEX >= 0x030C0000 - PyUnstable_Code_NewWithPosOnlyArgs - #else - PyCode_NewWithPosOnlyArgs - #endif - (a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, name, fline, lnos, empty_bytes); - Py_DECREF(empty_bytes); - return result; - } -#elif PY_VERSION_HEX >= 0x030800B2 && !CYTHON_COMPILING_IN_PYPY - #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_NewWithPosOnlyArgs(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) -#else - #define __Pyx_PyCode_New(a, p, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ - PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) -#endif -#endif -#if PY_VERSION_HEX >= 0x030900A4 || defined(Py_IS_TYPE) - #define __Pyx_IS_TYPE(ob, type) Py_IS_TYPE(ob, type) -#else - #define __Pyx_IS_TYPE(ob, type) (((const PyObject*)ob)->ob_type == (type)) -#endif -#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_Is) - #define __Pyx_Py_Is(x, y) Py_Is(x, y) -#else - #define __Pyx_Py_Is(x, y) ((x) == (y)) -#endif -#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsNone) - #define __Pyx_Py_IsNone(ob) Py_IsNone(ob) -#else - #define __Pyx_Py_IsNone(ob) __Pyx_Py_Is((ob), Py_None) -#endif -#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsTrue) - #define __Pyx_Py_IsTrue(ob) Py_IsTrue(ob) -#else - #define __Pyx_Py_IsTrue(ob) __Pyx_Py_Is((ob), Py_True) -#endif -#if PY_VERSION_HEX >= 0x030A00B1 || defined(Py_IsFalse) - #define __Pyx_Py_IsFalse(ob) Py_IsFalse(ob) -#else - #define __Pyx_Py_IsFalse(ob) __Pyx_Py_Is((ob), Py_False) -#endif -#define __Pyx_NoneAsNull(obj) (__Pyx_Py_IsNone(obj) ? NULL : (obj)) -#if PY_VERSION_HEX >= 0x030900F0 && !CYTHON_COMPILING_IN_PYPY - #define __Pyx_PyObject_GC_IsFinalized(o) PyObject_GC_IsFinalized(o) -#else - #define __Pyx_PyObject_GC_IsFinalized(o) _PyGC_FINALIZED(o) -#endif -#ifndef CO_COROUTINE - #define CO_COROUTINE 0x80 -#endif -#ifndef CO_ASYNC_GENERATOR - #define CO_ASYNC_GENERATOR 0x200 -#endif -#ifndef Py_TPFLAGS_CHECKTYPES - #define Py_TPFLAGS_CHECKTYPES 0 -#endif -#ifndef Py_TPFLAGS_HAVE_INDEX - #define Py_TPFLAGS_HAVE_INDEX 0 -#endif -#ifndef Py_TPFLAGS_HAVE_NEWBUFFER - #define Py_TPFLAGS_HAVE_NEWBUFFER 0 -#endif -#ifndef Py_TPFLAGS_HAVE_FINALIZE - #define Py_TPFLAGS_HAVE_FINALIZE 0 -#endif -#ifndef Py_TPFLAGS_SEQUENCE - #define Py_TPFLAGS_SEQUENCE 0 -#endif -#ifndef Py_TPFLAGS_MAPPING - #define Py_TPFLAGS_MAPPING 0 -#endif -#ifndef METH_STACKLESS - #define METH_STACKLESS 0 -#endif -#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) - #ifndef METH_FASTCALL - #define METH_FASTCALL 0x80 - #endif - typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); - typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, - Py_ssize_t nargs, PyObject *kwnames); -#else - #if PY_VERSION_HEX >= 0x030d00A4 - # define __Pyx_PyCFunctionFast PyCFunctionFast - # define __Pyx_PyCFunctionFastWithKeywords PyCFunctionFastWithKeywords - #else - # define __Pyx_PyCFunctionFast _PyCFunctionFast - # define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords - #endif -#endif -#if CYTHON_METH_FASTCALL - #define __Pyx_METH_FASTCALL METH_FASTCALL - #define __Pyx_PyCFunction_FastCall __Pyx_PyCFunctionFast - #define __Pyx_PyCFunction_FastCallWithKeywords __Pyx_PyCFunctionFastWithKeywords -#else - #define __Pyx_METH_FASTCALL METH_VARARGS - #define __Pyx_PyCFunction_FastCall PyCFunction - #define __Pyx_PyCFunction_FastCallWithKeywords PyCFunctionWithKeywords -#endif -#if CYTHON_VECTORCALL - #define __pyx_vectorcallfunc vectorcallfunc - #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET PY_VECTORCALL_ARGUMENTS_OFFSET - #define __Pyx_PyVectorcall_NARGS(n) PyVectorcall_NARGS((size_t)(n)) -#elif CYTHON_BACKPORT_VECTORCALL - typedef PyObject *(*__pyx_vectorcallfunc)(PyObject *callable, PyObject *const *args, - size_t nargsf, PyObject *kwnames); - #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET ((size_t)1 << (8 * sizeof(size_t) - 1)) - #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(((size_t)(n)) & ~__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET)) -#else - #define __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET 0 - #define __Pyx_PyVectorcall_NARGS(n) ((Py_ssize_t)(n)) -#endif -#if PY_MAJOR_VERSION >= 0x030900B1 -#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_CheckExact(func) -#else -#define __Pyx_PyCFunction_CheckExact(func) PyCFunction_Check(func) -#endif -#define __Pyx_CyOrPyCFunction_Check(func) PyCFunction_Check(func) -#if CYTHON_COMPILING_IN_CPYTHON -#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) (((PyCFunctionObject*)(func))->m_ml->ml_meth) -#elif !CYTHON_COMPILING_IN_LIMITED_API -#define __Pyx_CyOrPyCFunction_GET_FUNCTION(func) PyCFunction_GET_FUNCTION(func) -#endif -#if CYTHON_COMPILING_IN_CPYTHON -#define __Pyx_CyOrPyCFunction_GET_FLAGS(func) (((PyCFunctionObject*)(func))->m_ml->ml_flags) -static CYTHON_INLINE PyObject* __Pyx_CyOrPyCFunction_GET_SELF(PyObject *func) { - return (__Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_STATIC) ? NULL : ((PyCFunctionObject*)func)->m_self; -} -#endif -static CYTHON_INLINE int __Pyx__IsSameCFunction(PyObject *func, void *cfunc) { -#if CYTHON_COMPILING_IN_LIMITED_API - return PyCFunction_Check(func) && PyCFunction_GetFunction(func) == (PyCFunction) cfunc; -#else - return PyCFunction_Check(func) && PyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; -#endif -} -#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCFunction(func, cfunc) -#if __PYX_LIMITED_VERSION_HEX < 0x030900B1 - #define __Pyx_PyType_FromModuleAndSpec(m, s, b) ((void)m, PyType_FromSpecWithBases(s, b)) - typedef PyObject *(*__Pyx_PyCMethod)(PyObject *, PyTypeObject *, PyObject *const *, size_t, PyObject *); -#else - #define __Pyx_PyType_FromModuleAndSpec(m, s, b) PyType_FromModuleAndSpec(m, s, b) - #define __Pyx_PyCMethod PyCMethod -#endif -#ifndef METH_METHOD - #define METH_METHOD 0x200 -#endif -#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) - #define PyObject_Malloc(s) PyMem_Malloc(s) - #define PyObject_Free(p) PyMem_Free(p) - #define PyObject_Realloc(p) PyMem_Realloc(p) -#endif -#if CYTHON_COMPILING_IN_LIMITED_API - #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) -#else - #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) - #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) -#endif -#if CYTHON_COMPILING_IN_LIMITED_API - #define __Pyx_PyThreadState_Current PyThreadState_Get() -#elif !CYTHON_FAST_THREAD_STATE - #define __Pyx_PyThreadState_Current PyThreadState_GET() -#elif PY_VERSION_HEX >= 0x030d00A1 - #define __Pyx_PyThreadState_Current PyThreadState_GetUnchecked() -#elif PY_VERSION_HEX >= 0x03060000 - #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() -#elif PY_VERSION_HEX >= 0x03000000 - #define __Pyx_PyThreadState_Current PyThreadState_GET() -#else - #define __Pyx_PyThreadState_Current _PyThreadState_Current -#endif -#if CYTHON_COMPILING_IN_LIMITED_API -static CYTHON_INLINE void *__Pyx_PyModule_GetState(PyObject *op) -{ - void *result; - result = PyModule_GetState(op); - if (!result) - Py_FatalError("Couldn't find the module state"); - return result; -} -#endif -#define __Pyx_PyObject_GetSlot(obj, name, func_ctype) __Pyx_PyType_GetSlot(Py_TYPE(obj), name, func_ctype) -#if CYTHON_COMPILING_IN_LIMITED_API - #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((func_ctype) PyType_GetSlot((type), Py_##name)) -#else - #define __Pyx_PyType_GetSlot(type, name, func_ctype) ((type)->name) -#endif -#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) -#include "pythread.h" -#define Py_tss_NEEDS_INIT 0 -typedef int Py_tss_t; -static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { - *key = PyThread_create_key(); - return 0; -} -static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { - Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); - *key = Py_tss_NEEDS_INIT; - return key; -} -static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { - PyObject_Free(key); -} -static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { - return *key != Py_tss_NEEDS_INIT; -} -static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { - PyThread_delete_key(*key); - *key = Py_tss_NEEDS_INIT; -} -static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { - return PyThread_set_key_value(*key, value); -} -static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { - return PyThread_get_key_value(*key); -} -#endif -#if PY_MAJOR_VERSION < 3 - #if CYTHON_COMPILING_IN_PYPY - #if PYPY_VERSION_NUM < 0x07030600 - #if defined(__cplusplus) && __cplusplus >= 201402L - [[deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")]] - #elif defined(__GNUC__) || defined(__clang__) - __attribute__ ((__deprecated__("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6"))) - #elif defined(_MSC_VER) - __declspec(deprecated("`with nogil:` inside a nogil function will not release the GIL in PyPy2 < 7.3.6")) - #endif - static CYTHON_INLINE int PyGILState_Check(void) { - return 0; - } - #else // PYPY_VERSION_NUM < 0x07030600 - #endif // PYPY_VERSION_NUM < 0x07030600 - #else - static CYTHON_INLINE int PyGILState_Check(void) { - PyThreadState * tstate = _PyThreadState_Current; - return tstate && (tstate == PyGILState_GetThisThreadState()); - } - #endif -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 || defined(_PyDict_NewPresized) -#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) -#else -#define __Pyx_PyDict_NewPresized(n) PyDict_New() -#endif -#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION - #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) -#else - #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) - #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX > 0x030600B4 && PY_VERSION_HEX < 0x030d0000 && CYTHON_USE_UNICODE_INTERNALS -#define __Pyx_PyDict_GetItemStrWithError(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) -static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStr(PyObject *dict, PyObject *name) { - PyObject *res = __Pyx_PyDict_GetItemStrWithError(dict, name); - if (res == NULL) PyErr_Clear(); - return res; -} -#elif PY_MAJOR_VERSION >= 3 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07020000) -#define __Pyx_PyDict_GetItemStrWithError PyDict_GetItemWithError -#define __Pyx_PyDict_GetItemStr PyDict_GetItem -#else -static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, PyObject *name) { -#if CYTHON_COMPILING_IN_PYPY - return PyDict_GetItem(dict, name); -#else - PyDictEntry *ep; - PyDictObject *mp = (PyDictObject*) dict; - long hash = ((PyStringObject *) name)->ob_shash; - assert(hash != -1); - ep = (mp->ma_lookup)(mp, name, hash); - if (ep == NULL) { - return NULL; - } - return ep->me_value; -#endif -} -#define __Pyx_PyDict_GetItemStr PyDict_GetItem -#endif -#if CYTHON_USE_TYPE_SLOTS - #define __Pyx_PyType_GetFlags(tp) (((PyTypeObject *)tp)->tp_flags) - #define __Pyx_PyType_HasFeature(type, feature) ((__Pyx_PyType_GetFlags(type) & (feature)) != 0) - #define __Pyx_PyObject_GetIterNextFunc(obj) (Py_TYPE(obj)->tp_iternext) -#else - #define __Pyx_PyType_GetFlags(tp) (PyType_GetFlags((PyTypeObject *)tp)) - #define __Pyx_PyType_HasFeature(type, feature) PyType_HasFeature(type, feature) - #define __Pyx_PyObject_GetIterNextFunc(obj) PyIter_Next -#endif -#if CYTHON_COMPILING_IN_LIMITED_API - #define __Pyx_SetItemOnTypeDict(tp, k, v) PyObject_GenericSetAttr((PyObject*)tp, k, v) -#else - #define __Pyx_SetItemOnTypeDict(tp, k, v) PyDict_SetItem(tp->tp_dict, k, v) -#endif -#if CYTHON_USE_TYPE_SPECS && PY_VERSION_HEX >= 0x03080000 -#define __Pyx_PyHeapTypeObject_GC_Del(obj) {\ - PyTypeObject *type = Py_TYPE((PyObject*)obj);\ - assert(__Pyx_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE));\ - PyObject_GC_Del(obj);\ - Py_DECREF(type);\ -} -#else -#define __Pyx_PyHeapTypeObject_GC_Del(obj) PyObject_GC_Del(obj) -#endif -#if CYTHON_COMPILING_IN_LIMITED_API - #define CYTHON_PEP393_ENABLED 1 - #define __Pyx_PyUnicode_READY(op) (0) - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GetLength(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_ReadChar(u, i) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((void)u, 1114111U) - #define __Pyx_PyUnicode_KIND(u) ((void)u, (0)) - #define __Pyx_PyUnicode_DATA(u) ((void*)u) - #define __Pyx_PyUnicode_READ(k, d, i) ((void)k, PyUnicode_ReadChar((PyObject*)(d), i)) - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GetLength(u)) -#elif PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) - #define CYTHON_PEP393_ENABLED 1 - #if PY_VERSION_HEX >= 0x030C0000 - #define __Pyx_PyUnicode_READY(op) (0) - #else - #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ - 0 : _PyUnicode_Ready((PyObject *)(op))) - #endif - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) - #define __Pyx_PyUnicode_KIND(u) ((int)PyUnicode_KIND(u)) - #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) - #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, (Py_UCS4) ch) - #if PY_VERSION_HEX >= 0x030C0000 - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) - #else - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) - #else - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) - #endif - #endif -#else - #define CYTHON_PEP393_ENABLED 0 - #define PyUnicode_1BYTE_KIND 1 - #define PyUnicode_2BYTE_KIND 2 - #define PyUnicode_4BYTE_KIND 4 - #define __Pyx_PyUnicode_READY(op) (0) - #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) - #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) - #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535U : 1114111U) - #define __Pyx_PyUnicode_KIND(u) ((int)sizeof(Py_UNICODE)) - #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) - #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) - #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = (Py_UNICODE) ch) - #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) -#endif -#if CYTHON_COMPILING_IN_PYPY - #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) -#else - #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) - #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ - PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) -#endif -#if CYTHON_COMPILING_IN_PYPY - #if !defined(PyUnicode_DecodeUnicodeEscape) - #define PyUnicode_DecodeUnicodeEscape(s, size, errors) PyUnicode_Decode(s, size, "unicode_escape", errors) - #endif - #if !defined(PyUnicode_Contains) || (PY_MAJOR_VERSION == 2 && PYPY_VERSION_NUM < 0x07030500) - #undef PyUnicode_Contains - #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) - #endif - #if !defined(PyByteArray_Check) - #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) - #endif - #if !defined(PyObject_Format) - #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) - #endif -#endif -#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) -#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) -#else - #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) -#endif -#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) - #define PyObject_ASCII(o) PyObject_Repr(o) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBaseString_Type PyUnicode_Type - #define PyStringObject PyUnicodeObject - #define PyString_Type PyUnicode_Type - #define PyString_Check PyUnicode_Check - #define PyString_CheckExact PyUnicode_CheckExact -#ifndef PyObject_Unicode - #define PyObject_Unicode PyObject_Str -#endif -#endif -#if PY_MAJOR_VERSION >= 3 - #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) - #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) -#else - #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) - #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) -#endif -#if CYTHON_COMPILING_IN_CPYTHON - #define __Pyx_PySequence_ListKeepNew(obj)\ - (likely(PyList_CheckExact(obj) && Py_REFCNT(obj) == 1) ? __Pyx_NewRef(obj) : PySequence_List(obj)) -#else - #define __Pyx_PySequence_ListKeepNew(obj) PySequence_List(obj) -#endif -#ifndef PySet_CheckExact - #define PySet_CheckExact(obj) __Pyx_IS_TYPE(obj, &PySet_Type) -#endif -#if PY_VERSION_HEX >= 0x030900A4 - #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) - #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) -#else - #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) - #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) -#endif -#if CYTHON_ASSUME_SAFE_MACROS - #define __Pyx_PySequence_ITEM(o, i) PySequence_ITEM(o, i) - #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) - #define __Pyx_PyTuple_SET_ITEM(o, i, v) (PyTuple_SET_ITEM(o, i, v), (0)) - #define __Pyx_PyList_SET_ITEM(o, i, v) (PyList_SET_ITEM(o, i, v), (0)) - #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_GET_SIZE(o) - #define __Pyx_PyList_GET_SIZE(o) PyList_GET_SIZE(o) - #define __Pyx_PySet_GET_SIZE(o) PySet_GET_SIZE(o) - #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_GET_SIZE(o) - #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_GET_SIZE(o) -#else - #define __Pyx_PySequence_ITEM(o, i) PySequence_GetItem(o, i) - #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) - #define __Pyx_PyTuple_SET_ITEM(o, i, v) PyTuple_SetItem(o, i, v) - #define __Pyx_PyList_SET_ITEM(o, i, v) PyList_SetItem(o, i, v) - #define __Pyx_PyTuple_GET_SIZE(o) PyTuple_Size(o) - #define __Pyx_PyList_GET_SIZE(o) PyList_Size(o) - #define __Pyx_PySet_GET_SIZE(o) PySet_Size(o) - #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) - #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) -#endif -#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 - #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) -#else - static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { - PyObject *module = PyImport_AddModule(name); - Py_XINCREF(module); - return module; - } -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyIntObject PyLongObject - #define PyInt_Type PyLong_Type - #define PyInt_Check(op) PyLong_Check(op) - #define PyInt_CheckExact(op) PyLong_CheckExact(op) - #define __Pyx_Py3Int_Check(op) PyLong_Check(op) - #define __Pyx_Py3Int_CheckExact(op) PyLong_CheckExact(op) - #define PyInt_FromString PyLong_FromString - #define PyInt_FromUnicode PyLong_FromUnicode - #define PyInt_FromLong PyLong_FromLong - #define PyInt_FromSize_t PyLong_FromSize_t - #define PyInt_FromSsize_t PyLong_FromSsize_t - #define PyInt_AsLong PyLong_AsLong - #define PyInt_AS_LONG PyLong_AS_LONG - #define PyInt_AsSsize_t PyLong_AsSsize_t - #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask - #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask - #define PyNumber_Int PyNumber_Long -#else - #define __Pyx_Py3Int_Check(op) (PyLong_Check(op) || PyInt_Check(op)) - #define __Pyx_Py3Int_CheckExact(op) (PyLong_CheckExact(op) || PyInt_CheckExact(op)) -#endif -#if PY_MAJOR_VERSION >= 3 - #define PyBoolObject PyLongObject -#endif -#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY - #ifndef PyUnicode_InternFromString - #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) - #endif -#endif -#if PY_VERSION_HEX < 0x030200A4 - typedef long Py_hash_t; - #define __Pyx_PyInt_FromHash_t PyInt_FromLong - #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsHash_t -#else - #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t - #define __Pyx_PyInt_AsHash_t __Pyx_PyIndex_AsSsize_t -#endif -#if CYTHON_USE_ASYNC_SLOTS - #if PY_VERSION_HEX >= 0x030500B1 - #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods - #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) - #else - #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) - #endif -#else - #define __Pyx_PyType_AsAsync(obj) NULL -#endif -#ifndef __Pyx_PyAsyncMethodsStruct - typedef struct { - unaryfunc am_await; - unaryfunc am_aiter; - unaryfunc am_anext; - } __Pyx_PyAsyncMethodsStruct; -#endif - -#if defined(_WIN32) || defined(WIN32) || defined(MS_WINDOWS) - #if !defined(_USE_MATH_DEFINES) - #define _USE_MATH_DEFINES - #endif -#endif -#include -#ifdef NAN -#define __PYX_NAN() ((float) NAN) -#else -static CYTHON_INLINE float __PYX_NAN() { - float value; - memset(&value, 0xFF, sizeof(value)); - return value; -} -#endif -#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) -#define __Pyx_truncl trunc -#else -#define __Pyx_truncl truncl -#endif - -#define __PYX_MARK_ERR_POS(f_index, lineno) \ - { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } -#define __PYX_ERR(f_index, lineno, Ln_error) \ - { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } - -#ifdef CYTHON_EXTERN_C - #undef __PYX_EXTERN_C - #define __PYX_EXTERN_C CYTHON_EXTERN_C -#elif defined(__PYX_EXTERN_C) - #ifdef _MSC_VER - #pragma message ("Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead.") - #else - #warning Please do not define the '__PYX_EXTERN_C' macro externally. Use 'CYTHON_EXTERN_C' instead. - #endif -#else - #ifdef __cplusplus - #define __PYX_EXTERN_C extern "C" - #else - #define __PYX_EXTERN_C extern - #endif -#endif - -#define __PYX_HAVE__fontTools__cu2qu__cu2qu -#define __PYX_HAVE_API__fontTools__cu2qu__cu2qu -/* Early includes */ -#ifdef _OPENMP -#include -#endif /* _OPENMP */ - -#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) -#define CYTHON_WITHOUT_ASSERTIONS -#endif - -typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; - const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; - -#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 -#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 -#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) -#define __PYX_DEFAULT_STRING_ENCODING "" -#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString -#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#define __Pyx_uchar_cast(c) ((unsigned char)c) -#define __Pyx_long_cast(x) ((long)x) -#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ - (sizeof(type) < sizeof(Py_ssize_t)) ||\ - (sizeof(type) > sizeof(Py_ssize_t) &&\ - likely(v < (type)PY_SSIZE_T_MAX ||\ - v == (type)PY_SSIZE_T_MAX) &&\ - (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ - v == (type)PY_SSIZE_T_MIN))) ||\ - (sizeof(type) == sizeof(Py_ssize_t) &&\ - (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ - v == (type)PY_SSIZE_T_MAX))) ) -static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { - return (size_t) i < (size_t) limit; -} -#if defined (__cplusplus) && __cplusplus >= 201103L - #include - #define __Pyx_sst_abs(value) std::abs(value) -#elif SIZEOF_INT >= SIZEOF_SIZE_T - #define __Pyx_sst_abs(value) abs(value) -#elif SIZEOF_LONG >= SIZEOF_SIZE_T - #define __Pyx_sst_abs(value) labs(value) -#elif defined (_MSC_VER) - #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) -#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L - #define __Pyx_sst_abs(value) llabs(value) -#elif defined (__GNUC__) - #define __Pyx_sst_abs(value) __builtin_llabs(value) -#else - #define __Pyx_sst_abs(value) ((value<0) ? -value : value) -#endif -static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s); -static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); -static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); -static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char*); -#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) -#define __Pyx_PyBytes_FromString PyBytes_FromString -#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); -#if PY_MAJOR_VERSION < 3 - #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize -#else - #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString - #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize -#endif -#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) -#define __Pyx_PyObject_AsWritableString(s) ((char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsWritableSString(s) ((signed char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*)(__pyx_uintptr_t) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) -#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) -#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) -#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) -#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) -#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) -#define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) -#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode -#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) -#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) -static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); -static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); -#define __Pyx_PySequence_Tuple(obj)\ - (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); -static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); -#if CYTHON_ASSUME_SAFE_MACROS -#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) -#else -#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) -#endif -#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) -#if PY_MAJOR_VERSION >= 3 -#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) -#else -#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) -#endif -#if CYTHON_USE_PYLONG_INTERNALS - #if PY_VERSION_HEX >= 0x030C00A7 - #ifndef _PyLong_SIGN_MASK - #define _PyLong_SIGN_MASK 3 - #endif - #ifndef _PyLong_NON_SIZE_BITS - #define _PyLong_NON_SIZE_BITS 3 - #endif - #define __Pyx_PyLong_Sign(x) (((PyLongObject*)x)->long_value.lv_tag & _PyLong_SIGN_MASK) - #define __Pyx_PyLong_IsNeg(x) ((__Pyx_PyLong_Sign(x) & 2) != 0) - #define __Pyx_PyLong_IsNonNeg(x) (!__Pyx_PyLong_IsNeg(x)) - #define __Pyx_PyLong_IsZero(x) (__Pyx_PyLong_Sign(x) & 1) - #define __Pyx_PyLong_IsPos(x) (__Pyx_PyLong_Sign(x) == 0) - #define __Pyx_PyLong_CompactValueUnsigned(x) (__Pyx_PyLong_Digits(x)[0]) - #define __Pyx_PyLong_DigitCount(x) ((Py_ssize_t) (((PyLongObject*)x)->long_value.lv_tag >> _PyLong_NON_SIZE_BITS)) - #define __Pyx_PyLong_SignedDigitCount(x)\ - ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * __Pyx_PyLong_DigitCount(x)) - #if defined(PyUnstable_Long_IsCompact) && defined(PyUnstable_Long_CompactValue) - #define __Pyx_PyLong_IsCompact(x) PyUnstable_Long_IsCompact((PyLongObject*) x) - #define __Pyx_PyLong_CompactValue(x) PyUnstable_Long_CompactValue((PyLongObject*) x) - #else - #define __Pyx_PyLong_IsCompact(x) (((PyLongObject*)x)->long_value.lv_tag < (2 << _PyLong_NON_SIZE_BITS)) - #define __Pyx_PyLong_CompactValue(x) ((1 - (Py_ssize_t) __Pyx_PyLong_Sign(x)) * (Py_ssize_t) __Pyx_PyLong_Digits(x)[0]) - #endif - typedef Py_ssize_t __Pyx_compact_pylong; - typedef size_t __Pyx_compact_upylong; - #else - #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) - #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) - #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) - #define __Pyx_PyLong_IsPos(x) (Py_SIZE(x) > 0) - #define __Pyx_PyLong_CompactValueUnsigned(x) ((Py_SIZE(x) == 0) ? 0 : __Pyx_PyLong_Digits(x)[0]) - #define __Pyx_PyLong_DigitCount(x) __Pyx_sst_abs(Py_SIZE(x)) - #define __Pyx_PyLong_SignedDigitCount(x) Py_SIZE(x) - #define __Pyx_PyLong_IsCompact(x) (Py_SIZE(x) == 0 || Py_SIZE(x) == 1 || Py_SIZE(x) == -1) - #define __Pyx_PyLong_CompactValue(x)\ - ((Py_SIZE(x) == 0) ? (sdigit) 0 : ((Py_SIZE(x) < 0) ? -(sdigit)__Pyx_PyLong_Digits(x)[0] : (sdigit)__Pyx_PyLong_Digits(x)[0])) - typedef sdigit __Pyx_compact_pylong; - typedef digit __Pyx_compact_upylong; - #endif - #if PY_VERSION_HEX >= 0x030C00A5 - #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->long_value.ob_digit) - #else - #define __Pyx_PyLong_Digits(x) (((PyLongObject*)x)->ob_digit) - #endif -#endif -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII -#include -static int __Pyx_sys_getdefaultencoding_not_ascii; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - PyObject* ascii_chars_u = NULL; - PyObject* ascii_chars_b = NULL; - const char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - if (strcmp(default_encoding_c, "ascii") == 0) { - __Pyx_sys_getdefaultencoding_not_ascii = 0; - } else { - char ascii_chars[128]; - int c; - for (c = 0; c < 128; c++) { - ascii_chars[c] = (char) c; - } - __Pyx_sys_getdefaultencoding_not_ascii = 1; - ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); - if (!ascii_chars_u) goto bad; - ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); - if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { - PyErr_Format( - PyExc_ValueError, - "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", - default_encoding_c); - goto bad; - } - Py_DECREF(ascii_chars_u); - Py_DECREF(ascii_chars_b); - } - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - Py_XDECREF(ascii_chars_u); - Py_XDECREF(ascii_chars_b); - return -1; -} -#endif -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) -#else -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) -#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -#include -static char* __PYX_DEFAULT_STRING_ENCODING; -static int __Pyx_init_sys_getdefaultencoding_params(void) { - PyObject* sys; - PyObject* default_encoding = NULL; - char* default_encoding_c; - sys = PyImport_ImportModule("sys"); - if (!sys) goto bad; - default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); - Py_DECREF(sys); - if (!default_encoding) goto bad; - default_encoding_c = PyBytes_AsString(default_encoding); - if (!default_encoding_c) goto bad; - __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); - if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; - strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); - Py_DECREF(default_encoding); - return 0; -bad: - Py_XDECREF(default_encoding); - return -1; -} -#endif -#endif - - -/* Test for GCC > 2.95 */ -#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) - #define likely(x) __builtin_expect(!!(x), 1) - #define unlikely(x) __builtin_expect(!!(x), 0) -#else /* !__GNUC__ or GCC < 2.95 */ - #define likely(x) (x) - #define unlikely(x) (x) -#endif /* __GNUC__ */ -static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } - -#if !CYTHON_USE_MODULE_STATE -static PyObject *__pyx_m = NULL; -#endif -static int __pyx_lineno; -static int __pyx_clineno = 0; -static const char * __pyx_cfilenm = __FILE__; -static const char *__pyx_filename; - -/* Header.proto */ -#if !defined(CYTHON_CCOMPLEX) - #if defined(__cplusplus) - #define CYTHON_CCOMPLEX 1 - #elif (defined(_Complex_I) && !defined(_MSC_VER)) || ((defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) && !defined(__STDC_NO_COMPLEX__) && !defined(_MSC_VER)) - #define CYTHON_CCOMPLEX 1 - #else - #define CYTHON_CCOMPLEX 0 - #endif -#endif -#if CYTHON_CCOMPLEX - #ifdef __cplusplus - #include - #else - #include - #endif -#endif -#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) - #undef _Complex_I - #define _Complex_I 1.0fj -#endif - -/* #### Code section: filename_table ### */ - -static const char *__pyx_f[] = { - "Lib\\\\fontTools\\\\cu2qu\\\\cu2qu.py", -}; -/* #### Code section: utility_code_proto_before_types ### */ -/* ForceInitThreads.proto */ -#ifndef __PYX_FORCE_INIT_THREADS - #define __PYX_FORCE_INIT_THREADS 0 -#endif - -/* #### Code section: numeric_typedefs ### */ -/* #### Code section: complex_type_declarations ### */ -/* Declarations.proto */ -#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) - #ifdef __cplusplus - typedef ::std::complex< double > __pyx_t_double_complex; - #else - typedef double _Complex __pyx_t_double_complex; - #endif -#else - typedef struct { double real, imag; } __pyx_t_double_complex; -#endif -static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); - -/* #### Code section: type_declarations ### */ - -/*--- Type declarations ---*/ -struct __pyx_obj_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen; - -/* "fontTools/cu2qu/cu2qu.py":127 - * - * - * @cython.locals( # <<<<<<<<<<<<<< - * p0=cython.complex, - * p1=cython.complex, - */ -struct __pyx_obj_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen { - PyObject_HEAD - __pyx_t_double_complex __pyx_v_a; - __pyx_t_double_complex __pyx_v_a1; - __pyx_t_double_complex __pyx_v_b; - __pyx_t_double_complex __pyx_v_b1; - __pyx_t_double_complex __pyx_v_c; - __pyx_t_double_complex __pyx_v_c1; - __pyx_t_double_complex __pyx_v_d; - __pyx_t_double_complex __pyx_v_d1; - double __pyx_v_delta_2; - double __pyx_v_delta_3; - double __pyx_v_dt; - int __pyx_v_i; - int __pyx_v_n; - __pyx_t_double_complex __pyx_v_p0; - __pyx_t_double_complex __pyx_v_p1; - __pyx_t_double_complex __pyx_v_p2; - __pyx_t_double_complex __pyx_v_p3; - double __pyx_v_t1; - double __pyx_v_t1_2; - int __pyx_t_0; - int __pyx_t_1; - int __pyx_t_2; -}; - -/* #### Code section: utility_code_proto ### */ - -/* --- Runtime support code (head) --- */ -/* Refnanny.proto */ -#ifndef CYTHON_REFNANNY - #define CYTHON_REFNANNY 0 -#endif -#if CYTHON_REFNANNY - typedef struct { - void (*INCREF)(void*, PyObject*, Py_ssize_t); - void (*DECREF)(void*, PyObject*, Py_ssize_t); - void (*GOTREF)(void*, PyObject*, Py_ssize_t); - void (*GIVEREF)(void*, PyObject*, Py_ssize_t); - void* (*SetupContext)(const char*, Py_ssize_t, const char*); - void (*FinishContext)(void**); - } __Pyx_RefNannyAPIStruct; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; - static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); - #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; -#ifdef WITH_THREAD - #define __Pyx_RefNannySetupContext(name, acquire_gil)\ - if (acquire_gil) {\ - PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ - PyGILState_Release(__pyx_gilstate_save);\ - } else {\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__));\ - } - #define __Pyx_RefNannyFinishContextNogil() {\ - PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ - __Pyx_RefNannyFinishContext();\ - PyGILState_Release(__pyx_gilstate_save);\ - } -#else - #define __Pyx_RefNannySetupContext(name, acquire_gil)\ - __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), (__LINE__), (__FILE__)) - #define __Pyx_RefNannyFinishContextNogil() __Pyx_RefNannyFinishContext() -#endif - #define __Pyx_RefNannyFinishContextNogil() {\ - PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ - __Pyx_RefNannyFinishContext();\ - PyGILState_Release(__pyx_gilstate_save);\ - } - #define __Pyx_RefNannyFinishContext()\ - __Pyx_RefNanny->FinishContext(&__pyx_refnanny) - #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) - #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) - #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) - #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), (__LINE__)) - #define __Pyx_XINCREF(r) do { if((r) == NULL); else {__Pyx_INCREF(r); }} while(0) - #define __Pyx_XDECREF(r) do { if((r) == NULL); else {__Pyx_DECREF(r); }} while(0) - #define __Pyx_XGOTREF(r) do { if((r) == NULL); else {__Pyx_GOTREF(r); }} while(0) - #define __Pyx_XGIVEREF(r) do { if((r) == NULL); else {__Pyx_GIVEREF(r);}} while(0) -#else - #define __Pyx_RefNannyDeclarations - #define __Pyx_RefNannySetupContext(name, acquire_gil) - #define __Pyx_RefNannyFinishContextNogil() - #define __Pyx_RefNannyFinishContext() - #define __Pyx_INCREF(r) Py_INCREF(r) - #define __Pyx_DECREF(r) Py_DECREF(r) - #define __Pyx_GOTREF(r) - #define __Pyx_GIVEREF(r) - #define __Pyx_XINCREF(r) Py_XINCREF(r) - #define __Pyx_XDECREF(r) Py_XDECREF(r) - #define __Pyx_XGOTREF(r) - #define __Pyx_XGIVEREF(r) -#endif -#define __Pyx_Py_XDECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; Py_XDECREF(tmp);\ - } while (0) -#define __Pyx_XDECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; __Pyx_XDECREF(tmp);\ - } while (0) -#define __Pyx_DECREF_SET(r, v) do {\ - PyObject *tmp = (PyObject *) r;\ - r = v; __Pyx_DECREF(tmp);\ - } while (0) -#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) -#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) - -/* PyErrExceptionMatches.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) -static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); -#else -#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) -#endif - -/* PyThreadStateGet.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; -#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; -#if PY_VERSION_HEX >= 0x030C00A6 -#define __Pyx_PyErr_Occurred() (__pyx_tstate->current_exception != NULL) -#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->current_exception ? (PyObject*) Py_TYPE(__pyx_tstate->current_exception) : (PyObject*) NULL) -#else -#define __Pyx_PyErr_Occurred() (__pyx_tstate->curexc_type != NULL) -#define __Pyx_PyErr_CurrentExceptionType() (__pyx_tstate->curexc_type) -#endif -#else -#define __Pyx_PyThreadState_declare -#define __Pyx_PyThreadState_assign -#define __Pyx_PyErr_Occurred() (PyErr_Occurred() != NULL) -#define __Pyx_PyErr_CurrentExceptionType() PyErr_Occurred() -#endif - -/* PyErrFetchRestore.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) -#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A6 -#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) -#else -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#endif -#else -#define __Pyx_PyErr_Clear() PyErr_Clear() -#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) -#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) -#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) -#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) -#endif - -/* PyObjectGetAttrStr.proto */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); -#else -#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) -#endif - -/* PyObjectGetAttrStrNoError.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); - -/* GetBuiltinName.proto */ -static PyObject *__Pyx_GetBuiltinName(PyObject *name); - -/* PyIntCompare.proto */ -static CYTHON_INLINE int __Pyx_PyInt_BoolEqObjC(PyObject *op1, PyObject *op2, long intval, long inplace); - -/* RaiseTooManyValuesToUnpack.proto */ -static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); - -/* RaiseNeedMoreValuesToUnpack.proto */ -static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); - -/* IterFinish.proto */ -static CYTHON_INLINE int __Pyx_IterFinish(void); - -/* UnpackItemEndCheck.proto */ -static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); - -/* GetItemInt.proto */ -#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ - __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ - (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ - __Pyx_GetItemInt_Generic(o, to_py_func(i)))) -#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ - __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ - (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, - int wraparound, int boundscheck); -#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ - __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ - (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, - int wraparound, int boundscheck); -static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, - int is_list, int wraparound, int boundscheck); - -/* PyDictVersioning.proto */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) -#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ - (version_var) = __PYX_GET_DICT_VERSION(dict);\ - (cache_var) = (value); -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ - static PY_UINT64_T __pyx_dict_version = 0;\ - static PyObject *__pyx_dict_cached_value = NULL;\ - if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ - (VAR) = __pyx_dict_cached_value;\ - } else {\ - (VAR) = __pyx_dict_cached_value = (LOOKUP);\ - __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ - }\ -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); -#else -#define __PYX_GET_DICT_VERSION(dict) (0) -#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) -#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); -#endif - -/* GetModuleGlobalName.proto */ -#if CYTHON_USE_DICT_VERSIONS -#define __Pyx_GetModuleGlobalName(var, name) do {\ - static PY_UINT64_T __pyx_dict_version = 0;\ - static PyObject *__pyx_dict_cached_value = NULL;\ - (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ - (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ - __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} while(0) -#define __Pyx_GetModuleGlobalNameUncached(var, name) do {\ - PY_UINT64_T __pyx_dict_version;\ - PyObject *__pyx_dict_cached_value;\ - (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ -} while(0) -static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); -#else -#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) -#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) -static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); -#endif - -/* PyFunctionFastCall.proto */ -#if CYTHON_FAST_PYCALL -#if !CYTHON_VECTORCALL -#define __Pyx_PyFunction_FastCall(func, args, nargs)\ - __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); -#endif -#define __Pyx_BUILD_ASSERT_EXPR(cond)\ - (sizeof(char [1 - 2*!(cond)]) - 1) -#ifndef Py_MEMBER_SIZE -#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) -#endif -#if !CYTHON_VECTORCALL -#if PY_VERSION_HEX >= 0x03080000 - #include "frameobject.h" -#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API - #ifndef Py_BUILD_CORE - #define Py_BUILD_CORE 1 - #endif - #include "internal/pycore_frame.h" -#endif - #define __Pxy_PyFrame_Initialize_Offsets() - #define __Pyx_PyFrame_GetLocalsplus(frame) ((frame)->f_localsplus) -#else - static size_t __pyx_pyframe_localsplus_offset = 0; - #include "frameobject.h" - #define __Pxy_PyFrame_Initialize_Offsets()\ - ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ - (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) - #define __Pyx_PyFrame_GetLocalsplus(frame)\ - (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) -#endif -#endif -#endif - -/* PyObjectCall.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); -#else -#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) -#endif - -/* PyObjectCallMethO.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); -#endif - -/* PyObjectFastCall.proto */ -#define __Pyx_PyObject_FastCall(func, args, nargs) __Pyx_PyObject_FastCallDict(func, args, (size_t)(nargs), NULL) -static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); - -/* TupleAndListFromArray.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n); -static CYTHON_INLINE PyObject* __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n); -#endif - -/* IncludeStringH.proto */ -#include - -/* BytesEquals.proto */ -static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); - -/* UnicodeEquals.proto */ -static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); - -/* fastcall.proto */ -#if CYTHON_AVOID_BORROWED_REFS - #define __Pyx_Arg_VARARGS(args, i) PySequence_GetItem(args, i) -#elif CYTHON_ASSUME_SAFE_MACROS - #define __Pyx_Arg_VARARGS(args, i) PyTuple_GET_ITEM(args, i) -#else - #define __Pyx_Arg_VARARGS(args, i) PyTuple_GetItem(args, i) -#endif -#if CYTHON_AVOID_BORROWED_REFS - #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) - #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) -#else - #define __Pyx_Arg_NewRef_VARARGS(arg) arg - #define __Pyx_Arg_XDECREF_VARARGS(arg) -#endif -#define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) -#define __Pyx_KwValues_VARARGS(args, nargs) NULL -#define __Pyx_GetKwValue_VARARGS(kw, kwvalues, s) __Pyx_PyDict_GetItemStrWithError(kw, s) -#define __Pyx_KwargsAsDict_VARARGS(kw, kwvalues) PyDict_Copy(kw) -#if CYTHON_METH_FASTCALL - #define __Pyx_Arg_FASTCALL(args, i) args[i] - #define __Pyx_NumKwargs_FASTCALL(kwds) PyTuple_GET_SIZE(kwds) - #define __Pyx_KwValues_FASTCALL(args, nargs) ((args) + (nargs)) - static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s); -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 - CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues); - #else - #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) - #endif - #define __Pyx_Arg_NewRef_FASTCALL(arg) arg /* no-op, __Pyx_Arg_FASTCALL is direct and this needs - to have the same reference counting */ - #define __Pyx_Arg_XDECREF_FASTCALL(arg) -#else - #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS - #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS - #define __Pyx_KwValues_FASTCALL __Pyx_KwValues_VARARGS - #define __Pyx_GetKwValue_FASTCALL __Pyx_GetKwValue_VARARGS - #define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS - #define __Pyx_Arg_NewRef_FASTCALL(arg) __Pyx_Arg_NewRef_VARARGS(arg) - #define __Pyx_Arg_XDECREF_FASTCALL(arg) __Pyx_Arg_XDECREF_VARARGS(arg) -#endif -#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS -#define __Pyx_ArgsSlice_VARARGS(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_VARARGS(args, start), stop - start) -#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(&__Pyx_Arg_FASTCALL(args, start), stop - start) -#else -#define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop) -#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop) -#endif - -/* RaiseArgTupleInvalid.proto */ -static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, - Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); - -/* RaiseDoubleKeywords.proto */ -static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); - -/* ParseKeywords.proto */ -static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject *const *kwvalues, - PyObject **argnames[], - PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, - const char* function_name); - -/* GetException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) -static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#else -static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); -#endif - -/* pep479.proto */ -static void __Pyx_Generator_Replace_StopIteration(int in_async_gen); - -/* GetTopmostException.proto */ -#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE -static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); -#endif - -/* SaveResetException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); -#else -#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) -#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) -#endif - -/* IterNext.proto */ -#define __Pyx_PyIter_Next(obj) __Pyx_PyIter_Next2(obj, NULL) -static CYTHON_INLINE PyObject *__Pyx_PyIter_Next2(PyObject *, PyObject *); - -/* ListAppend.proto */ -#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS -static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { - PyListObject* L = (PyListObject*) list; - Py_ssize_t len = Py_SIZE(list); - if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { - Py_INCREF(x); - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 - L->ob_item[len] = x; - #else - PyList_SET_ITEM(list, len, x); - #endif - __Pyx_SET_SIZE(list, len + 1); - return 0; - } - return PyList_Append(list, x); -} -#else -#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) -#endif - -/* ListCompAppend.proto */ -#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS -static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { - PyListObject* L = (PyListObject*) list; - Py_ssize_t len = Py_SIZE(list); - if (likely(L->allocated > len)) { - Py_INCREF(x); - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 - L->ob_item[len] = x; - #else - PyList_SET_ITEM(list, len, x); - #endif - __Pyx_SET_SIZE(list, len + 1); - return 0; - } - return PyList_Append(list, x); -} -#else -#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) -#endif - -/* PyIntBinop.proto */ -#if !CYTHON_COMPILING_IN_PYPY -static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check); -#else -#define __Pyx_PyInt_AddObjC(op1, op2, intval, inplace, zerodivision_check)\ - (inplace ? PyNumber_InPlaceAdd(op1, op2) : PyNumber_Add(op1, op2)) -#endif - -/* RaiseException.proto */ -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); - -/* AssertionsEnabled.proto */ -#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) - #define __Pyx_init_assertions_enabled() (0) - #define __pyx_assertions_enabled() (1) -#elif CYTHON_COMPILING_IN_LIMITED_API || (CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030C0000) - static int __pyx_assertions_enabled_flag; - #define __pyx_assertions_enabled() (__pyx_assertions_enabled_flag) - static int __Pyx_init_assertions_enabled(void) { - PyObject *builtins, *debug, *debug_str; - int flag; - builtins = PyEval_GetBuiltins(); - if (!builtins) goto bad; - debug_str = PyUnicode_FromStringAndSize("__debug__", 9); - if (!debug_str) goto bad; - debug = PyObject_GetItem(builtins, debug_str); - Py_DECREF(debug_str); - if (!debug) goto bad; - flag = PyObject_IsTrue(debug); - Py_DECREF(debug); - if (flag == -1) goto bad; - __pyx_assertions_enabled_flag = flag; - return 0; - bad: - __pyx_assertions_enabled_flag = 1; - return -1; - } -#else - #define __Pyx_init_assertions_enabled() (0) - #define __pyx_assertions_enabled() (!Py_OptimizeFlag) -#endif - -/* SetItemInt.proto */ -#define __Pyx_SetItemInt(o, i, v, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ - (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ - __Pyx_SetItemInt_Fast(o, (Py_ssize_t)i, v, is_list, wraparound, boundscheck) :\ - (is_list ? (PyErr_SetString(PyExc_IndexError, "list assignment index out of range"), -1) :\ - __Pyx_SetItemInt_Generic(o, to_py_func(i), v))) -static int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v); -static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, - int is_list, int wraparound, int boundscheck); - -/* ModInt[long].proto */ -static CYTHON_INLINE long __Pyx_mod_long(long, long); - -/* IncludeStructmemberH.proto */ -#include - -/* FixUpExtensionType.proto */ -#if CYTHON_USE_TYPE_SPECS -static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type); -#endif - -/* PyObjectCallNoArg.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); - -/* PyObjectCallOneArg.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); - -/* PyObjectGetMethod.proto */ -static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); - -/* PyObjectCallMethod0.proto */ -static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name); - -/* ValidateBasesTuple.proto */ -#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS -static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases); -#endif - -/* PyType_Ready.proto */ -CYTHON_UNUSED static int __Pyx_PyType_Ready(PyTypeObject *t); - -/* PyObject_GenericGetAttrNoDict.proto */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); -#else -#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr -#endif - -/* FastTypeChecks.proto */ -#if CYTHON_COMPILING_IN_CPYTHON -#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) -#define __Pyx_TypeCheck2(obj, type1, type2) __Pyx_IsAnySubtype2(Py_TYPE(obj), (PyTypeObject *)type1, (PyTypeObject *)type2) -static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); -static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b); -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); -static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); -#else -#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) -#define __Pyx_TypeCheck2(obj, type1, type2) (PyObject_TypeCheck(obj, (PyTypeObject *)type1) || PyObject_TypeCheck(obj, (PyTypeObject *)type2)) -#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) -#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) -#endif -#define __Pyx_PyErr_ExceptionMatches2(err1, err2) __Pyx_PyErr_GivenExceptionMatches2(__Pyx_PyErr_CurrentExceptionType(), err1, err2) -#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) - -/* Import.proto */ -static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); - -/* ImportFrom.proto */ -static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); - -/* ImportDottedModule.proto */ -static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple); -#if PY_MAJOR_VERSION >= 3 -static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple); -#endif - -/* pybytes_as_double.proto */ -static double __Pyx_SlowPyString_AsDouble(PyObject *obj); -static double __Pyx__PyBytes_AsDouble(PyObject *obj, const char* start, Py_ssize_t length); -static CYTHON_INLINE double __Pyx_PyBytes_AsDouble(PyObject *obj) { - char* as_c_string; - Py_ssize_t size; -#if CYTHON_ASSUME_SAFE_MACROS - as_c_string = PyBytes_AS_STRING(obj); - size = PyBytes_GET_SIZE(obj); -#else - if (PyBytes_AsStringAndSize(obj, &as_c_string, &size) < 0) { - return (double)-1; - } -#endif - return __Pyx__PyBytes_AsDouble(obj, as_c_string, size); -} -static CYTHON_INLINE double __Pyx_PyByteArray_AsDouble(PyObject *obj) { - char* as_c_string; - Py_ssize_t size; -#if CYTHON_ASSUME_SAFE_MACROS - as_c_string = PyByteArray_AS_STRING(obj); - size = PyByteArray_GET_SIZE(obj); -#else - as_c_string = PyByteArray_AsString(obj); - if (as_c_string == NULL) { - return (double)-1; - } - size = PyByteArray_Size(obj); -#endif - return __Pyx__PyBytes_AsDouble(obj, as_c_string, size); -} - -/* pyunicode_as_double.proto */ -#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY && CYTHON_ASSUME_SAFE_MACROS -static const char* __Pyx__PyUnicode_AsDouble_Copy(const void* data, const int kind, char* buffer, Py_ssize_t start, Py_ssize_t end) { - int last_was_punctuation; - Py_ssize_t i; - last_was_punctuation = 1; - for (i=start; i <= end; i++) { - Py_UCS4 chr = PyUnicode_READ(kind, data, i); - int is_punctuation = (chr == '_') | (chr == '.'); - *buffer = (char)chr; - buffer += (chr != '_'); - if (unlikely(chr > 127)) goto parse_failure; - if (unlikely(last_was_punctuation & is_punctuation)) goto parse_failure; - last_was_punctuation = is_punctuation; - } - if (unlikely(last_was_punctuation)) goto parse_failure; - *buffer = '\0'; - return buffer; -parse_failure: - return NULL; -} -static double __Pyx__PyUnicode_AsDouble_inf_nan(const void* data, int kind, Py_ssize_t start, Py_ssize_t length) { - int matches = 1; - Py_UCS4 chr; - Py_UCS4 sign = PyUnicode_READ(kind, data, start); - int is_signed = (sign == '-') | (sign == '+'); - start += is_signed; - length -= is_signed; - switch (PyUnicode_READ(kind, data, start)) { - #ifdef Py_NAN - case 'n': - case 'N': - if (unlikely(length != 3)) goto parse_failure; - chr = PyUnicode_READ(kind, data, start+1); - matches &= (chr == 'a') | (chr == 'A'); - chr = PyUnicode_READ(kind, data, start+2); - matches &= (chr == 'n') | (chr == 'N'); - if (unlikely(!matches)) goto parse_failure; - return (sign == '-') ? -Py_NAN : Py_NAN; - #endif - case 'i': - case 'I': - if (unlikely(length < 3)) goto parse_failure; - chr = PyUnicode_READ(kind, data, start+1); - matches &= (chr == 'n') | (chr == 'N'); - chr = PyUnicode_READ(kind, data, start+2); - matches &= (chr == 'f') | (chr == 'F'); - if (likely(length == 3 && matches)) - return (sign == '-') ? -Py_HUGE_VAL : Py_HUGE_VAL; - if (unlikely(length != 8)) goto parse_failure; - chr = PyUnicode_READ(kind, data, start+3); - matches &= (chr == 'i') | (chr == 'I'); - chr = PyUnicode_READ(kind, data, start+4); - matches &= (chr == 'n') | (chr == 'N'); - chr = PyUnicode_READ(kind, data, start+5); - matches &= (chr == 'i') | (chr == 'I'); - chr = PyUnicode_READ(kind, data, start+6); - matches &= (chr == 't') | (chr == 'T'); - chr = PyUnicode_READ(kind, data, start+7); - matches &= (chr == 'y') | (chr == 'Y'); - if (unlikely(!matches)) goto parse_failure; - return (sign == '-') ? -Py_HUGE_VAL : Py_HUGE_VAL; - case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': - break; - default: - goto parse_failure; - } - return 0.0; -parse_failure: - return -1.0; -} -static double __Pyx_PyUnicode_AsDouble_WithSpaces(PyObject *obj) { - double value; - const char *last; - char *end; - Py_ssize_t start, length = PyUnicode_GET_LENGTH(obj); - const int kind = PyUnicode_KIND(obj); - const void* data = PyUnicode_DATA(obj); - start = 0; - while (Py_UNICODE_ISSPACE(PyUnicode_READ(kind, data, start))) - start++; - while (start < length - 1 && Py_UNICODE_ISSPACE(PyUnicode_READ(kind, data, length - 1))) - length--; - length -= start; - if (unlikely(length <= 0)) goto fallback; - value = __Pyx__PyUnicode_AsDouble_inf_nan(data, kind, start, length); - if (unlikely(value == -1.0)) goto fallback; - if (value != 0.0) return value; - if (length < 40) { - char number[40]; - last = __Pyx__PyUnicode_AsDouble_Copy(data, kind, number, start, start + length); - if (unlikely(!last)) goto fallback; - value = PyOS_string_to_double(number, &end, NULL); - } else { - char *number = (char*) PyMem_Malloc((length + 1) * sizeof(char)); - if (unlikely(!number)) goto fallback; - last = __Pyx__PyUnicode_AsDouble_Copy(data, kind, number, start, start + length); - if (unlikely(!last)) { - PyMem_Free(number); - goto fallback; - } - value = PyOS_string_to_double(number, &end, NULL); - PyMem_Free(number); - } - if (likely(end == last) || (value == (double)-1 && PyErr_Occurred())) { - return value; - } -fallback: - return __Pyx_SlowPyString_AsDouble(obj); -} -#endif -static CYTHON_INLINE double __Pyx_PyUnicode_AsDouble(PyObject *obj) { -#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY && CYTHON_ASSUME_SAFE_MACROS - if (unlikely(__Pyx_PyUnicode_READY(obj) == -1)) - return (double)-1; - if (likely(PyUnicode_IS_ASCII(obj))) { - const char *s; - Py_ssize_t length; - s = PyUnicode_AsUTF8AndSize(obj, &length); - return __Pyx__PyBytes_AsDouble(obj, s, length); - } - return __Pyx_PyUnicode_AsDouble_WithSpaces(obj); -#else - return __Pyx_SlowPyString_AsDouble(obj); -#endif -} - -/* FetchSharedCythonModule.proto */ -static PyObject *__Pyx_FetchSharedCythonABIModule(void); - -/* FetchCommonType.proto */ -#if !CYTHON_USE_TYPE_SPECS -static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); -#else -static PyTypeObject* __Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases); -#endif - -/* PyMethodNew.proto */ -#if CYTHON_COMPILING_IN_LIMITED_API -static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { - PyObject *typesModule=NULL, *methodType=NULL, *result=NULL; - CYTHON_UNUSED_VAR(typ); - if (!self) - return __Pyx_NewRef(func); - typesModule = PyImport_ImportModule("types"); - if (!typesModule) return NULL; - methodType = PyObject_GetAttrString(typesModule, "MethodType"); - Py_DECREF(typesModule); - if (!methodType) return NULL; - result = PyObject_CallFunctionObjArgs(methodType, func, self, NULL); - Py_DECREF(methodType); - return result; -} -#elif PY_MAJOR_VERSION >= 3 -static PyObject *__Pyx_PyMethod_New(PyObject *func, PyObject *self, PyObject *typ) { - CYTHON_UNUSED_VAR(typ); - if (!self) - return __Pyx_NewRef(func); - return PyMethod_New(func, self); -} -#else - #define __Pyx_PyMethod_New PyMethod_New -#endif - -/* PyVectorcallFastCallDict.proto */ -#if CYTHON_METH_FASTCALL -static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw); -#endif - -/* CythonFunctionShared.proto */ -#define __Pyx_CyFunction_USED -#define __Pyx_CYFUNCTION_STATICMETHOD 0x01 -#define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 -#define __Pyx_CYFUNCTION_CCLASS 0x04 -#define __Pyx_CYFUNCTION_COROUTINE 0x08 -#define __Pyx_CyFunction_GetClosure(f)\ - (((__pyx_CyFunctionObject *) (f))->func_closure) -#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API - #define __Pyx_CyFunction_GetClassObj(f)\ - (((__pyx_CyFunctionObject *) (f))->func_classobj) -#else - #define __Pyx_CyFunction_GetClassObj(f)\ - ((PyObject*) ((PyCMethodObject *) (f))->mm_class) -#endif -#define __Pyx_CyFunction_SetClassObj(f, classobj)\ - __Pyx__CyFunction_SetClassObj((__pyx_CyFunctionObject *) (f), (classobj)) -#define __Pyx_CyFunction_Defaults(type, f)\ - ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) -#define __Pyx_CyFunction_SetDefaultsGetter(f, g)\ - ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) -typedef struct { -#if CYTHON_COMPILING_IN_LIMITED_API - PyObject_HEAD - PyObject *func; -#elif PY_VERSION_HEX < 0x030900B1 - PyCFunctionObject func; -#else - PyCMethodObject func; -#endif -#if CYTHON_BACKPORT_VECTORCALL - __pyx_vectorcallfunc func_vectorcall; -#endif -#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API - PyObject *func_weakreflist; -#endif - PyObject *func_dict; - PyObject *func_name; - PyObject *func_qualname; - PyObject *func_doc; - PyObject *func_globals; - PyObject *func_code; - PyObject *func_closure; -#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API - PyObject *func_classobj; -#endif - void *defaults; - int defaults_pyobjects; - size_t defaults_size; - int flags; - PyObject *defaults_tuple; - PyObject *defaults_kwdict; - PyObject *(*defaults_getter)(PyObject *); - PyObject *func_annotations; - PyObject *func_is_coroutine; -} __pyx_CyFunctionObject; -#undef __Pyx_CyOrPyCFunction_Check -#define __Pyx_CyFunction_Check(obj) __Pyx_TypeCheck(obj, __pyx_CyFunctionType) -#define __Pyx_CyOrPyCFunction_Check(obj) __Pyx_TypeCheck2(obj, __pyx_CyFunctionType, &PyCFunction_Type) -#define __Pyx_CyFunction_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_CyFunctionType) -static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc); -#undef __Pyx_IsSameCFunction -#define __Pyx_IsSameCFunction(func, cfunc) __Pyx__IsSameCyOrCFunction(func, cfunc) -static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject* op, PyMethodDef *ml, - int flags, PyObject* qualname, - PyObject *closure, - PyObject *module, PyObject *globals, - PyObject* code); -static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj); -static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, - size_t size, - int pyobjects); -static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, - PyObject *tuple); -static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, - PyObject *dict); -static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, - PyObject *dict); -static int __pyx_CyFunction_init(PyObject *module); -#if CYTHON_METH_FASTCALL -static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); -static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); -static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); -static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames); -#if CYTHON_BACKPORT_VECTORCALL -#define __Pyx_CyFunction_func_vectorcall(f) (((__pyx_CyFunctionObject*)f)->func_vectorcall) -#else -#define __Pyx_CyFunction_func_vectorcall(f) (((PyCFunctionObject*)f)->vectorcall) -#endif -#endif - -/* CythonFunction.proto */ -static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, - int flags, PyObject* qualname, - PyObject *closure, - PyObject *module, PyObject *globals, - PyObject* code); - -/* CLineInTraceback.proto */ -#ifdef CYTHON_CLINE_IN_TRACEBACK -#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) -#else -static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); -#endif - -/* CodeObjectCache.proto */ -#if !CYTHON_COMPILING_IN_LIMITED_API -typedef struct { - PyCodeObject* code_object; - int code_line; -} __Pyx_CodeObjectCacheEntry; -struct __Pyx_CodeObjectCache { - int count; - int max_count; - __Pyx_CodeObjectCacheEntry* entries; -}; -static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); -static PyCodeObject *__pyx_find_code_object(int code_line); -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); -#endif - -/* AddTraceback.proto */ -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename); - -/* RealImag.proto */ -#if CYTHON_CCOMPLEX - #ifdef __cplusplus - #define __Pyx_CREAL(z) ((z).real()) - #define __Pyx_CIMAG(z) ((z).imag()) - #else - #define __Pyx_CREAL(z) (__real__(z)) - #define __Pyx_CIMAG(z) (__imag__(z)) - #endif -#else - #define __Pyx_CREAL(z) ((z).real) - #define __Pyx_CIMAG(z) ((z).imag) -#endif -#if defined(__cplusplus) && CYTHON_CCOMPLEX\ - && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) - #define __Pyx_SET_CREAL(z,x) ((z).real(x)) - #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) -#else - #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) - #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) -#endif - -/* Arithmetic.proto */ -#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) - #define __Pyx_c_eq_double(a, b) ((a)==(b)) - #define __Pyx_c_sum_double(a, b) ((a)+(b)) - #define __Pyx_c_diff_double(a, b) ((a)-(b)) - #define __Pyx_c_prod_double(a, b) ((a)*(b)) - #define __Pyx_c_quot_double(a, b) ((a)/(b)) - #define __Pyx_c_neg_double(a) (-(a)) - #ifdef __cplusplus - #define __Pyx_c_is_zero_double(z) ((z)==(double)0) - #define __Pyx_c_conj_double(z) (::std::conj(z)) - #if 1 - #define __Pyx_c_abs_double(z) (::std::abs(z)) - #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) - #endif - #else - #define __Pyx_c_is_zero_double(z) ((z)==0) - #define __Pyx_c_conj_double(z) (conj(z)) - #if 1 - #define __Pyx_c_abs_double(z) (cabs(z)) - #define __Pyx_c_pow_double(a, b) (cpow(a, b)) - #endif - #endif -#else - static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); - static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); - #if 1 - static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); - #endif -#endif - -/* FromPy.proto */ -static __pyx_t_double_complex __Pyx_PyComplex_As___pyx_t_double_complex(PyObject*); - -/* GCCDiagnostics.proto */ -#if !defined(__INTEL_COMPILER) && defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) -#define __Pyx_HAS_GCC_DIAGNOSTIC -#endif - -/* ToPy.proto */ -#define __pyx_PyComplex_FromComplex(z)\ - PyComplex_FromDoubles((double)__Pyx_CREAL(z),\ - (double)__Pyx_CIMAG(z)) - -/* CIntFromPy.proto */ -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); - -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); - -/* CIntToPy.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); - -/* CIntFromPy.proto */ -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); - -/* FormatTypeName.proto */ -#if CYTHON_COMPILING_IN_LIMITED_API -typedef PyObject *__Pyx_TypeName; -#define __Pyx_FMT_TYPENAME "%U" -static __Pyx_TypeName __Pyx_PyType_GetName(PyTypeObject* tp); -#define __Pyx_DECREF_TypeName(obj) Py_XDECREF(obj) -#else -typedef const char *__Pyx_TypeName; -#define __Pyx_FMT_TYPENAME "%.200s" -#define __Pyx_PyType_GetName(tp) ((tp)->tp_name) -#define __Pyx_DECREF_TypeName(obj) -#endif - -/* SwapException.proto */ -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) -static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); -#else -static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); -#endif - -/* PyObjectCall2Args.proto */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); - -/* PyObjectCallMethod1.proto */ -static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg); - -/* CoroutineBase.proto */ -struct __pyx_CoroutineObject; -typedef PyObject *(*__pyx_coroutine_body_t)(struct __pyx_CoroutineObject *, PyThreadState *, PyObject *); -#if CYTHON_USE_EXC_INFO_STACK -#define __Pyx_ExcInfoStruct _PyErr_StackItem -#else -typedef struct { - PyObject *exc_type; - PyObject *exc_value; - PyObject *exc_traceback; -} __Pyx_ExcInfoStruct; -#endif -typedef struct __pyx_CoroutineObject { - PyObject_HEAD - __pyx_coroutine_body_t body; - PyObject *closure; - __Pyx_ExcInfoStruct gi_exc_state; - PyObject *gi_weakreflist; - PyObject *classobj; - PyObject *yieldfrom; - PyObject *gi_name; - PyObject *gi_qualname; - PyObject *gi_modulename; - PyObject *gi_code; - PyObject *gi_frame; - int resume_label; - char is_running; -} __pyx_CoroutineObject; -static __pyx_CoroutineObject *__Pyx__Coroutine_New( - PyTypeObject *type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, - PyObject *name, PyObject *qualname, PyObject *module_name); -static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit( - __pyx_CoroutineObject *gen, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, - PyObject *name, PyObject *qualname, PyObject *module_name); -static CYTHON_INLINE void __Pyx_Coroutine_ExceptionClear(__Pyx_ExcInfoStruct *self); -static int __Pyx_Coroutine_clear(PyObject *self); -static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value); -static PyObject *__Pyx_Coroutine_Close(PyObject *self); -static PyObject *__Pyx_Coroutine_Throw(PyObject *gen, PyObject *args); -#if CYTHON_USE_EXC_INFO_STACK -#define __Pyx_Coroutine_SwapException(self) -#define __Pyx_Coroutine_ResetAndClearException(self) __Pyx_Coroutine_ExceptionClear(&(self)->gi_exc_state) -#else -#define __Pyx_Coroutine_SwapException(self) {\ - __Pyx_ExceptionSwap(&(self)->gi_exc_state.exc_type, &(self)->gi_exc_state.exc_value, &(self)->gi_exc_state.exc_traceback);\ - __Pyx_Coroutine_ResetFrameBackpointer(&(self)->gi_exc_state);\ - } -#define __Pyx_Coroutine_ResetAndClearException(self) {\ - __Pyx_ExceptionReset((self)->gi_exc_state.exc_type, (self)->gi_exc_state.exc_value, (self)->gi_exc_state.exc_traceback);\ - (self)->gi_exc_state.exc_type = (self)->gi_exc_state.exc_value = (self)->gi_exc_state.exc_traceback = NULL;\ - } -#endif -#if CYTHON_FAST_THREAD_STATE -#define __Pyx_PyGen_FetchStopIterationValue(pvalue)\ - __Pyx_PyGen__FetchStopIterationValue(__pyx_tstate, pvalue) -#else -#define __Pyx_PyGen_FetchStopIterationValue(pvalue)\ - __Pyx_PyGen__FetchStopIterationValue(__Pyx_PyThreadState_Current, pvalue) -#endif -static int __Pyx_PyGen__FetchStopIterationValue(PyThreadState *tstate, PyObject **pvalue); -static CYTHON_INLINE void __Pyx_Coroutine_ResetFrameBackpointer(__Pyx_ExcInfoStruct *exc_state); - -/* PatchModuleWithCoroutine.proto */ -static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code); - -/* PatchGeneratorABC.proto */ -static int __Pyx_patch_abc(void); - -/* Generator.proto */ -#define __Pyx_Generator_USED -#define __Pyx_Generator_CheckExact(obj) __Pyx_IS_TYPE(obj, __pyx_GeneratorType) -#define __Pyx_Generator_New(body, code, closure, name, qualname, module_name)\ - __Pyx__Coroutine_New(__pyx_GeneratorType, body, code, closure, name, qualname, module_name) -static PyObject *__Pyx_Generator_Next(PyObject *self); -static int __pyx_Generator_init(PyObject *module); - -/* CheckBinaryVersion.proto */ -static unsigned long __Pyx_get_runtime_version(void); -static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer); - -/* InitStrings.proto */ -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); - -/* #### Code section: module_declarations ### */ - -/* Module declarations from "cython" */ - -/* Module declarations from "fontTools.cu2qu.cu2qu" */ -static CYTHON_INLINE double __pyx_f_9fontTools_5cu2qu_5cu2qu_dot(__pyx_t_double_complex, __pyx_t_double_complex); /*proto*/ -static CYTHON_INLINE PyObject *__pyx_f_9fontTools_5cu2qu_5cu2qu_calc_cubic_points(__pyx_t_double_complex, __pyx_t_double_complex, __pyx_t_double_complex, __pyx_t_double_complex); /*proto*/ -static CYTHON_INLINE PyObject *__pyx_f_9fontTools_5cu2qu_5cu2qu_calc_cubic_parameters(__pyx_t_double_complex, __pyx_t_double_complex, __pyx_t_double_complex, __pyx_t_double_complex); /*proto*/ -static CYTHON_INLINE PyObject *__pyx_f_9fontTools_5cu2qu_5cu2qu_split_cubic_into_n_iter(__pyx_t_double_complex, __pyx_t_double_complex, __pyx_t_double_complex, __pyx_t_double_complex, PyObject *); /*proto*/ -static CYTHON_INLINE PyObject *__pyx_f_9fontTools_5cu2qu_5cu2qu_split_cubic_into_two(__pyx_t_double_complex, __pyx_t_double_complex, __pyx_t_double_complex, __pyx_t_double_complex); /*proto*/ -static CYTHON_INLINE PyObject *__pyx_f_9fontTools_5cu2qu_5cu2qu_split_cubic_into_three(__pyx_t_double_complex, __pyx_t_double_complex, __pyx_t_double_complex, __pyx_t_double_complex); /*proto*/ -static CYTHON_INLINE __pyx_t_double_complex __pyx_f_9fontTools_5cu2qu_5cu2qu_cubic_approx_control(double, __pyx_t_double_complex, __pyx_t_double_complex, __pyx_t_double_complex, __pyx_t_double_complex); /*proto*/ -static CYTHON_INLINE __pyx_t_double_complex __pyx_f_9fontTools_5cu2qu_5cu2qu_calc_intersect(__pyx_t_double_complex, __pyx_t_double_complex, __pyx_t_double_complex, __pyx_t_double_complex); /*proto*/ -static int __pyx_f_9fontTools_5cu2qu_5cu2qu_cubic_farthest_fit_inside(__pyx_t_double_complex, __pyx_t_double_complex, __pyx_t_double_complex, __pyx_t_double_complex, double); /*proto*/ -static CYTHON_INLINE PyObject *__pyx_f_9fontTools_5cu2qu_5cu2qu_cubic_approx_quadratic(PyObject *, double); /*proto*/ -static PyObject *__pyx_f_9fontTools_5cu2qu_5cu2qu_cubic_approx_spline(PyObject *, int, double, int); /*proto*/ -/* #### Code section: typeinfo ### */ -/* #### Code section: before_global_var ### */ -#define __Pyx_MODULE_NAME "fontTools.cu2qu.cu2qu" -extern int __pyx_module_is_main_fontTools__cu2qu__cu2qu; -int __pyx_module_is_main_fontTools__cu2qu__cu2qu = 0; - -/* Implementation of "fontTools.cu2qu.cu2qu" */ -/* #### Code section: global_var ### */ -static PyObject *__pyx_builtin_AttributeError; -static PyObject *__pyx_builtin_ImportError; -static PyObject *__pyx_builtin_range; -static PyObject *__pyx_builtin_ZeroDivisionError; -static PyObject *__pyx_builtin_AssertionError; -/* #### Code section: string_decls ### */ -static const char __pyx_k_a[] = "a"; -static const char __pyx_k_b[] = "b"; -static const char __pyx_k_c[] = "c"; -static const char __pyx_k_d[] = "d"; -static const char __pyx_k_i[] = "i"; -static const char __pyx_k_l[] = "l"; -static const char __pyx_k_n[] = "n"; -static const char __pyx_k_p[] = "p"; -static const char __pyx_k_s[] = "s"; -static const char __pyx_k__2[] = "."; -static const char __pyx_k__3[] = "*"; -static const char __pyx_k__9[] = "?"; -static const char __pyx_k_a1[] = "a1"; -static const char __pyx_k_b1[] = "b1"; -static const char __pyx_k_c1[] = "c1"; -static const char __pyx_k_d1[] = "d1"; -static const char __pyx_k_dt[] = "dt"; -static const char __pyx_k_gc[] = "gc"; -static const char __pyx_k_p0[] = "p0"; -static const char __pyx_k_p1[] = "p1"; -static const char __pyx_k_p2[] = "p2"; -static const char __pyx_k_p3[] = "p3"; -static const char __pyx_k_t1[] = "t1"; -static const char __pyx_k_NAN[] = "NAN"; -static const char __pyx_k_NaN[] = "NaN"; -static const char __pyx_k_all[] = "__all__"; -static const char __pyx_k_args[] = "args"; -static const char __pyx_k_imag[] = "imag"; -static const char __pyx_k_main[] = "__main__"; -static const char __pyx_k_math[] = "math"; -static const char __pyx_k_name[] = "__name__"; -static const char __pyx_k_real[] = "real"; -static const char __pyx_k_send[] = "send"; -static const char __pyx_k_spec[] = "__spec__"; -static const char __pyx_k_t1_2[] = "t1_2"; -static const char __pyx_k_test[] = "__test__"; -static const char __pyx_k_Error[] = "Error"; -static const char __pyx_k_MAX_N[] = "MAX_N"; -static const char __pyx_k_close[] = "close"; -static const char __pyx_k_curve[] = "curve"; -static const char __pyx_k_isnan[] = "isnan"; -static const char __pyx_k_range[] = "range"; -static const char __pyx_k_throw[] = "throw"; -static const char __pyx_k_curves[] = "curves"; -static const char __pyx_k_cython[] = "cython"; -static const char __pyx_k_enable[] = "enable"; -static const char __pyx_k_errors[] = "errors"; -static const char __pyx_k_import[] = "__import__"; -static const char __pyx_k_last_i[] = "last_i"; -static const char __pyx_k_spline[] = "spline"; -static const char __pyx_k_delta_2[] = "delta_2"; -static const char __pyx_k_delta_3[] = "delta_3"; -static const char __pyx_k_disable[] = "disable"; -static const char __pyx_k_max_err[] = "max_err"; -static const char __pyx_k_splines[] = "splines"; -static const char __pyx_k_COMPILED[] = "COMPILED"; -static const char __pyx_k_isenabled[] = "isenabled"; -static const char __pyx_k_Cu2QuError[] = "Cu2QuError"; -static const char __pyx_k_max_errors[] = "max_errors"; -static const char __pyx_k_ImportError[] = "ImportError"; -static const char __pyx_k_initializing[] = "_initializing"; -static const char __pyx_k_is_coroutine[] = "_is_coroutine"; -static const char __pyx_k_all_quadratic[] = "all_quadratic"; -static const char __pyx_k_AssertionError[] = "AssertionError"; -static const char __pyx_k_AttributeError[] = "AttributeError"; -static const char __pyx_k_fontTools_misc[] = "fontTools.misc"; -static const char __pyx_k_ZeroDivisionError[] = "ZeroDivisionError"; -static const char __pyx_k_asyncio_coroutines[] = "asyncio.coroutines"; -static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; -static const char __pyx_k_curve_to_quadratic[] = "curve_to_quadratic"; -static const char __pyx_k_ApproxNotFoundError[] = "ApproxNotFoundError"; -static const char __pyx_k_curves_to_quadratic[] = "curves_to_quadratic"; -static const char __pyx_k_fontTools_cu2qu_cu2qu[] = "fontTools.cu2qu.cu2qu"; -static const char __pyx_k_split_cubic_into_n_gen[] = "_split_cubic_into_n_gen"; -static const char __pyx_k_Lib_fontTools_cu2qu_cu2qu_py[] = "Lib\\fontTools\\cu2qu\\cu2qu.py"; -static const char __pyx_k_curves_to_quadratic_line_474[] = "curves_to_quadratic (line 474)"; -static const char __pyx_k_Return_quadratic_Bezier_splines[] = "Return quadratic Bezier splines approximating the input cubic Beziers.\n\n Args:\n curves: A sequence of *n* curves, each curve being a sequence of four\n 2D tuples.\n max_errors: A sequence of *n* floats representing the maximum permissible\n deviation from each of the cubic Bezier curves.\n all_quadratic (bool): If True (default) returned values are a\n quadratic spline. If False, they are either a single quadratic\n curve or a single cubic curve.\n\n Example::\n\n >>> curves_to_quadratic( [\n ... [ (50,50), (100,100), (150,100), (200,50) ],\n ... [ (75,50), (120,100), (150,75), (200,60) ]\n ... ], [1,1] )\n [[(50.0, 50.0), (75.0, 75.0), (125.0, 91.66666666666666), (175.0, 75.0), (200.0, 50.0)], [(75.0, 50.0), (97.5, 75.0), (135.41666666666666, 82.08333333333333), (175.0, 67.5), (200.0, 60.0)]]\n\n The returned splines have \"implied oncurve points\" suitable for use in\n TrueType ``glif`` outlines - i.e. in the first spline returned above,\n the first quadratic segment runs from (50,50) to\n ( (75 + 125)/2 , (120 + 91.666..)/2 ) = (100, 83.333...).\n\n Returns:\n If all_quadratic is True, a list of splines, each spline being a list\n of 2D tuples.\n\n If all_quadratic is False, a list of curves, each curve being a quadratic\n (length 3), or cubic (length 4).\n\n Raises:\n fontTools.cu2qu.Errors.ApproxNotFoundError: if no suitable approximation\n can be found for all curves with the given parameters.\n "; -/* #### Code section: decls ### */ -static PyObject *__pyx_pf_9fontTools_5cu2qu_5cu2qu__split_cubic_into_n_gen(CYTHON_UNUSED PyObject *__pyx_self, __pyx_t_double_complex __pyx_v_p0, __pyx_t_double_complex __pyx_v_p1, __pyx_t_double_complex __pyx_v_p2, __pyx_t_double_complex __pyx_v_p3, int __pyx_v_n); /* proto */ -static PyObject *__pyx_pf_9fontTools_5cu2qu_5cu2qu_3curve_to_quadratic(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_curve, double __pyx_v_max_err, int __pyx_v_all_quadratic); /* proto */ -static PyObject *__pyx_pf_9fontTools_5cu2qu_5cu2qu_5curves_to_quadratic(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_curves, PyObject *__pyx_v_max_errors, int __pyx_v_all_quadratic); /* proto */ -static PyObject *__pyx_tp_new_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ -/* #### Code section: late_includes ### */ -/* #### Code section: module_state ### */ -typedef struct { - PyObject *__pyx_d; - PyObject *__pyx_b; - PyObject *__pyx_cython_runtime; - PyObject *__pyx_empty_tuple; - PyObject *__pyx_empty_bytes; - PyObject *__pyx_empty_unicode; - #ifdef __Pyx_CyFunction_USED - PyTypeObject *__pyx_CyFunctionType; - #endif - #ifdef __Pyx_FusedFunction_USED - PyTypeObject *__pyx_FusedFunctionType; - #endif - #ifdef __Pyx_Generator_USED - PyTypeObject *__pyx_GeneratorType; - #endif - #ifdef __Pyx_IterableCoroutine_USED - PyTypeObject *__pyx_IterableCoroutineType; - #endif - #ifdef __Pyx_Coroutine_USED - PyTypeObject *__pyx_CoroutineAwaitType; - #endif - #ifdef __Pyx_Coroutine_USED - PyTypeObject *__pyx_CoroutineType; - #endif - #if CYTHON_USE_MODULE_STATE - #endif - #if CYTHON_USE_MODULE_STATE - PyObject *__pyx_type_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen; - #endif - PyTypeObject *__pyx_ptype_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen; - PyObject *__pyx_n_s_ApproxNotFoundError; - PyObject *__pyx_n_s_AssertionError; - PyObject *__pyx_n_s_AttributeError; - PyObject *__pyx_n_s_COMPILED; - PyObject *__pyx_n_s_Cu2QuError; - PyObject *__pyx_n_s_Error; - PyObject *__pyx_n_s_ImportError; - PyObject *__pyx_kp_s_Lib_fontTools_cu2qu_cu2qu_py; - PyObject *__pyx_n_s_MAX_N; - PyObject *__pyx_n_s_NAN; - PyObject *__pyx_n_u_NaN; - PyObject *__pyx_kp_u_Return_quadratic_Bezier_splines; - PyObject *__pyx_n_s_ZeroDivisionError; - PyObject *__pyx_kp_u__2; - PyObject *__pyx_n_s__3; - PyObject *__pyx_n_s__9; - PyObject *__pyx_n_s_a; - PyObject *__pyx_n_s_a1; - PyObject *__pyx_n_s_all; - PyObject *__pyx_n_s_all_quadratic; - PyObject *__pyx_n_s_args; - PyObject *__pyx_n_s_asyncio_coroutines; - PyObject *__pyx_n_s_b; - PyObject *__pyx_n_s_b1; - PyObject *__pyx_n_s_c; - PyObject *__pyx_n_s_c1; - PyObject *__pyx_n_s_cline_in_traceback; - PyObject *__pyx_n_s_close; - PyObject *__pyx_n_s_curve; - PyObject *__pyx_n_s_curve_to_quadratic; - PyObject *__pyx_n_u_curve_to_quadratic; - PyObject *__pyx_n_s_curves; - PyObject *__pyx_n_s_curves_to_quadratic; - PyObject *__pyx_n_u_curves_to_quadratic; - PyObject *__pyx_kp_u_curves_to_quadratic_line_474; - PyObject *__pyx_n_s_cython; - PyObject *__pyx_n_s_d; - PyObject *__pyx_n_s_d1; - PyObject *__pyx_n_s_delta_2; - PyObject *__pyx_n_s_delta_3; - PyObject *__pyx_kp_u_disable; - PyObject *__pyx_n_s_dt; - PyObject *__pyx_kp_u_enable; - PyObject *__pyx_n_s_errors; - PyObject *__pyx_n_s_fontTools_cu2qu_cu2qu; - PyObject *__pyx_n_s_fontTools_misc; - PyObject *__pyx_kp_u_gc; - PyObject *__pyx_n_s_i; - PyObject *__pyx_n_s_imag; - PyObject *__pyx_n_s_import; - PyObject *__pyx_n_s_initializing; - PyObject *__pyx_n_s_is_coroutine; - PyObject *__pyx_kp_u_isenabled; - PyObject *__pyx_n_s_isnan; - PyObject *__pyx_n_s_l; - PyObject *__pyx_n_s_last_i; - PyObject *__pyx_n_s_main; - PyObject *__pyx_n_s_math; - PyObject *__pyx_n_s_max_err; - PyObject *__pyx_n_s_max_errors; - PyObject *__pyx_n_s_n; - PyObject *__pyx_n_s_name; - PyObject *__pyx_n_s_p; - PyObject *__pyx_n_s_p0; - PyObject *__pyx_n_s_p1; - PyObject *__pyx_n_s_p2; - PyObject *__pyx_n_s_p3; - PyObject *__pyx_n_s_range; - PyObject *__pyx_n_s_real; - PyObject *__pyx_n_s_s; - PyObject *__pyx_n_s_send; - PyObject *__pyx_n_s_spec; - PyObject *__pyx_n_s_spline; - PyObject *__pyx_n_s_splines; - PyObject *__pyx_n_s_split_cubic_into_n_gen; - PyObject *__pyx_n_s_t1; - PyObject *__pyx_n_s_t1_2; - PyObject *__pyx_n_s_test; - PyObject *__pyx_n_s_throw; - PyObject *__pyx_int_1; - PyObject *__pyx_int_2; - PyObject *__pyx_int_3; - PyObject *__pyx_int_4; - PyObject *__pyx_int_6; - PyObject *__pyx_int_100; - PyObject *__pyx_codeobj_; - PyObject *__pyx_tuple__4; - PyObject *__pyx_tuple__5; - PyObject *__pyx_tuple__7; - PyObject *__pyx_codeobj__6; - PyObject *__pyx_codeobj__8; -} __pyx_mstate; - -#if CYTHON_USE_MODULE_STATE -#ifdef __cplusplus -namespace { - extern struct PyModuleDef __pyx_moduledef; -} /* anonymous namespace */ -#else -static struct PyModuleDef __pyx_moduledef; -#endif - -#define __pyx_mstate(o) ((__pyx_mstate *)__Pyx_PyModule_GetState(o)) - -#define __pyx_mstate_global (__pyx_mstate(PyState_FindModule(&__pyx_moduledef))) - -#define __pyx_m (PyState_FindModule(&__pyx_moduledef)) -#else -static __pyx_mstate __pyx_mstate_global_static = -#ifdef __cplusplus - {}; -#else - {0}; -#endif -static __pyx_mstate *__pyx_mstate_global = &__pyx_mstate_global_static; -#endif -/* #### Code section: module_state_clear ### */ -#if CYTHON_USE_MODULE_STATE -static int __pyx_m_clear(PyObject *m) { - __pyx_mstate *clear_module_state = __pyx_mstate(m); - if (!clear_module_state) return 0; - Py_CLEAR(clear_module_state->__pyx_d); - Py_CLEAR(clear_module_state->__pyx_b); - Py_CLEAR(clear_module_state->__pyx_cython_runtime); - Py_CLEAR(clear_module_state->__pyx_empty_tuple); - Py_CLEAR(clear_module_state->__pyx_empty_bytes); - Py_CLEAR(clear_module_state->__pyx_empty_unicode); - #ifdef __Pyx_CyFunction_USED - Py_CLEAR(clear_module_state->__pyx_CyFunctionType); - #endif - #ifdef __Pyx_FusedFunction_USED - Py_CLEAR(clear_module_state->__pyx_FusedFunctionType); - #endif - Py_CLEAR(clear_module_state->__pyx_ptype_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen); - Py_CLEAR(clear_module_state->__pyx_type_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen); - Py_CLEAR(clear_module_state->__pyx_n_s_ApproxNotFoundError); - Py_CLEAR(clear_module_state->__pyx_n_s_AssertionError); - Py_CLEAR(clear_module_state->__pyx_n_s_AttributeError); - Py_CLEAR(clear_module_state->__pyx_n_s_COMPILED); - Py_CLEAR(clear_module_state->__pyx_n_s_Cu2QuError); - Py_CLEAR(clear_module_state->__pyx_n_s_Error); - Py_CLEAR(clear_module_state->__pyx_n_s_ImportError); - Py_CLEAR(clear_module_state->__pyx_kp_s_Lib_fontTools_cu2qu_cu2qu_py); - Py_CLEAR(clear_module_state->__pyx_n_s_MAX_N); - Py_CLEAR(clear_module_state->__pyx_n_s_NAN); - Py_CLEAR(clear_module_state->__pyx_n_u_NaN); - Py_CLEAR(clear_module_state->__pyx_kp_u_Return_quadratic_Bezier_splines); - Py_CLEAR(clear_module_state->__pyx_n_s_ZeroDivisionError); - Py_CLEAR(clear_module_state->__pyx_kp_u__2); - Py_CLEAR(clear_module_state->__pyx_n_s__3); - Py_CLEAR(clear_module_state->__pyx_n_s__9); - Py_CLEAR(clear_module_state->__pyx_n_s_a); - Py_CLEAR(clear_module_state->__pyx_n_s_a1); - Py_CLEAR(clear_module_state->__pyx_n_s_all); - Py_CLEAR(clear_module_state->__pyx_n_s_all_quadratic); - Py_CLEAR(clear_module_state->__pyx_n_s_args); - Py_CLEAR(clear_module_state->__pyx_n_s_asyncio_coroutines); - Py_CLEAR(clear_module_state->__pyx_n_s_b); - Py_CLEAR(clear_module_state->__pyx_n_s_b1); - Py_CLEAR(clear_module_state->__pyx_n_s_c); - Py_CLEAR(clear_module_state->__pyx_n_s_c1); - Py_CLEAR(clear_module_state->__pyx_n_s_cline_in_traceback); - Py_CLEAR(clear_module_state->__pyx_n_s_close); - Py_CLEAR(clear_module_state->__pyx_n_s_curve); - Py_CLEAR(clear_module_state->__pyx_n_s_curve_to_quadratic); - Py_CLEAR(clear_module_state->__pyx_n_u_curve_to_quadratic); - Py_CLEAR(clear_module_state->__pyx_n_s_curves); - Py_CLEAR(clear_module_state->__pyx_n_s_curves_to_quadratic); - Py_CLEAR(clear_module_state->__pyx_n_u_curves_to_quadratic); - Py_CLEAR(clear_module_state->__pyx_kp_u_curves_to_quadratic_line_474); - Py_CLEAR(clear_module_state->__pyx_n_s_cython); - Py_CLEAR(clear_module_state->__pyx_n_s_d); - Py_CLEAR(clear_module_state->__pyx_n_s_d1); - Py_CLEAR(clear_module_state->__pyx_n_s_delta_2); - Py_CLEAR(clear_module_state->__pyx_n_s_delta_3); - Py_CLEAR(clear_module_state->__pyx_kp_u_disable); - Py_CLEAR(clear_module_state->__pyx_n_s_dt); - Py_CLEAR(clear_module_state->__pyx_kp_u_enable); - Py_CLEAR(clear_module_state->__pyx_n_s_errors); - Py_CLEAR(clear_module_state->__pyx_n_s_fontTools_cu2qu_cu2qu); - Py_CLEAR(clear_module_state->__pyx_n_s_fontTools_misc); - Py_CLEAR(clear_module_state->__pyx_kp_u_gc); - Py_CLEAR(clear_module_state->__pyx_n_s_i); - Py_CLEAR(clear_module_state->__pyx_n_s_imag); - Py_CLEAR(clear_module_state->__pyx_n_s_import); - Py_CLEAR(clear_module_state->__pyx_n_s_initializing); - Py_CLEAR(clear_module_state->__pyx_n_s_is_coroutine); - Py_CLEAR(clear_module_state->__pyx_kp_u_isenabled); - Py_CLEAR(clear_module_state->__pyx_n_s_isnan); - Py_CLEAR(clear_module_state->__pyx_n_s_l); - Py_CLEAR(clear_module_state->__pyx_n_s_last_i); - Py_CLEAR(clear_module_state->__pyx_n_s_main); - Py_CLEAR(clear_module_state->__pyx_n_s_math); - Py_CLEAR(clear_module_state->__pyx_n_s_max_err); - Py_CLEAR(clear_module_state->__pyx_n_s_max_errors); - Py_CLEAR(clear_module_state->__pyx_n_s_n); - Py_CLEAR(clear_module_state->__pyx_n_s_name); - Py_CLEAR(clear_module_state->__pyx_n_s_p); - Py_CLEAR(clear_module_state->__pyx_n_s_p0); - Py_CLEAR(clear_module_state->__pyx_n_s_p1); - Py_CLEAR(clear_module_state->__pyx_n_s_p2); - Py_CLEAR(clear_module_state->__pyx_n_s_p3); - Py_CLEAR(clear_module_state->__pyx_n_s_range); - Py_CLEAR(clear_module_state->__pyx_n_s_real); - Py_CLEAR(clear_module_state->__pyx_n_s_s); - Py_CLEAR(clear_module_state->__pyx_n_s_send); - Py_CLEAR(clear_module_state->__pyx_n_s_spec); - Py_CLEAR(clear_module_state->__pyx_n_s_spline); - Py_CLEAR(clear_module_state->__pyx_n_s_splines); - Py_CLEAR(clear_module_state->__pyx_n_s_split_cubic_into_n_gen); - Py_CLEAR(clear_module_state->__pyx_n_s_t1); - Py_CLEAR(clear_module_state->__pyx_n_s_t1_2); - Py_CLEAR(clear_module_state->__pyx_n_s_test); - Py_CLEAR(clear_module_state->__pyx_n_s_throw); - Py_CLEAR(clear_module_state->__pyx_int_1); - Py_CLEAR(clear_module_state->__pyx_int_2); - Py_CLEAR(clear_module_state->__pyx_int_3); - Py_CLEAR(clear_module_state->__pyx_int_4); - Py_CLEAR(clear_module_state->__pyx_int_6); - Py_CLEAR(clear_module_state->__pyx_int_100); - Py_CLEAR(clear_module_state->__pyx_codeobj_); - Py_CLEAR(clear_module_state->__pyx_tuple__4); - Py_CLEAR(clear_module_state->__pyx_tuple__5); - Py_CLEAR(clear_module_state->__pyx_tuple__7); - Py_CLEAR(clear_module_state->__pyx_codeobj__6); - Py_CLEAR(clear_module_state->__pyx_codeobj__8); - return 0; -} -#endif -/* #### Code section: module_state_traverse ### */ -#if CYTHON_USE_MODULE_STATE -static int __pyx_m_traverse(PyObject *m, visitproc visit, void *arg) { - __pyx_mstate *traverse_module_state = __pyx_mstate(m); - if (!traverse_module_state) return 0; - Py_VISIT(traverse_module_state->__pyx_d); - Py_VISIT(traverse_module_state->__pyx_b); - Py_VISIT(traverse_module_state->__pyx_cython_runtime); - Py_VISIT(traverse_module_state->__pyx_empty_tuple); - Py_VISIT(traverse_module_state->__pyx_empty_bytes); - Py_VISIT(traverse_module_state->__pyx_empty_unicode); - #ifdef __Pyx_CyFunction_USED - Py_VISIT(traverse_module_state->__pyx_CyFunctionType); - #endif - #ifdef __Pyx_FusedFunction_USED - Py_VISIT(traverse_module_state->__pyx_FusedFunctionType); - #endif - Py_VISIT(traverse_module_state->__pyx_ptype_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen); - Py_VISIT(traverse_module_state->__pyx_type_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen); - Py_VISIT(traverse_module_state->__pyx_n_s_ApproxNotFoundError); - Py_VISIT(traverse_module_state->__pyx_n_s_AssertionError); - Py_VISIT(traverse_module_state->__pyx_n_s_AttributeError); - Py_VISIT(traverse_module_state->__pyx_n_s_COMPILED); - Py_VISIT(traverse_module_state->__pyx_n_s_Cu2QuError); - Py_VISIT(traverse_module_state->__pyx_n_s_Error); - Py_VISIT(traverse_module_state->__pyx_n_s_ImportError); - Py_VISIT(traverse_module_state->__pyx_kp_s_Lib_fontTools_cu2qu_cu2qu_py); - Py_VISIT(traverse_module_state->__pyx_n_s_MAX_N); - Py_VISIT(traverse_module_state->__pyx_n_s_NAN); - Py_VISIT(traverse_module_state->__pyx_n_u_NaN); - Py_VISIT(traverse_module_state->__pyx_kp_u_Return_quadratic_Bezier_splines); - Py_VISIT(traverse_module_state->__pyx_n_s_ZeroDivisionError); - Py_VISIT(traverse_module_state->__pyx_kp_u__2); - Py_VISIT(traverse_module_state->__pyx_n_s__3); - Py_VISIT(traverse_module_state->__pyx_n_s__9); - Py_VISIT(traverse_module_state->__pyx_n_s_a); - Py_VISIT(traverse_module_state->__pyx_n_s_a1); - Py_VISIT(traverse_module_state->__pyx_n_s_all); - Py_VISIT(traverse_module_state->__pyx_n_s_all_quadratic); - Py_VISIT(traverse_module_state->__pyx_n_s_args); - Py_VISIT(traverse_module_state->__pyx_n_s_asyncio_coroutines); - Py_VISIT(traverse_module_state->__pyx_n_s_b); - Py_VISIT(traverse_module_state->__pyx_n_s_b1); - Py_VISIT(traverse_module_state->__pyx_n_s_c); - Py_VISIT(traverse_module_state->__pyx_n_s_c1); - Py_VISIT(traverse_module_state->__pyx_n_s_cline_in_traceback); - Py_VISIT(traverse_module_state->__pyx_n_s_close); - Py_VISIT(traverse_module_state->__pyx_n_s_curve); - Py_VISIT(traverse_module_state->__pyx_n_s_curve_to_quadratic); - Py_VISIT(traverse_module_state->__pyx_n_u_curve_to_quadratic); - Py_VISIT(traverse_module_state->__pyx_n_s_curves); - Py_VISIT(traverse_module_state->__pyx_n_s_curves_to_quadratic); - Py_VISIT(traverse_module_state->__pyx_n_u_curves_to_quadratic); - Py_VISIT(traverse_module_state->__pyx_kp_u_curves_to_quadratic_line_474); - Py_VISIT(traverse_module_state->__pyx_n_s_cython); - Py_VISIT(traverse_module_state->__pyx_n_s_d); - Py_VISIT(traverse_module_state->__pyx_n_s_d1); - Py_VISIT(traverse_module_state->__pyx_n_s_delta_2); - Py_VISIT(traverse_module_state->__pyx_n_s_delta_3); - Py_VISIT(traverse_module_state->__pyx_kp_u_disable); - Py_VISIT(traverse_module_state->__pyx_n_s_dt); - Py_VISIT(traverse_module_state->__pyx_kp_u_enable); - Py_VISIT(traverse_module_state->__pyx_n_s_errors); - Py_VISIT(traverse_module_state->__pyx_n_s_fontTools_cu2qu_cu2qu); - Py_VISIT(traverse_module_state->__pyx_n_s_fontTools_misc); - Py_VISIT(traverse_module_state->__pyx_kp_u_gc); - Py_VISIT(traverse_module_state->__pyx_n_s_i); - Py_VISIT(traverse_module_state->__pyx_n_s_imag); - Py_VISIT(traverse_module_state->__pyx_n_s_import); - Py_VISIT(traverse_module_state->__pyx_n_s_initializing); - Py_VISIT(traverse_module_state->__pyx_n_s_is_coroutine); - Py_VISIT(traverse_module_state->__pyx_kp_u_isenabled); - Py_VISIT(traverse_module_state->__pyx_n_s_isnan); - Py_VISIT(traverse_module_state->__pyx_n_s_l); - Py_VISIT(traverse_module_state->__pyx_n_s_last_i); - Py_VISIT(traverse_module_state->__pyx_n_s_main); - Py_VISIT(traverse_module_state->__pyx_n_s_math); - Py_VISIT(traverse_module_state->__pyx_n_s_max_err); - Py_VISIT(traverse_module_state->__pyx_n_s_max_errors); - Py_VISIT(traverse_module_state->__pyx_n_s_n); - Py_VISIT(traverse_module_state->__pyx_n_s_name); - Py_VISIT(traverse_module_state->__pyx_n_s_p); - Py_VISIT(traverse_module_state->__pyx_n_s_p0); - Py_VISIT(traverse_module_state->__pyx_n_s_p1); - Py_VISIT(traverse_module_state->__pyx_n_s_p2); - Py_VISIT(traverse_module_state->__pyx_n_s_p3); - Py_VISIT(traverse_module_state->__pyx_n_s_range); - Py_VISIT(traverse_module_state->__pyx_n_s_real); - Py_VISIT(traverse_module_state->__pyx_n_s_s); - Py_VISIT(traverse_module_state->__pyx_n_s_send); - Py_VISIT(traverse_module_state->__pyx_n_s_spec); - Py_VISIT(traverse_module_state->__pyx_n_s_spline); - Py_VISIT(traverse_module_state->__pyx_n_s_splines); - Py_VISIT(traverse_module_state->__pyx_n_s_split_cubic_into_n_gen); - Py_VISIT(traverse_module_state->__pyx_n_s_t1); - Py_VISIT(traverse_module_state->__pyx_n_s_t1_2); - Py_VISIT(traverse_module_state->__pyx_n_s_test); - Py_VISIT(traverse_module_state->__pyx_n_s_throw); - Py_VISIT(traverse_module_state->__pyx_int_1); - Py_VISIT(traverse_module_state->__pyx_int_2); - Py_VISIT(traverse_module_state->__pyx_int_3); - Py_VISIT(traverse_module_state->__pyx_int_4); - Py_VISIT(traverse_module_state->__pyx_int_6); - Py_VISIT(traverse_module_state->__pyx_int_100); - Py_VISIT(traverse_module_state->__pyx_codeobj_); - Py_VISIT(traverse_module_state->__pyx_tuple__4); - Py_VISIT(traverse_module_state->__pyx_tuple__5); - Py_VISIT(traverse_module_state->__pyx_tuple__7); - Py_VISIT(traverse_module_state->__pyx_codeobj__6); - Py_VISIT(traverse_module_state->__pyx_codeobj__8); - return 0; -} -#endif -/* #### Code section: module_state_defines ### */ -#define __pyx_d __pyx_mstate_global->__pyx_d -#define __pyx_b __pyx_mstate_global->__pyx_b -#define __pyx_cython_runtime __pyx_mstate_global->__pyx_cython_runtime -#define __pyx_empty_tuple __pyx_mstate_global->__pyx_empty_tuple -#define __pyx_empty_bytes __pyx_mstate_global->__pyx_empty_bytes -#define __pyx_empty_unicode __pyx_mstate_global->__pyx_empty_unicode -#ifdef __Pyx_CyFunction_USED -#define __pyx_CyFunctionType __pyx_mstate_global->__pyx_CyFunctionType -#endif -#ifdef __Pyx_FusedFunction_USED -#define __pyx_FusedFunctionType __pyx_mstate_global->__pyx_FusedFunctionType -#endif -#ifdef __Pyx_Generator_USED -#define __pyx_GeneratorType __pyx_mstate_global->__pyx_GeneratorType -#endif -#ifdef __Pyx_IterableCoroutine_USED -#define __pyx_IterableCoroutineType __pyx_mstate_global->__pyx_IterableCoroutineType -#endif -#ifdef __Pyx_Coroutine_USED -#define __pyx_CoroutineAwaitType __pyx_mstate_global->__pyx_CoroutineAwaitType -#endif -#ifdef __Pyx_Coroutine_USED -#define __pyx_CoroutineType __pyx_mstate_global->__pyx_CoroutineType -#endif -#if CYTHON_USE_MODULE_STATE -#endif -#if CYTHON_USE_MODULE_STATE -#define __pyx_type_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen __pyx_mstate_global->__pyx_type_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen -#endif -#define __pyx_ptype_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen __pyx_mstate_global->__pyx_ptype_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen -#define __pyx_n_s_ApproxNotFoundError __pyx_mstate_global->__pyx_n_s_ApproxNotFoundError -#define __pyx_n_s_AssertionError __pyx_mstate_global->__pyx_n_s_AssertionError -#define __pyx_n_s_AttributeError __pyx_mstate_global->__pyx_n_s_AttributeError -#define __pyx_n_s_COMPILED __pyx_mstate_global->__pyx_n_s_COMPILED -#define __pyx_n_s_Cu2QuError __pyx_mstate_global->__pyx_n_s_Cu2QuError -#define __pyx_n_s_Error __pyx_mstate_global->__pyx_n_s_Error -#define __pyx_n_s_ImportError __pyx_mstate_global->__pyx_n_s_ImportError -#define __pyx_kp_s_Lib_fontTools_cu2qu_cu2qu_py __pyx_mstate_global->__pyx_kp_s_Lib_fontTools_cu2qu_cu2qu_py -#define __pyx_n_s_MAX_N __pyx_mstate_global->__pyx_n_s_MAX_N -#define __pyx_n_s_NAN __pyx_mstate_global->__pyx_n_s_NAN -#define __pyx_n_u_NaN __pyx_mstate_global->__pyx_n_u_NaN -#define __pyx_kp_u_Return_quadratic_Bezier_splines __pyx_mstate_global->__pyx_kp_u_Return_quadratic_Bezier_splines -#define __pyx_n_s_ZeroDivisionError __pyx_mstate_global->__pyx_n_s_ZeroDivisionError -#define __pyx_kp_u__2 __pyx_mstate_global->__pyx_kp_u__2 -#define __pyx_n_s__3 __pyx_mstate_global->__pyx_n_s__3 -#define __pyx_n_s__9 __pyx_mstate_global->__pyx_n_s__9 -#define __pyx_n_s_a __pyx_mstate_global->__pyx_n_s_a -#define __pyx_n_s_a1 __pyx_mstate_global->__pyx_n_s_a1 -#define __pyx_n_s_all __pyx_mstate_global->__pyx_n_s_all -#define __pyx_n_s_all_quadratic __pyx_mstate_global->__pyx_n_s_all_quadratic -#define __pyx_n_s_args __pyx_mstate_global->__pyx_n_s_args -#define __pyx_n_s_asyncio_coroutines __pyx_mstate_global->__pyx_n_s_asyncio_coroutines -#define __pyx_n_s_b __pyx_mstate_global->__pyx_n_s_b -#define __pyx_n_s_b1 __pyx_mstate_global->__pyx_n_s_b1 -#define __pyx_n_s_c __pyx_mstate_global->__pyx_n_s_c -#define __pyx_n_s_c1 __pyx_mstate_global->__pyx_n_s_c1 -#define __pyx_n_s_cline_in_traceback __pyx_mstate_global->__pyx_n_s_cline_in_traceback -#define __pyx_n_s_close __pyx_mstate_global->__pyx_n_s_close -#define __pyx_n_s_curve __pyx_mstate_global->__pyx_n_s_curve -#define __pyx_n_s_curve_to_quadratic __pyx_mstate_global->__pyx_n_s_curve_to_quadratic -#define __pyx_n_u_curve_to_quadratic __pyx_mstate_global->__pyx_n_u_curve_to_quadratic -#define __pyx_n_s_curves __pyx_mstate_global->__pyx_n_s_curves -#define __pyx_n_s_curves_to_quadratic __pyx_mstate_global->__pyx_n_s_curves_to_quadratic -#define __pyx_n_u_curves_to_quadratic __pyx_mstate_global->__pyx_n_u_curves_to_quadratic -#define __pyx_kp_u_curves_to_quadratic_line_474 __pyx_mstate_global->__pyx_kp_u_curves_to_quadratic_line_474 -#define __pyx_n_s_cython __pyx_mstate_global->__pyx_n_s_cython -#define __pyx_n_s_d __pyx_mstate_global->__pyx_n_s_d -#define __pyx_n_s_d1 __pyx_mstate_global->__pyx_n_s_d1 -#define __pyx_n_s_delta_2 __pyx_mstate_global->__pyx_n_s_delta_2 -#define __pyx_n_s_delta_3 __pyx_mstate_global->__pyx_n_s_delta_3 -#define __pyx_kp_u_disable __pyx_mstate_global->__pyx_kp_u_disable -#define __pyx_n_s_dt __pyx_mstate_global->__pyx_n_s_dt -#define __pyx_kp_u_enable __pyx_mstate_global->__pyx_kp_u_enable -#define __pyx_n_s_errors __pyx_mstate_global->__pyx_n_s_errors -#define __pyx_n_s_fontTools_cu2qu_cu2qu __pyx_mstate_global->__pyx_n_s_fontTools_cu2qu_cu2qu -#define __pyx_n_s_fontTools_misc __pyx_mstate_global->__pyx_n_s_fontTools_misc -#define __pyx_kp_u_gc __pyx_mstate_global->__pyx_kp_u_gc -#define __pyx_n_s_i __pyx_mstate_global->__pyx_n_s_i -#define __pyx_n_s_imag __pyx_mstate_global->__pyx_n_s_imag -#define __pyx_n_s_import __pyx_mstate_global->__pyx_n_s_import -#define __pyx_n_s_initializing __pyx_mstate_global->__pyx_n_s_initializing -#define __pyx_n_s_is_coroutine __pyx_mstate_global->__pyx_n_s_is_coroutine -#define __pyx_kp_u_isenabled __pyx_mstate_global->__pyx_kp_u_isenabled -#define __pyx_n_s_isnan __pyx_mstate_global->__pyx_n_s_isnan -#define __pyx_n_s_l __pyx_mstate_global->__pyx_n_s_l -#define __pyx_n_s_last_i __pyx_mstate_global->__pyx_n_s_last_i -#define __pyx_n_s_main __pyx_mstate_global->__pyx_n_s_main -#define __pyx_n_s_math __pyx_mstate_global->__pyx_n_s_math -#define __pyx_n_s_max_err __pyx_mstate_global->__pyx_n_s_max_err -#define __pyx_n_s_max_errors __pyx_mstate_global->__pyx_n_s_max_errors -#define __pyx_n_s_n __pyx_mstate_global->__pyx_n_s_n -#define __pyx_n_s_name __pyx_mstate_global->__pyx_n_s_name -#define __pyx_n_s_p __pyx_mstate_global->__pyx_n_s_p -#define __pyx_n_s_p0 __pyx_mstate_global->__pyx_n_s_p0 -#define __pyx_n_s_p1 __pyx_mstate_global->__pyx_n_s_p1 -#define __pyx_n_s_p2 __pyx_mstate_global->__pyx_n_s_p2 -#define __pyx_n_s_p3 __pyx_mstate_global->__pyx_n_s_p3 -#define __pyx_n_s_range __pyx_mstate_global->__pyx_n_s_range -#define __pyx_n_s_real __pyx_mstate_global->__pyx_n_s_real -#define __pyx_n_s_s __pyx_mstate_global->__pyx_n_s_s -#define __pyx_n_s_send __pyx_mstate_global->__pyx_n_s_send -#define __pyx_n_s_spec __pyx_mstate_global->__pyx_n_s_spec -#define __pyx_n_s_spline __pyx_mstate_global->__pyx_n_s_spline -#define __pyx_n_s_splines __pyx_mstate_global->__pyx_n_s_splines -#define __pyx_n_s_split_cubic_into_n_gen __pyx_mstate_global->__pyx_n_s_split_cubic_into_n_gen -#define __pyx_n_s_t1 __pyx_mstate_global->__pyx_n_s_t1 -#define __pyx_n_s_t1_2 __pyx_mstate_global->__pyx_n_s_t1_2 -#define __pyx_n_s_test __pyx_mstate_global->__pyx_n_s_test -#define __pyx_n_s_throw __pyx_mstate_global->__pyx_n_s_throw -#define __pyx_int_1 __pyx_mstate_global->__pyx_int_1 -#define __pyx_int_2 __pyx_mstate_global->__pyx_int_2 -#define __pyx_int_3 __pyx_mstate_global->__pyx_int_3 -#define __pyx_int_4 __pyx_mstate_global->__pyx_int_4 -#define __pyx_int_6 __pyx_mstate_global->__pyx_int_6 -#define __pyx_int_100 __pyx_mstate_global->__pyx_int_100 -#define __pyx_codeobj_ __pyx_mstate_global->__pyx_codeobj_ -#define __pyx_tuple__4 __pyx_mstate_global->__pyx_tuple__4 -#define __pyx_tuple__5 __pyx_mstate_global->__pyx_tuple__5 -#define __pyx_tuple__7 __pyx_mstate_global->__pyx_tuple__7 -#define __pyx_codeobj__6 __pyx_mstate_global->__pyx_codeobj__6 -#define __pyx_codeobj__8 __pyx_mstate_global->__pyx_codeobj__8 -/* #### Code section: module_code ### */ - -/* "fontTools/cu2qu/cu2qu.py":40 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.returns(cython.double) - */ - -static CYTHON_INLINE double __pyx_f_9fontTools_5cu2qu_5cu2qu_dot(__pyx_t_double_complex __pyx_v_v1, __pyx_t_double_complex __pyx_v_v2) { - double __pyx_r; - - /* "fontTools/cu2qu/cu2qu.py":54 - * double: Dot product. - * """ - * return (v1 * v2.conjugate()).real # <<<<<<<<<<<<<< - * - * - */ - __pyx_r = __Pyx_CREAL(__Pyx_c_prod_double(__pyx_v_v1, __Pyx_c_conj_double(__pyx_v_v2))); - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":40 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.returns(cython.double) - */ - - /* function exit code */ - __pyx_L0:; - return __pyx_r; -} - -/* "fontTools/cu2qu/cu2qu.py":57 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.locals(a=cython.complex, b=cython.complex, c=cython.complex, d=cython.complex) - */ - -static CYTHON_INLINE PyObject *__pyx_f_9fontTools_5cu2qu_5cu2qu_calc_cubic_points(__pyx_t_double_complex __pyx_v_a, __pyx_t_double_complex __pyx_v_b, __pyx_t_double_complex __pyx_v_c, __pyx_t_double_complex __pyx_v_d) { - __pyx_t_double_complex __pyx_v__1; - __pyx_t_double_complex __pyx_v__2; - __pyx_t_double_complex __pyx_v__3; - __pyx_t_double_complex __pyx_v__4; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - __pyx_t_double_complex __pyx_t_1; - __pyx_t_double_complex __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("calc_cubic_points", 1); - - /* "fontTools/cu2qu/cu2qu.py":64 - * ) - * def calc_cubic_points(a, b, c, d): - * _1 = d # <<<<<<<<<<<<<< - * _2 = (c / 3.0) + d - * _3 = (b + c) / 3.0 + _2 - */ - __pyx_v__1 = __pyx_v_d; - - /* "fontTools/cu2qu/cu2qu.py":65 - * def calc_cubic_points(a, b, c, d): - * _1 = d - * _2 = (c / 3.0) + d # <<<<<<<<<<<<<< - * _3 = (b + c) / 3.0 + _2 - * _4 = a + d + c + b - */ - __pyx_t_1 = __pyx_t_double_complex_from_parts(3.0, 0); - if (unlikely(__Pyx_c_is_zero_double(__pyx_t_1))) { - PyErr_SetString(PyExc_ZeroDivisionError, "float division"); - __PYX_ERR(0, 65, __pyx_L1_error) - } - __pyx_v__2 = __Pyx_c_sum_double(__Pyx_c_quot_double(__pyx_v_c, __pyx_t_1), __pyx_v_d); - - /* "fontTools/cu2qu/cu2qu.py":66 - * _1 = d - * _2 = (c / 3.0) + d - * _3 = (b + c) / 3.0 + _2 # <<<<<<<<<<<<<< - * _4 = a + d + c + b - * return _1, _2, _3, _4 - */ - __pyx_t_1 = __Pyx_c_sum_double(__pyx_v_b, __pyx_v_c); - __pyx_t_2 = __pyx_t_double_complex_from_parts(3.0, 0); - if (unlikely(__Pyx_c_is_zero_double(__pyx_t_2))) { - PyErr_SetString(PyExc_ZeroDivisionError, "float division"); - __PYX_ERR(0, 66, __pyx_L1_error) - } - __pyx_v__3 = __Pyx_c_sum_double(__Pyx_c_quot_double(__pyx_t_1, __pyx_t_2), __pyx_v__2); - - /* "fontTools/cu2qu/cu2qu.py":67 - * _2 = (c / 3.0) + d - * _3 = (b + c) / 3.0 + _2 - * _4 = a + d + c + b # <<<<<<<<<<<<<< - * return _1, _2, _3, _4 - * - */ - __pyx_v__4 = __Pyx_c_sum_double(__Pyx_c_sum_double(__Pyx_c_sum_double(__pyx_v_a, __pyx_v_d), __pyx_v_c), __pyx_v_b); - - /* "fontTools/cu2qu/cu2qu.py":68 - * _3 = (b + c) / 3.0 + _2 - * _4 = a + d + c + b - * return _1, _2, _3, _4 # <<<<<<<<<<<<<< - * - * - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = __pyx_PyComplex_FromComplex(__pyx_v__1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 68, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __pyx_PyComplex_FromComplex(__pyx_v__2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 68, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __pyx_PyComplex_FromComplex(__pyx_v__3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 68, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = __pyx_PyComplex_FromComplex(__pyx_v__4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 68, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = PyTuple_New(4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 68, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_GIVEREF(__pyx_t_3); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_3)) __PYX_ERR(0, 68, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_4); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_4)) __PYX_ERR(0, 68, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_5); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_5)) __PYX_ERR(0, 68, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_6); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_t_6)) __PYX_ERR(0, 68, __pyx_L1_error); - __pyx_t_3 = 0; - __pyx_t_4 = 0; - __pyx_t_5 = 0; - __pyx_t_6 = 0; - __pyx_r = __pyx_t_7; - __pyx_t_7 = 0; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":57 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.locals(a=cython.complex, b=cython.complex, c=cython.complex, d=cython.complex) - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_AddTraceback("fontTools.cu2qu.cu2qu.calc_cubic_points", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "fontTools/cu2qu/cu2qu.py":71 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.locals( - */ - -static CYTHON_INLINE PyObject *__pyx_f_9fontTools_5cu2qu_5cu2qu_calc_cubic_parameters(__pyx_t_double_complex __pyx_v_p0, __pyx_t_double_complex __pyx_v_p1, __pyx_t_double_complex __pyx_v_p2, __pyx_t_double_complex __pyx_v_p3) { - __pyx_t_double_complex __pyx_v_a; - __pyx_t_double_complex __pyx_v_b; - __pyx_t_double_complex __pyx_v_c; - __pyx_t_double_complex __pyx_v_d; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("calc_cubic_parameters", 1); - - /* "fontTools/cu2qu/cu2qu.py":78 - * @cython.locals(a=cython.complex, b=cython.complex, c=cython.complex, d=cython.complex) - * def calc_cubic_parameters(p0, p1, p2, p3): - * c = (p1 - p0) * 3.0 # <<<<<<<<<<<<<< - * b = (p2 - p1) * 3.0 - c - * d = p0 - */ - __pyx_v_c = __Pyx_c_prod_double(__Pyx_c_diff_double(__pyx_v_p1, __pyx_v_p0), __pyx_t_double_complex_from_parts(3.0, 0)); - - /* "fontTools/cu2qu/cu2qu.py":79 - * def calc_cubic_parameters(p0, p1, p2, p3): - * c = (p1 - p0) * 3.0 - * b = (p2 - p1) * 3.0 - c # <<<<<<<<<<<<<< - * d = p0 - * a = p3 - d - c - b - */ - __pyx_v_b = __Pyx_c_diff_double(__Pyx_c_prod_double(__Pyx_c_diff_double(__pyx_v_p2, __pyx_v_p1), __pyx_t_double_complex_from_parts(3.0, 0)), __pyx_v_c); - - /* "fontTools/cu2qu/cu2qu.py":80 - * c = (p1 - p0) * 3.0 - * b = (p2 - p1) * 3.0 - c - * d = p0 # <<<<<<<<<<<<<< - * a = p3 - d - c - b - * return a, b, c, d - */ - __pyx_v_d = __pyx_v_p0; - - /* "fontTools/cu2qu/cu2qu.py":81 - * b = (p2 - p1) * 3.0 - c - * d = p0 - * a = p3 - d - c - b # <<<<<<<<<<<<<< - * return a, b, c, d - * - */ - __pyx_v_a = __Pyx_c_diff_double(__Pyx_c_diff_double(__Pyx_c_diff_double(__pyx_v_p3, __pyx_v_d), __pyx_v_c), __pyx_v_b); - - /* "fontTools/cu2qu/cu2qu.py":82 - * d = p0 - * a = p3 - d - c - b - * return a, b, c, d # <<<<<<<<<<<<<< - * - * - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __pyx_PyComplex_FromComplex(__pyx_v_a); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 82, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __pyx_PyComplex_FromComplex(__pyx_v_b); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 82, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = __pyx_PyComplex_FromComplex(__pyx_v_c); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 82, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __pyx_PyComplex_FromComplex(__pyx_v_d); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 82, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = PyTuple_New(4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 82, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_GIVEREF(__pyx_t_1); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1)) __PYX_ERR(0, 82, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_2); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_2)) __PYX_ERR(0, 82, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_3); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_3)) __PYX_ERR(0, 82, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_4); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_4)) __PYX_ERR(0, 82, __pyx_L1_error); - __pyx_t_1 = 0; - __pyx_t_2 = 0; - __pyx_t_3 = 0; - __pyx_t_4 = 0; - __pyx_r = __pyx_t_5; - __pyx_t_5 = 0; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":71 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.locals( - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_AddTraceback("fontTools.cu2qu.cu2qu.calc_cubic_parameters", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "fontTools/cu2qu/cu2qu.py":85 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.locals( - */ - -static CYTHON_INLINE PyObject *__pyx_f_9fontTools_5cu2qu_5cu2qu_split_cubic_into_n_iter(__pyx_t_double_complex __pyx_v_p0, __pyx_t_double_complex __pyx_v_p1, __pyx_t_double_complex __pyx_v_p2, __pyx_t_double_complex __pyx_v_p3, PyObject *__pyx_v_n) { - PyObject *__pyx_v_a = NULL; - PyObject *__pyx_v_b = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *(*__pyx_t_6)(PyObject *); - __pyx_t_double_complex __pyx_t_7; - __pyx_t_double_complex __pyx_t_8; - __pyx_t_double_complex __pyx_t_9; - __pyx_t_double_complex __pyx_t_10; - PyObject *__pyx_t_11 = NULL; - PyObject *__pyx_t_12 = NULL; - PyObject *__pyx_t_13 = NULL; - int __pyx_t_14; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("split_cubic_into_n_iter", 1); - - /* "fontTools/cu2qu/cu2qu.py":107 - * """ - * # Hand-coded special-cases - * if n == 2: # <<<<<<<<<<<<<< - * return iter(split_cubic_into_two(p0, p1, p2, p3)) - * if n == 3: - */ - __pyx_t_1 = (__Pyx_PyInt_BoolEqObjC(__pyx_v_n, __pyx_int_2, 2, 0)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 107, __pyx_L1_error) - if (__pyx_t_1) { - - /* "fontTools/cu2qu/cu2qu.py":108 - * # Hand-coded special-cases - * if n == 2: - * return iter(split_cubic_into_two(p0, p1, p2, p3)) # <<<<<<<<<<<<<< - * if n == 3: - * return iter(split_cubic_into_three(p0, p1, p2, p3)) - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __pyx_f_9fontTools_5cu2qu_5cu2qu_split_cubic_into_two(__pyx_v_p0, __pyx_v_p1, __pyx_v_p2, __pyx_v_p3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 108, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 108, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_r = __pyx_t_3; - __pyx_t_3 = 0; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":107 - * """ - * # Hand-coded special-cases - * if n == 2: # <<<<<<<<<<<<<< - * return iter(split_cubic_into_two(p0, p1, p2, p3)) - * if n == 3: - */ - } - - /* "fontTools/cu2qu/cu2qu.py":109 - * if n == 2: - * return iter(split_cubic_into_two(p0, p1, p2, p3)) - * if n == 3: # <<<<<<<<<<<<<< - * return iter(split_cubic_into_three(p0, p1, p2, p3)) - * if n == 4: - */ - __pyx_t_1 = (__Pyx_PyInt_BoolEqObjC(__pyx_v_n, __pyx_int_3, 3, 0)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 109, __pyx_L1_error) - if (__pyx_t_1) { - - /* "fontTools/cu2qu/cu2qu.py":110 - * return iter(split_cubic_into_two(p0, p1, p2, p3)) - * if n == 3: - * return iter(split_cubic_into_three(p0, p1, p2, p3)) # <<<<<<<<<<<<<< - * if n == 4: - * a, b = split_cubic_into_two(p0, p1, p2, p3) - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_3 = __pyx_f_9fontTools_5cu2qu_5cu2qu_split_cubic_into_three(__pyx_v_p0, __pyx_v_p1, __pyx_v_p2, __pyx_v_p3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 110, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 110, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":109 - * if n == 2: - * return iter(split_cubic_into_two(p0, p1, p2, p3)) - * if n == 3: # <<<<<<<<<<<<<< - * return iter(split_cubic_into_three(p0, p1, p2, p3)) - * if n == 4: - */ - } - - /* "fontTools/cu2qu/cu2qu.py":111 - * if n == 3: - * return iter(split_cubic_into_three(p0, p1, p2, p3)) - * if n == 4: # <<<<<<<<<<<<<< - * a, b = split_cubic_into_two(p0, p1, p2, p3) - * return iter( - */ - __pyx_t_1 = (__Pyx_PyInt_BoolEqObjC(__pyx_v_n, __pyx_int_4, 4, 0)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 111, __pyx_L1_error) - if (__pyx_t_1) { - - /* "fontTools/cu2qu/cu2qu.py":112 - * return iter(split_cubic_into_three(p0, p1, p2, p3)) - * if n == 4: - * a, b = split_cubic_into_two(p0, p1, p2, p3) # <<<<<<<<<<<<<< - * return iter( - * split_cubic_into_two(a[0], a[1], a[2], a[3]) - */ - __pyx_t_2 = __pyx_f_9fontTools_5cu2qu_5cu2qu_split_cubic_into_two(__pyx_v_p0, __pyx_v_p1, __pyx_v_p2, __pyx_v_p3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 112, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) { - PyObject* sequence = __pyx_t_2; - Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); - if (unlikely(size != 2)) { - if (size > 2) __Pyx_RaiseTooManyValuesError(2); - else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(0, 112, __pyx_L1_error) - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - if (likely(PyTuple_CheckExact(sequence))) { - __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); - } else { - __pyx_t_3 = PyList_GET_ITEM(sequence, 0); - __pyx_t_4 = PyList_GET_ITEM(sequence, 1); - } - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(__pyx_t_4); - #else - __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 112, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 112, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - #endif - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - } else { - Py_ssize_t index = -1; - __pyx_t_5 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 112, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_6 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_5); - index = 0; __pyx_t_3 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_3)) goto __pyx_L6_unpacking_failed; - __Pyx_GOTREF(__pyx_t_3); - index = 1; __pyx_t_4 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_4)) goto __pyx_L6_unpacking_failed; - __Pyx_GOTREF(__pyx_t_4); - if (__Pyx_IternextUnpackEndCheck(__pyx_t_6(__pyx_t_5), 2) < 0) __PYX_ERR(0, 112, __pyx_L1_error) - __pyx_t_6 = NULL; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - goto __pyx_L7_unpacking_done; - __pyx_L6_unpacking_failed:; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_6 = NULL; - if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); - __PYX_ERR(0, 112, __pyx_L1_error) - __pyx_L7_unpacking_done:; - } - __pyx_v_a = __pyx_t_3; - __pyx_t_3 = 0; - __pyx_v_b = __pyx_t_4; - __pyx_t_4 = 0; - - /* "fontTools/cu2qu/cu2qu.py":113 - * if n == 4: - * a, b = split_cubic_into_two(p0, p1, p2, p3) - * return iter( # <<<<<<<<<<<<<< - * split_cubic_into_two(a[0], a[1], a[2], a[3]) - * + split_cubic_into_two(b[0], b[1], b[2], b[3]) - */ - __Pyx_XDECREF(__pyx_r); - - /* "fontTools/cu2qu/cu2qu.py":114 - * a, b = split_cubic_into_two(p0, p1, p2, p3) - * return iter( - * split_cubic_into_two(a[0], a[1], a[2], a[3]) # <<<<<<<<<<<<<< - * + split_cubic_into_two(b[0], b[1], b[2], b[3]) - * ) - */ - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_a, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 114, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_7 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 114, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_a, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 114, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_8 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 114, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_a, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 114, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_9 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 114, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_a, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 114, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_10 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 114, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __pyx_f_9fontTools_5cu2qu_5cu2qu_split_cubic_into_two(__pyx_t_7, __pyx_t_8, __pyx_t_9, __pyx_t_10); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 114, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - - /* "fontTools/cu2qu/cu2qu.py":115 - * return iter( - * split_cubic_into_two(a[0], a[1], a[2], a[3]) - * + split_cubic_into_two(b[0], b[1], b[2], b[3]) # <<<<<<<<<<<<<< - * ) - * if n == 6: - */ - __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_b, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 115, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_10 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_4); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 115, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_b, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 115, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_9 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_4); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 115, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_b, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 115, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_8 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_4); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 115, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_b, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 115, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_7 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_4); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 115, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __pyx_f_9fontTools_5cu2qu_5cu2qu_split_cubic_into_two(__pyx_t_10, __pyx_t_9, __pyx_t_8, __pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 115, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_3 = PyNumber_Add(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 115, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - - /* "fontTools/cu2qu/cu2qu.py":113 - * if n == 4: - * a, b = split_cubic_into_two(p0, p1, p2, p3) - * return iter( # <<<<<<<<<<<<<< - * split_cubic_into_two(a[0], a[1], a[2], a[3]) - * + split_cubic_into_two(b[0], b[1], b[2], b[3]) - */ - __pyx_t_4 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 113, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_r = __pyx_t_4; - __pyx_t_4 = 0; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":111 - * if n == 3: - * return iter(split_cubic_into_three(p0, p1, p2, p3)) - * if n == 4: # <<<<<<<<<<<<<< - * a, b = split_cubic_into_two(p0, p1, p2, p3) - * return iter( - */ - } - - /* "fontTools/cu2qu/cu2qu.py":117 - * + split_cubic_into_two(b[0], b[1], b[2], b[3]) - * ) - * if n == 6: # <<<<<<<<<<<<<< - * a, b = split_cubic_into_two(p0, p1, p2, p3) - * return iter( - */ - __pyx_t_1 = (__Pyx_PyInt_BoolEqObjC(__pyx_v_n, __pyx_int_6, 6, 0)); if (unlikely((__pyx_t_1 < 0))) __PYX_ERR(0, 117, __pyx_L1_error) - if (__pyx_t_1) { - - /* "fontTools/cu2qu/cu2qu.py":118 - * ) - * if n == 6: - * a, b = split_cubic_into_two(p0, p1, p2, p3) # <<<<<<<<<<<<<< - * return iter( - * split_cubic_into_three(a[0], a[1], a[2], a[3]) - */ - __pyx_t_4 = __pyx_f_9fontTools_5cu2qu_5cu2qu_split_cubic_into_two(__pyx_v_p0, __pyx_v_p1, __pyx_v_p2, __pyx_v_p3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 118, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) { - PyObject* sequence = __pyx_t_4; - Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); - if (unlikely(size != 2)) { - if (size > 2) __Pyx_RaiseTooManyValuesError(2); - else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(0, 118, __pyx_L1_error) - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - if (likely(PyTuple_CheckExact(sequence))) { - __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); - } else { - __pyx_t_3 = PyList_GET_ITEM(sequence, 0); - __pyx_t_2 = PyList_GET_ITEM(sequence, 1); - } - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(__pyx_t_2); - #else - __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 118, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - #endif - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - } else { - Py_ssize_t index = -1; - __pyx_t_5 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 118, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_6 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_5); - index = 0; __pyx_t_3 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_3)) goto __pyx_L9_unpacking_failed; - __Pyx_GOTREF(__pyx_t_3); - index = 1; __pyx_t_2 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_2)) goto __pyx_L9_unpacking_failed; - __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_IternextUnpackEndCheck(__pyx_t_6(__pyx_t_5), 2) < 0) __PYX_ERR(0, 118, __pyx_L1_error) - __pyx_t_6 = NULL; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - goto __pyx_L10_unpacking_done; - __pyx_L9_unpacking_failed:; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_t_6 = NULL; - if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); - __PYX_ERR(0, 118, __pyx_L1_error) - __pyx_L10_unpacking_done:; - } - __pyx_v_a = __pyx_t_3; - __pyx_t_3 = 0; - __pyx_v_b = __pyx_t_2; - __pyx_t_2 = 0; - - /* "fontTools/cu2qu/cu2qu.py":119 - * if n == 6: - * a, b = split_cubic_into_two(p0, p1, p2, p3) - * return iter( # <<<<<<<<<<<<<< - * split_cubic_into_three(a[0], a[1], a[2], a[3]) - * + split_cubic_into_three(b[0], b[1], b[2], b[3]) - */ - __Pyx_XDECREF(__pyx_r); - - /* "fontTools/cu2qu/cu2qu.py":120 - * a, b = split_cubic_into_two(p0, p1, p2, p3) - * return iter( - * split_cubic_into_three(a[0], a[1], a[2], a[3]) # <<<<<<<<<<<<<< - * + split_cubic_into_three(b[0], b[1], b[2], b[3]) - * ) - */ - __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_a, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 120, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_7 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_4); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 120, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_a, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 120, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_8 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_4); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 120, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_a, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 120, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_9 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_4); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 120, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_a, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 120, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_10 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_4); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 120, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_4 = __pyx_f_9fontTools_5cu2qu_5cu2qu_split_cubic_into_three(__pyx_t_7, __pyx_t_8, __pyx_t_9, __pyx_t_10); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 120, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - - /* "fontTools/cu2qu/cu2qu.py":121 - * return iter( - * split_cubic_into_three(a[0], a[1], a[2], a[3]) - * + split_cubic_into_three(b[0], b[1], b[2], b[3]) # <<<<<<<<<<<<<< - * ) - * - */ - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_b, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_10 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_b, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_9 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_b, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_8 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_b, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_7 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __pyx_f_9fontTools_5cu2qu_5cu2qu_split_cubic_into_three(__pyx_t_10, __pyx_t_9, __pyx_t_8, __pyx_t_7); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = PyNumber_Add(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 121, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - - /* "fontTools/cu2qu/cu2qu.py":119 - * if n == 6: - * a, b = split_cubic_into_two(p0, p1, p2, p3) - * return iter( # <<<<<<<<<<<<<< - * split_cubic_into_three(a[0], a[1], a[2], a[3]) - * + split_cubic_into_three(b[0], b[1], b[2], b[3]) - */ - __pyx_t_2 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 119, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":117 - * + split_cubic_into_two(b[0], b[1], b[2], b[3]) - * ) - * if n == 6: # <<<<<<<<<<<<<< - * a, b = split_cubic_into_two(p0, p1, p2, p3) - * return iter( - */ - } - - /* "fontTools/cu2qu/cu2qu.py":124 - * ) - * - * return _split_cubic_into_n_gen(p0, p1, p2, p3, n) # <<<<<<<<<<<<<< - * - * - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_split_cubic_into_n_gen); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 124, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_4 = __pyx_PyComplex_FromComplex(__pyx_v_p0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 124, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __pyx_PyComplex_FromComplex(__pyx_v_p1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 124, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_11 = __pyx_PyComplex_FromComplex(__pyx_v_p2); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 124, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_11); - __pyx_t_12 = __pyx_PyComplex_FromComplex(__pyx_v_p3); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 124, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_12); - __pyx_t_13 = NULL; - __pyx_t_14 = 0; - #if CYTHON_UNPACK_METHODS - if (unlikely(PyMethod_Check(__pyx_t_3))) { - __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_3); - if (likely(__pyx_t_13)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); - __Pyx_INCREF(__pyx_t_13); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_3, function); - __pyx_t_14 = 1; - } - } - #endif - { - PyObject *__pyx_callargs[6] = {__pyx_t_13, __pyx_t_4, __pyx_t_5, __pyx_t_11, __pyx_t_12, __pyx_v_n}; - __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_14, 5+__pyx_t_14); - __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 124, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - } - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":85 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.locals( - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_11); - __Pyx_XDECREF(__pyx_t_12); - __Pyx_XDECREF(__pyx_t_13); - __Pyx_AddTraceback("fontTools.cu2qu.cu2qu.split_cubic_into_n_iter", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_a); - __Pyx_XDECREF(__pyx_v_b); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} -static PyObject *__pyx_gb_9fontTools_5cu2qu_5cu2qu_2generator(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */ - -/* "fontTools/cu2qu/cu2qu.py":127 - * - * - * @cython.locals( # <<<<<<<<<<<<<< - * p0=cython.complex, - * p1=cython.complex, - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_9fontTools_5cu2qu_5cu2qu_1_split_cubic_into_n_gen(PyObject *__pyx_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_9fontTools_5cu2qu_5cu2qu__split_cubic_into_n_gen, "_split_cubic_into_n_gen(double complex p0, double complex p1, double complex p2, double complex p3, int n)"); -static PyMethodDef __pyx_mdef_9fontTools_5cu2qu_5cu2qu_1_split_cubic_into_n_gen = {"_split_cubic_into_n_gen", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_9fontTools_5cu2qu_5cu2qu_1_split_cubic_into_n_gen, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_9fontTools_5cu2qu_5cu2qu__split_cubic_into_n_gen}; -static PyObject *__pyx_pw_9fontTools_5cu2qu_5cu2qu_1_split_cubic_into_n_gen(PyObject *__pyx_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - __pyx_t_double_complex __pyx_v_p0; - __pyx_t_double_complex __pyx_v_p1; - __pyx_t_double_complex __pyx_v_p2; - __pyx_t_double_complex __pyx_v_p3; - int __pyx_v_n; - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject* values[5] = {0,0,0,0,0}; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("_split_cubic_into_n_gen (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - { - PyObject **__pyx_pyargnames[] = {&__pyx_n_s_p0,&__pyx_n_s_p1,&__pyx_n_s_p2,&__pyx_n_s_p3,&__pyx_n_s_n,0}; - if (__pyx_kwds) { - Py_ssize_t kw_args; - switch (__pyx_nargs) { - case 5: values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); - CYTHON_FALLTHROUGH; - case 4: values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); - CYTHON_FALLTHROUGH; - case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); - switch (__pyx_nargs) { - case 0: - if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_p0)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 127, __pyx_L3_error) - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_p1)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 127, __pyx_L3_error) - else { - __Pyx_RaiseArgtupleInvalid("_split_cubic_into_n_gen", 1, 5, 5, 1); __PYX_ERR(0, 127, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (likely((values[2] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_p2)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[2]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 127, __pyx_L3_error) - else { - __Pyx_RaiseArgtupleInvalid("_split_cubic_into_n_gen", 1, 5, 5, 2); __PYX_ERR(0, 127, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 3: - if (likely((values[3] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_p3)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[3]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 127, __pyx_L3_error) - else { - __Pyx_RaiseArgtupleInvalid("_split_cubic_into_n_gen", 1, 5, 5, 3); __PYX_ERR(0, 127, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 4: - if (likely((values[4] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_n)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[4]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 127, __pyx_L3_error) - else { - __Pyx_RaiseArgtupleInvalid("_split_cubic_into_n_gen", 1, 5, 5, 4); __PYX_ERR(0, 127, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "_split_cubic_into_n_gen") < 0)) __PYX_ERR(0, 127, __pyx_L3_error) - } - } else if (unlikely(__pyx_nargs != 5)) { - goto __pyx_L5_argtuple_error; - } else { - values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); - values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); - values[3] = __Pyx_Arg_FASTCALL(__pyx_args, 3); - values[4] = __Pyx_Arg_FASTCALL(__pyx_args, 4); - } - __pyx_v_p0 = __Pyx_PyComplex_As___pyx_t_double_complex(values[0]); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 141, __pyx_L3_error) - __pyx_v_p1 = __Pyx_PyComplex_As___pyx_t_double_complex(values[1]); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 141, __pyx_L3_error) - __pyx_v_p2 = __Pyx_PyComplex_As___pyx_t_double_complex(values[2]); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 141, __pyx_L3_error) - __pyx_v_p3 = __Pyx_PyComplex_As___pyx_t_double_complex(values[3]); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 141, __pyx_L3_error) - __pyx_v_n = __Pyx_PyInt_As_int(values[4]); if (unlikely((__pyx_v_n == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 141, __pyx_L3_error) - } - goto __pyx_L6_skip; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("_split_cubic_into_n_gen", 1, 5, 5, __pyx_nargs); __PYX_ERR(0, 127, __pyx_L3_error) - __pyx_L6_skip:; - goto __pyx_L4_argument_unpacking_done; - __pyx_L3_error:; - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_AddTraceback("fontTools.cu2qu.cu2qu._split_cubic_into_n_gen", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_9fontTools_5cu2qu_5cu2qu__split_cubic_into_n_gen(__pyx_self, __pyx_v_p0, __pyx_v_p1, __pyx_v_p2, __pyx_v_p3, __pyx_v_n); - - /* function exit code */ - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_9fontTools_5cu2qu_5cu2qu__split_cubic_into_n_gen(CYTHON_UNUSED PyObject *__pyx_self, __pyx_t_double_complex __pyx_v_p0, __pyx_t_double_complex __pyx_v_p1, __pyx_t_double_complex __pyx_v_p2, __pyx_t_double_complex __pyx_v_p3, int __pyx_v_n) { - struct __pyx_obj_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen *__pyx_cur_scope; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("_split_cubic_into_n_gen", 0); - __pyx_cur_scope = (struct __pyx_obj_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen *)__pyx_tp_new_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen(__pyx_ptype_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen, __pyx_empty_tuple, NULL); - if (unlikely(!__pyx_cur_scope)) { - __pyx_cur_scope = ((struct __pyx_obj_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen *)Py_None); - __Pyx_INCREF(Py_None); - __PYX_ERR(0, 127, __pyx_L1_error) - } else { - __Pyx_GOTREF((PyObject *)__pyx_cur_scope); - } - __pyx_cur_scope->__pyx_v_p0 = __pyx_v_p0; - __pyx_cur_scope->__pyx_v_p1 = __pyx_v_p1; - __pyx_cur_scope->__pyx_v_p2 = __pyx_v_p2; - __pyx_cur_scope->__pyx_v_p3 = __pyx_v_p3; - __pyx_cur_scope->__pyx_v_n = __pyx_v_n; - { - __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_9fontTools_5cu2qu_5cu2qu_2generator, __pyx_codeobj_, (PyObject *) __pyx_cur_scope, __pyx_n_s_split_cubic_into_n_gen, __pyx_n_s_split_cubic_into_n_gen, __pyx_n_s_fontTools_cu2qu_cu2qu); if (unlikely(!gen)) __PYX_ERR(0, 127, __pyx_L1_error) - __Pyx_DECREF(__pyx_cur_scope); - __Pyx_RefNannyFinishContext(); - return (PyObject *) gen; - } - - /* function exit code */ - __pyx_L1_error:; - __Pyx_AddTraceback("fontTools.cu2qu.cu2qu._split_cubic_into_n_gen", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __Pyx_DECREF((PyObject *)__pyx_cur_scope); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_gb_9fontTools_5cu2qu_5cu2qu_2generator(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */ -{ - struct __pyx_obj_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen *__pyx_cur_scope = ((struct __pyx_obj_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen *)__pyx_generator->closure); - PyObject *__pyx_r = NULL; - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *(*__pyx_t_7)(PyObject *); - __pyx_t_double_complex __pyx_t_8; - __pyx_t_double_complex __pyx_t_9; - __pyx_t_double_complex __pyx_t_10; - __pyx_t_double_complex __pyx_t_11; - int __pyx_t_12; - int __pyx_t_13; - int __pyx_t_14; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("_split_cubic_into_n_gen", 0); - switch (__pyx_generator->resume_label) { - case 0: goto __pyx_L3_first_run; - case 1: goto __pyx_L8_resume_from_yield; - default: /* CPython raises the right error here */ - __Pyx_RefNannyFinishContext(); - return NULL; - } - __pyx_L3_first_run:; - if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 127, __pyx_L1_error) - - /* "fontTools/cu2qu/cu2qu.py":142 - * ) - * def _split_cubic_into_n_gen(p0, p1, p2, p3, n): - * a, b, c, d = calc_cubic_parameters(p0, p1, p2, p3) # <<<<<<<<<<<<<< - * dt = 1 / n - * delta_2 = dt * dt - */ - __pyx_t_1 = __pyx_f_9fontTools_5cu2qu_5cu2qu_calc_cubic_parameters(__pyx_cur_scope->__pyx_v_p0, __pyx_cur_scope->__pyx_v_p1, __pyx_cur_scope->__pyx_v_p2, __pyx_cur_scope->__pyx_v_p3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 142, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) { - PyObject* sequence = __pyx_t_1; - Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); - if (unlikely(size != 4)) { - if (size > 4) __Pyx_RaiseTooManyValuesError(4); - else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(0, 142, __pyx_L1_error) - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - if (likely(PyTuple_CheckExact(sequence))) { - __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); - __pyx_t_4 = PyTuple_GET_ITEM(sequence, 2); - __pyx_t_5 = PyTuple_GET_ITEM(sequence, 3); - } else { - __pyx_t_2 = PyList_GET_ITEM(sequence, 0); - __pyx_t_3 = PyList_GET_ITEM(sequence, 1); - __pyx_t_4 = PyList_GET_ITEM(sequence, 2); - __pyx_t_5 = PyList_GET_ITEM(sequence, 3); - } - __Pyx_INCREF(__pyx_t_2); - __Pyx_INCREF(__pyx_t_3); - __Pyx_INCREF(__pyx_t_4); - __Pyx_INCREF(__pyx_t_5); - #else - { - Py_ssize_t i; - PyObject** temps[4] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5}; - for (i=0; i < 4; i++) { - PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) __PYX_ERR(0, 142, __pyx_L1_error) - __Pyx_GOTREF(item); - *(temps[i]) = item; - } - } - #endif - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - } else { - Py_ssize_t index = -1; - PyObject** temps[4] = {&__pyx_t_2,&__pyx_t_3,&__pyx_t_4,&__pyx_t_5}; - __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 142, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_7 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_6); - for (index=0; index < 4; index++) { - PyObject* item = __pyx_t_7(__pyx_t_6); if (unlikely(!item)) goto __pyx_L4_unpacking_failed; - __Pyx_GOTREF(item); - *(temps[index]) = item; - } - if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 4) < 0) __PYX_ERR(0, 142, __pyx_L1_error) - __pyx_t_7 = NULL; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - goto __pyx_L5_unpacking_done; - __pyx_L4_unpacking_failed:; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __pyx_t_7 = NULL; - if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); - __PYX_ERR(0, 142, __pyx_L1_error) - __pyx_L5_unpacking_done:; - } - __pyx_t_8 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 142, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_9 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_3); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 142, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - __pyx_t_10 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_4); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 142, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; - __pyx_t_11 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_5); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 142, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - __pyx_cur_scope->__pyx_v_a = __pyx_t_8; - __pyx_cur_scope->__pyx_v_b = __pyx_t_9; - __pyx_cur_scope->__pyx_v_c = __pyx_t_10; - __pyx_cur_scope->__pyx_v_d = __pyx_t_11; - - /* "fontTools/cu2qu/cu2qu.py":143 - * def _split_cubic_into_n_gen(p0, p1, p2, p3, n): - * a, b, c, d = calc_cubic_parameters(p0, p1, p2, p3) - * dt = 1 / n # <<<<<<<<<<<<<< - * delta_2 = dt * dt - * delta_3 = dt * delta_2 - */ - if (unlikely(__pyx_cur_scope->__pyx_v_n == 0)) { - PyErr_SetString(PyExc_ZeroDivisionError, "float division"); - __PYX_ERR(0, 143, __pyx_L1_error) - } - __pyx_cur_scope->__pyx_v_dt = (1.0 / ((double)__pyx_cur_scope->__pyx_v_n)); - - /* "fontTools/cu2qu/cu2qu.py":144 - * a, b, c, d = calc_cubic_parameters(p0, p1, p2, p3) - * dt = 1 / n - * delta_2 = dt * dt # <<<<<<<<<<<<<< - * delta_3 = dt * delta_2 - * for i in range(n): - */ - __pyx_cur_scope->__pyx_v_delta_2 = (__pyx_cur_scope->__pyx_v_dt * __pyx_cur_scope->__pyx_v_dt); - - /* "fontTools/cu2qu/cu2qu.py":145 - * dt = 1 / n - * delta_2 = dt * dt - * delta_3 = dt * delta_2 # <<<<<<<<<<<<<< - * for i in range(n): - * t1 = i * dt - */ - __pyx_cur_scope->__pyx_v_delta_3 = (__pyx_cur_scope->__pyx_v_dt * __pyx_cur_scope->__pyx_v_delta_2); - - /* "fontTools/cu2qu/cu2qu.py":146 - * delta_2 = dt * dt - * delta_3 = dt * delta_2 - * for i in range(n): # <<<<<<<<<<<<<< - * t1 = i * dt - * t1_2 = t1 * t1 - */ - __pyx_t_12 = __pyx_cur_scope->__pyx_v_n; - __pyx_t_13 = __pyx_t_12; - for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { - __pyx_cur_scope->__pyx_v_i = __pyx_t_14; - - /* "fontTools/cu2qu/cu2qu.py":147 - * delta_3 = dt * delta_2 - * for i in range(n): - * t1 = i * dt # <<<<<<<<<<<<<< - * t1_2 = t1 * t1 - * # calc new a, b, c and d - */ - __pyx_cur_scope->__pyx_v_t1 = (__pyx_cur_scope->__pyx_v_i * __pyx_cur_scope->__pyx_v_dt); - - /* "fontTools/cu2qu/cu2qu.py":148 - * for i in range(n): - * t1 = i * dt - * t1_2 = t1 * t1 # <<<<<<<<<<<<<< - * # calc new a, b, c and d - * a1 = a * delta_3 - */ - __pyx_cur_scope->__pyx_v_t1_2 = (__pyx_cur_scope->__pyx_v_t1 * __pyx_cur_scope->__pyx_v_t1); - - /* "fontTools/cu2qu/cu2qu.py":150 - * t1_2 = t1 * t1 - * # calc new a, b, c and d - * a1 = a * delta_3 # <<<<<<<<<<<<<< - * b1 = (3 * a * t1 + b) * delta_2 - * c1 = (2 * b * t1 + c + 3 * a * t1_2) * dt - */ - __pyx_cur_scope->__pyx_v_a1 = __Pyx_c_prod_double(__pyx_cur_scope->__pyx_v_a, __pyx_t_double_complex_from_parts(__pyx_cur_scope->__pyx_v_delta_3, 0)); - - /* "fontTools/cu2qu/cu2qu.py":151 - * # calc new a, b, c and d - * a1 = a * delta_3 - * b1 = (3 * a * t1 + b) * delta_2 # <<<<<<<<<<<<<< - * c1 = (2 * b * t1 + c + 3 * a * t1_2) * dt - * d1 = a * t1 * t1_2 + b * t1_2 + c * t1 + d - */ - __pyx_cur_scope->__pyx_v_b1 = __Pyx_c_prod_double(__Pyx_c_sum_double(__Pyx_c_prod_double(__Pyx_c_prod_double(__pyx_t_double_complex_from_parts(3, 0), __pyx_cur_scope->__pyx_v_a), __pyx_t_double_complex_from_parts(__pyx_cur_scope->__pyx_v_t1, 0)), __pyx_cur_scope->__pyx_v_b), __pyx_t_double_complex_from_parts(__pyx_cur_scope->__pyx_v_delta_2, 0)); - - /* "fontTools/cu2qu/cu2qu.py":152 - * a1 = a * delta_3 - * b1 = (3 * a * t1 + b) * delta_2 - * c1 = (2 * b * t1 + c + 3 * a * t1_2) * dt # <<<<<<<<<<<<<< - * d1 = a * t1 * t1_2 + b * t1_2 + c * t1 + d - * yield calc_cubic_points(a1, b1, c1, d1) - */ - __pyx_cur_scope->__pyx_v_c1 = __Pyx_c_prod_double(__Pyx_c_sum_double(__Pyx_c_sum_double(__Pyx_c_prod_double(__Pyx_c_prod_double(__pyx_t_double_complex_from_parts(2, 0), __pyx_cur_scope->__pyx_v_b), __pyx_t_double_complex_from_parts(__pyx_cur_scope->__pyx_v_t1, 0)), __pyx_cur_scope->__pyx_v_c), __Pyx_c_prod_double(__Pyx_c_prod_double(__pyx_t_double_complex_from_parts(3, 0), __pyx_cur_scope->__pyx_v_a), __pyx_t_double_complex_from_parts(__pyx_cur_scope->__pyx_v_t1_2, 0))), __pyx_t_double_complex_from_parts(__pyx_cur_scope->__pyx_v_dt, 0)); - - /* "fontTools/cu2qu/cu2qu.py":153 - * b1 = (3 * a * t1 + b) * delta_2 - * c1 = (2 * b * t1 + c + 3 * a * t1_2) * dt - * d1 = a * t1 * t1_2 + b * t1_2 + c * t1 + d # <<<<<<<<<<<<<< - * yield calc_cubic_points(a1, b1, c1, d1) - * - */ - __pyx_cur_scope->__pyx_v_d1 = __Pyx_c_sum_double(__Pyx_c_sum_double(__Pyx_c_sum_double(__Pyx_c_prod_double(__Pyx_c_prod_double(__pyx_cur_scope->__pyx_v_a, __pyx_t_double_complex_from_parts(__pyx_cur_scope->__pyx_v_t1, 0)), __pyx_t_double_complex_from_parts(__pyx_cur_scope->__pyx_v_t1_2, 0)), __Pyx_c_prod_double(__pyx_cur_scope->__pyx_v_b, __pyx_t_double_complex_from_parts(__pyx_cur_scope->__pyx_v_t1_2, 0))), __Pyx_c_prod_double(__pyx_cur_scope->__pyx_v_c, __pyx_t_double_complex_from_parts(__pyx_cur_scope->__pyx_v_t1, 0))), __pyx_cur_scope->__pyx_v_d); - - /* "fontTools/cu2qu/cu2qu.py":154 - * c1 = (2 * b * t1 + c + 3 * a * t1_2) * dt - * d1 = a * t1 * t1_2 + b * t1_2 + c * t1 + d - * yield calc_cubic_points(a1, b1, c1, d1) # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_1 = __pyx_f_9fontTools_5cu2qu_5cu2qu_calc_cubic_points(__pyx_cur_scope->__pyx_v_a1, __pyx_cur_scope->__pyx_v_b1, __pyx_cur_scope->__pyx_v_c1, __pyx_cur_scope->__pyx_v_d1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 154, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - __pyx_cur_scope->__pyx_t_0 = __pyx_t_12; - __pyx_cur_scope->__pyx_t_1 = __pyx_t_13; - __pyx_cur_scope->__pyx_t_2 = __pyx_t_14; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - __Pyx_Coroutine_ResetAndClearException(__pyx_generator); - /* return from generator, yielding value */ - __pyx_generator->resume_label = 1; - return __pyx_r; - __pyx_L8_resume_from_yield:; - __pyx_t_12 = __pyx_cur_scope->__pyx_t_0; - __pyx_t_13 = __pyx_cur_scope->__pyx_t_1; - __pyx_t_14 = __pyx_cur_scope->__pyx_t_2; - if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 154, __pyx_L1_error) - } - CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope); - - /* "fontTools/cu2qu/cu2qu.py":127 - * - * - * @cython.locals( # <<<<<<<<<<<<<< - * p0=cython.complex, - * p1=cython.complex, - */ - - /* function exit code */ - PyErr_SetNone(PyExc_StopIteration); - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_Generator_Replace_StopIteration(0); - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_AddTraceback("_split_cubic_into_n_gen", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_L0:; - __Pyx_XDECREF(__pyx_r); __pyx_r = 0; - #if !CYTHON_USE_EXC_INFO_STACK - __Pyx_Coroutine_ResetAndClearException(__pyx_generator); - #endif - __pyx_generator->resume_label = -1; - __Pyx_Coroutine_clear((PyObject*)__pyx_generator); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "fontTools/cu2qu/cu2qu.py":157 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.locals( - */ - -static CYTHON_INLINE PyObject *__pyx_f_9fontTools_5cu2qu_5cu2qu_split_cubic_into_two(__pyx_t_double_complex __pyx_v_p0, __pyx_t_double_complex __pyx_v_p1, __pyx_t_double_complex __pyx_v_p2, __pyx_t_double_complex __pyx_v_p3) { - __pyx_t_double_complex __pyx_v_mid; - __pyx_t_double_complex __pyx_v_deriv3; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __pyx_t_double_complex __pyx_t_2; - PyObject *__pyx_t_3 = NULL; - PyObject *__pyx_t_4 = NULL; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("split_cubic_into_two", 1); - - /* "fontTools/cu2qu/cu2qu.py":178 - * values). - * """ - * mid = (p0 + 3 * (p1 + p2) + p3) * 0.125 # <<<<<<<<<<<<<< - * deriv3 = (p3 + p2 - p1 - p0) * 0.125 - * return ( - */ - __pyx_v_mid = __Pyx_c_prod_double(__Pyx_c_sum_double(__Pyx_c_sum_double(__pyx_v_p0, __Pyx_c_prod_double(__pyx_t_double_complex_from_parts(3, 0), __Pyx_c_sum_double(__pyx_v_p1, __pyx_v_p2))), __pyx_v_p3), __pyx_t_double_complex_from_parts(0.125, 0)); - - /* "fontTools/cu2qu/cu2qu.py":179 - * """ - * mid = (p0 + 3 * (p1 + p2) + p3) * 0.125 - * deriv3 = (p3 + p2 - p1 - p0) * 0.125 # <<<<<<<<<<<<<< - * return ( - * (p0, (p0 + p1) * 0.5, mid - deriv3, mid), - */ - __pyx_v_deriv3 = __Pyx_c_prod_double(__Pyx_c_diff_double(__Pyx_c_diff_double(__Pyx_c_sum_double(__pyx_v_p3, __pyx_v_p2), __pyx_v_p1), __pyx_v_p0), __pyx_t_double_complex_from_parts(0.125, 0)); - - /* "fontTools/cu2qu/cu2qu.py":180 - * mid = (p0 + 3 * (p1 + p2) + p3) * 0.125 - * deriv3 = (p3 + p2 - p1 - p0) * 0.125 - * return ( # <<<<<<<<<<<<<< - * (p0, (p0 + p1) * 0.5, mid - deriv3, mid), - * (mid, mid + deriv3, (p2 + p3) * 0.5, p3), - */ - __Pyx_XDECREF(__pyx_r); - - /* "fontTools/cu2qu/cu2qu.py":181 - * deriv3 = (p3 + p2 - p1 - p0) * 0.125 - * return ( - * (p0, (p0 + p1) * 0.5, mid - deriv3, mid), # <<<<<<<<<<<<<< - * (mid, mid + deriv3, (p2 + p3) * 0.5, p3), - * ) - */ - __pyx_t_1 = __pyx_PyComplex_FromComplex(__pyx_v_p0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 181, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_c_prod_double(__Pyx_c_sum_double(__pyx_v_p0, __pyx_v_p1), __pyx_t_double_complex_from_parts(0.5, 0)); - __pyx_t_3 = __pyx_PyComplex_FromComplex(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 181, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_2 = __Pyx_c_diff_double(__pyx_v_mid, __pyx_v_deriv3); - __pyx_t_4 = __pyx_PyComplex_FromComplex(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 181, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_5 = __pyx_PyComplex_FromComplex(__pyx_v_mid); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 181, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = PyTuple_New(4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 181, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_GIVEREF(__pyx_t_1); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1)) __PYX_ERR(0, 181, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_3); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_3)) __PYX_ERR(0, 181, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_4); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_4)) __PYX_ERR(0, 181, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_5); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_6, 3, __pyx_t_5)) __PYX_ERR(0, 181, __pyx_L1_error); - __pyx_t_1 = 0; - __pyx_t_3 = 0; - __pyx_t_4 = 0; - __pyx_t_5 = 0; - - /* "fontTools/cu2qu/cu2qu.py":182 - * return ( - * (p0, (p0 + p1) * 0.5, mid - deriv3, mid), - * (mid, mid + deriv3, (p2 + p3) * 0.5, p3), # <<<<<<<<<<<<<< - * ) - * - */ - __pyx_t_5 = __pyx_PyComplex_FromComplex(__pyx_v_mid); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 182, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_2 = __Pyx_c_sum_double(__pyx_v_mid, __pyx_v_deriv3); - __pyx_t_4 = __pyx_PyComplex_FromComplex(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 182, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_4); - __pyx_t_2 = __Pyx_c_prod_double(__Pyx_c_sum_double(__pyx_v_p2, __pyx_v_p3), __pyx_t_double_complex_from_parts(0.5, 0)); - __pyx_t_3 = __pyx_PyComplex_FromComplex(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 182, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_3); - __pyx_t_1 = __pyx_PyComplex_FromComplex(__pyx_v_p3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_7 = PyTuple_New(4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 182, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_GIVEREF(__pyx_t_5); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5)) __PYX_ERR(0, 182, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_4); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_4)) __PYX_ERR(0, 182, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_3); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_3)) __PYX_ERR(0, 182, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_1); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 3, __pyx_t_1)) __PYX_ERR(0, 182, __pyx_L1_error); - __pyx_t_5 = 0; - __pyx_t_4 = 0; - __pyx_t_3 = 0; - __pyx_t_1 = 0; - - /* "fontTools/cu2qu/cu2qu.py":181 - * deriv3 = (p3 + p2 - p1 - p0) * 0.125 - * return ( - * (p0, (p0 + p1) * 0.5, mid - deriv3, mid), # <<<<<<<<<<<<<< - * (mid, mid + deriv3, (p2 + p3) * 0.5, p3), - * ) - */ - __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 181, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_GIVEREF(__pyx_t_6); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_6)) __PYX_ERR(0, 181, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_7); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_7)) __PYX_ERR(0, 181, __pyx_L1_error); - __pyx_t_6 = 0; - __pyx_t_7 = 0; - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":157 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.locals( - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_3); - __Pyx_XDECREF(__pyx_t_4); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_AddTraceback("fontTools.cu2qu.cu2qu.split_cubic_into_two", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "fontTools/cu2qu/cu2qu.py":186 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.locals( - */ - -static CYTHON_INLINE PyObject *__pyx_f_9fontTools_5cu2qu_5cu2qu_split_cubic_into_three(__pyx_t_double_complex __pyx_v_p0, __pyx_t_double_complex __pyx_v_p1, __pyx_t_double_complex __pyx_v_p2, __pyx_t_double_complex __pyx_v_p3) { - __pyx_t_double_complex __pyx_v_mid1; - __pyx_t_double_complex __pyx_v_deriv1; - __pyx_t_double_complex __pyx_v_mid2; - __pyx_t_double_complex __pyx_v_deriv2; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __pyx_t_double_complex __pyx_t_2; - __pyx_t_double_complex __pyx_t_3; - __pyx_t_double_complex __pyx_t_4; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - PyObject *__pyx_t_9 = NULL; - PyObject *__pyx_t_10 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("split_cubic_into_three", 1); - - /* "fontTools/cu2qu/cu2qu.py":215 - * values). - * """ - * mid1 = (8 * p0 + 12 * p1 + 6 * p2 + p3) * (1 / 27) # <<<<<<<<<<<<<< - * deriv1 = (p3 + 3 * p2 - 4 * p0) * (1 / 27) - * mid2 = (p0 + 6 * p1 + 12 * p2 + 8 * p3) * (1 / 27) - */ - __pyx_v_mid1 = __Pyx_c_prod_double(__Pyx_c_sum_double(__Pyx_c_sum_double(__Pyx_c_sum_double(__Pyx_c_prod_double(__pyx_t_double_complex_from_parts(8, 0), __pyx_v_p0), __Pyx_c_prod_double(__pyx_t_double_complex_from_parts(12, 0), __pyx_v_p1)), __Pyx_c_prod_double(__pyx_t_double_complex_from_parts(6, 0), __pyx_v_p2)), __pyx_v_p3), __pyx_t_double_complex_from_parts((1.0 / 27.0), 0)); - - /* "fontTools/cu2qu/cu2qu.py":216 - * """ - * mid1 = (8 * p0 + 12 * p1 + 6 * p2 + p3) * (1 / 27) - * deriv1 = (p3 + 3 * p2 - 4 * p0) * (1 / 27) # <<<<<<<<<<<<<< - * mid2 = (p0 + 6 * p1 + 12 * p2 + 8 * p3) * (1 / 27) - * deriv2 = (4 * p3 - 3 * p1 - p0) * (1 / 27) - */ - __pyx_v_deriv1 = __Pyx_c_prod_double(__Pyx_c_diff_double(__Pyx_c_sum_double(__pyx_v_p3, __Pyx_c_prod_double(__pyx_t_double_complex_from_parts(3, 0), __pyx_v_p2)), __Pyx_c_prod_double(__pyx_t_double_complex_from_parts(4, 0), __pyx_v_p0)), __pyx_t_double_complex_from_parts((1.0 / 27.0), 0)); - - /* "fontTools/cu2qu/cu2qu.py":217 - * mid1 = (8 * p0 + 12 * p1 + 6 * p2 + p3) * (1 / 27) - * deriv1 = (p3 + 3 * p2 - 4 * p0) * (1 / 27) - * mid2 = (p0 + 6 * p1 + 12 * p2 + 8 * p3) * (1 / 27) # <<<<<<<<<<<<<< - * deriv2 = (4 * p3 - 3 * p1 - p0) * (1 / 27) - * return ( - */ - __pyx_v_mid2 = __Pyx_c_prod_double(__Pyx_c_sum_double(__Pyx_c_sum_double(__Pyx_c_sum_double(__pyx_v_p0, __Pyx_c_prod_double(__pyx_t_double_complex_from_parts(6, 0), __pyx_v_p1)), __Pyx_c_prod_double(__pyx_t_double_complex_from_parts(12, 0), __pyx_v_p2)), __Pyx_c_prod_double(__pyx_t_double_complex_from_parts(8, 0), __pyx_v_p3)), __pyx_t_double_complex_from_parts((1.0 / 27.0), 0)); - - /* "fontTools/cu2qu/cu2qu.py":218 - * deriv1 = (p3 + 3 * p2 - 4 * p0) * (1 / 27) - * mid2 = (p0 + 6 * p1 + 12 * p2 + 8 * p3) * (1 / 27) - * deriv2 = (4 * p3 - 3 * p1 - p0) * (1 / 27) # <<<<<<<<<<<<<< - * return ( - * (p0, (2 * p0 + p1) / 3.0, mid1 - deriv1, mid1), - */ - __pyx_v_deriv2 = __Pyx_c_prod_double(__Pyx_c_diff_double(__Pyx_c_diff_double(__Pyx_c_prod_double(__pyx_t_double_complex_from_parts(4, 0), __pyx_v_p3), __Pyx_c_prod_double(__pyx_t_double_complex_from_parts(3, 0), __pyx_v_p1)), __pyx_v_p0), __pyx_t_double_complex_from_parts((1.0 / 27.0), 0)); - - /* "fontTools/cu2qu/cu2qu.py":219 - * mid2 = (p0 + 6 * p1 + 12 * p2 + 8 * p3) * (1 / 27) - * deriv2 = (4 * p3 - 3 * p1 - p0) * (1 / 27) - * return ( # <<<<<<<<<<<<<< - * (p0, (2 * p0 + p1) / 3.0, mid1 - deriv1, mid1), - * (mid1, mid1 + deriv1, mid2 - deriv2, mid2), - */ - __Pyx_XDECREF(__pyx_r); - - /* "fontTools/cu2qu/cu2qu.py":220 - * deriv2 = (4 * p3 - 3 * p1 - p0) * (1 / 27) - * return ( - * (p0, (2 * p0 + p1) / 3.0, mid1 - deriv1, mid1), # <<<<<<<<<<<<<< - * (mid1, mid1 + deriv1, mid2 - deriv2, mid2), - * (mid2, mid2 + deriv2, (p2 + 2 * p3) / 3.0, p3), - */ - __pyx_t_1 = __pyx_PyComplex_FromComplex(__pyx_v_p0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 220, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_c_sum_double(__Pyx_c_prod_double(__pyx_t_double_complex_from_parts(2, 0), __pyx_v_p0), __pyx_v_p1); - __pyx_t_3 = __pyx_t_double_complex_from_parts(3.0, 0); - if (unlikely(__Pyx_c_is_zero_double(__pyx_t_3))) { - PyErr_SetString(PyExc_ZeroDivisionError, "float division"); - __PYX_ERR(0, 220, __pyx_L1_error) - } - __pyx_t_4 = __Pyx_c_quot_double(__pyx_t_2, __pyx_t_3); - __pyx_t_5 = __pyx_PyComplex_FromComplex(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 220, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_4 = __Pyx_c_diff_double(__pyx_v_mid1, __pyx_v_deriv1); - __pyx_t_6 = __pyx_PyComplex_FromComplex(__pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 220, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = __pyx_PyComplex_FromComplex(__pyx_v_mid1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 220, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_8 = PyTuple_New(4); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 220, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_GIVEREF(__pyx_t_1); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_1)) __PYX_ERR(0, 220, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_5); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_5)) __PYX_ERR(0, 220, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_6); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_6)) __PYX_ERR(0, 220, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_7); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_7)) __PYX_ERR(0, 220, __pyx_L1_error); - __pyx_t_1 = 0; - __pyx_t_5 = 0; - __pyx_t_6 = 0; - __pyx_t_7 = 0; - - /* "fontTools/cu2qu/cu2qu.py":221 - * return ( - * (p0, (2 * p0 + p1) / 3.0, mid1 - deriv1, mid1), - * (mid1, mid1 + deriv1, mid2 - deriv2, mid2), # <<<<<<<<<<<<<< - * (mid2, mid2 + deriv2, (p2 + 2 * p3) / 3.0, p3), - * ) - */ - __pyx_t_7 = __pyx_PyComplex_FromComplex(__pyx_v_mid1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 221, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_4 = __Pyx_c_sum_double(__pyx_v_mid1, __pyx_v_deriv1); - __pyx_t_6 = __pyx_PyComplex_FromComplex(__pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 221, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_4 = __Pyx_c_diff_double(__pyx_v_mid2, __pyx_v_deriv2); - __pyx_t_5 = __pyx_PyComplex_FromComplex(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 221, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_1 = __pyx_PyComplex_FromComplex(__pyx_v_mid2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 221, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_9 = PyTuple_New(4); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 221, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __Pyx_GIVEREF(__pyx_t_7); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7)) __PYX_ERR(0, 221, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_6); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_6)) __PYX_ERR(0, 221, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_5); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_t_5)) __PYX_ERR(0, 221, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_1); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 3, __pyx_t_1)) __PYX_ERR(0, 221, __pyx_L1_error); - __pyx_t_7 = 0; - __pyx_t_6 = 0; - __pyx_t_5 = 0; - __pyx_t_1 = 0; - - /* "fontTools/cu2qu/cu2qu.py":222 - * (p0, (2 * p0 + p1) / 3.0, mid1 - deriv1, mid1), - * (mid1, mid1 + deriv1, mid2 - deriv2, mid2), - * (mid2, mid2 + deriv2, (p2 + 2 * p3) / 3.0, p3), # <<<<<<<<<<<<<< - * ) - * - */ - __pyx_t_1 = __pyx_PyComplex_FromComplex(__pyx_v_mid2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 222, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = __Pyx_c_sum_double(__pyx_v_mid2, __pyx_v_deriv2); - __pyx_t_5 = __pyx_PyComplex_FromComplex(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 222, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_4 = __Pyx_c_sum_double(__pyx_v_p2, __Pyx_c_prod_double(__pyx_t_double_complex_from_parts(2, 0), __pyx_v_p3)); - __pyx_t_3 = __pyx_t_double_complex_from_parts(3.0, 0); - if (unlikely(__Pyx_c_is_zero_double(__pyx_t_3))) { - PyErr_SetString(PyExc_ZeroDivisionError, "float division"); - __PYX_ERR(0, 222, __pyx_L1_error) - } - __pyx_t_2 = __Pyx_c_quot_double(__pyx_t_4, __pyx_t_3); - __pyx_t_6 = __pyx_PyComplex_FromComplex(__pyx_t_2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 222, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_7 = __pyx_PyComplex_FromComplex(__pyx_v_p3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 222, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_10 = PyTuple_New(4); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 222, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_GIVEREF(__pyx_t_1); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_1)) __PYX_ERR(0, 222, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_5); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_5)) __PYX_ERR(0, 222, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_6); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_6)) __PYX_ERR(0, 222, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_7); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_10, 3, __pyx_t_7)) __PYX_ERR(0, 222, __pyx_L1_error); - __pyx_t_1 = 0; - __pyx_t_5 = 0; - __pyx_t_6 = 0; - __pyx_t_7 = 0; - - /* "fontTools/cu2qu/cu2qu.py":220 - * deriv2 = (4 * p3 - 3 * p1 - p0) * (1 / 27) - * return ( - * (p0, (2 * p0 + p1) / 3.0, mid1 - deriv1, mid1), # <<<<<<<<<<<<<< - * (mid1, mid1 + deriv1, mid2 - deriv2, mid2), - * (mid2, mid2 + deriv2, (p2 + 2 * p3) / 3.0, p3), - */ - __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 220, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_GIVEREF(__pyx_t_8); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_8)) __PYX_ERR(0, 220, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_9); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_9)) __PYX_ERR(0, 220, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_10); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_10)) __PYX_ERR(0, 220, __pyx_L1_error); - __pyx_t_8 = 0; - __pyx_t_9 = 0; - __pyx_t_10 = 0; - __pyx_r = __pyx_t_7; - __pyx_t_7 = 0; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":186 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.locals( - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_XDECREF(__pyx_t_10); - __Pyx_AddTraceback("fontTools.cu2qu.cu2qu.split_cubic_into_three", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "fontTools/cu2qu/cu2qu.py":226 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.returns(cython.complex) - */ - -static CYTHON_INLINE __pyx_t_double_complex __pyx_f_9fontTools_5cu2qu_5cu2qu_cubic_approx_control(double __pyx_v_t, __pyx_t_double_complex __pyx_v_p0, __pyx_t_double_complex __pyx_v_p1, __pyx_t_double_complex __pyx_v_p2, __pyx_t_double_complex __pyx_v_p3) { - __pyx_t_double_complex __pyx_v__p1; - __pyx_t_double_complex __pyx_v__p2; - __pyx_t_double_complex __pyx_r; - - /* "fontTools/cu2qu/cu2qu.py":250 - * complex: Location of candidate control point on quadratic curve. - * """ - * _p1 = p0 + (p1 - p0) * 1.5 # <<<<<<<<<<<<<< - * _p2 = p3 + (p2 - p3) * 1.5 - * return _p1 + (_p2 - _p1) * t - */ - __pyx_v__p1 = __Pyx_c_sum_double(__pyx_v_p0, __Pyx_c_prod_double(__Pyx_c_diff_double(__pyx_v_p1, __pyx_v_p0), __pyx_t_double_complex_from_parts(1.5, 0))); - - /* "fontTools/cu2qu/cu2qu.py":251 - * """ - * _p1 = p0 + (p1 - p0) * 1.5 - * _p2 = p3 + (p2 - p3) * 1.5 # <<<<<<<<<<<<<< - * return _p1 + (_p2 - _p1) * t - * - */ - __pyx_v__p2 = __Pyx_c_sum_double(__pyx_v_p3, __Pyx_c_prod_double(__Pyx_c_diff_double(__pyx_v_p2, __pyx_v_p3), __pyx_t_double_complex_from_parts(1.5, 0))); - - /* "fontTools/cu2qu/cu2qu.py":252 - * _p1 = p0 + (p1 - p0) * 1.5 - * _p2 = p3 + (p2 - p3) * 1.5 - * return _p1 + (_p2 - _p1) * t # <<<<<<<<<<<<<< - * - * - */ - __pyx_r = __Pyx_c_sum_double(__pyx_v__p1, __Pyx_c_prod_double(__Pyx_c_diff_double(__pyx_v__p2, __pyx_v__p1), __pyx_t_double_complex_from_parts(__pyx_v_t, 0))); - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":226 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.returns(cython.complex) - */ - - /* function exit code */ - __pyx_L0:; - return __pyx_r; -} - -/* "fontTools/cu2qu/cu2qu.py":255 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.returns(cython.complex) - */ - -static CYTHON_INLINE __pyx_t_double_complex __pyx_f_9fontTools_5cu2qu_5cu2qu_calc_intersect(__pyx_t_double_complex __pyx_v_a, __pyx_t_double_complex __pyx_v_b, __pyx_t_double_complex __pyx_v_c, __pyx_t_double_complex __pyx_v_d) { - __pyx_t_double_complex __pyx_v_ab; - __pyx_t_double_complex __pyx_v_cd; - __pyx_t_double_complex __pyx_v_p; - double __pyx_v_h; - __pyx_t_double_complex __pyx_r; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - double __pyx_t_4; - double __pyx_t_5; - int __pyx_t_6; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - PyObject *__pyx_t_9 = NULL; - PyObject *__pyx_t_10 = NULL; - PyObject *__pyx_t_11 = NULL; - PyObject *__pyx_t_12 = NULL; - __pyx_t_double_complex __pyx_t_13; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("calc_intersect", 1); - - /* "fontTools/cu2qu/cu2qu.py":273 - * if no intersection was found. - * """ - * ab = b - a # <<<<<<<<<<<<<< - * cd = d - c - * p = ab * 1j - */ - __pyx_v_ab = __Pyx_c_diff_double(__pyx_v_b, __pyx_v_a); - - /* "fontTools/cu2qu/cu2qu.py":274 - * """ - * ab = b - a - * cd = d - c # <<<<<<<<<<<<<< - * p = ab * 1j - * try: - */ - __pyx_v_cd = __Pyx_c_diff_double(__pyx_v_d, __pyx_v_c); - - /* "fontTools/cu2qu/cu2qu.py":275 - * ab = b - a - * cd = d - c - * p = ab * 1j # <<<<<<<<<<<<<< - * try: - * h = dot(p, a - c) / dot(p, cd) - */ - __pyx_v_p = __Pyx_c_prod_double(__pyx_v_ab, __pyx_t_double_complex_from_parts(0, 1.0)); - - /* "fontTools/cu2qu/cu2qu.py":276 - * cd = d - c - * p = ab * 1j - * try: # <<<<<<<<<<<<<< - * h = dot(p, a - c) / dot(p, cd) - * except ZeroDivisionError: - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - /*try:*/ { - - /* "fontTools/cu2qu/cu2qu.py":277 - * p = ab * 1j - * try: - * h = dot(p, a - c) / dot(p, cd) # <<<<<<<<<<<<<< - * except ZeroDivisionError: - * return complex(NAN, NAN) - */ - __pyx_t_4 = __pyx_f_9fontTools_5cu2qu_5cu2qu_dot(__pyx_v_p, __Pyx_c_diff_double(__pyx_v_a, __pyx_v_c)); if (unlikely(__pyx_t_4 == ((double)-1) && PyErr_Occurred())) __PYX_ERR(0, 277, __pyx_L3_error) - __pyx_t_5 = __pyx_f_9fontTools_5cu2qu_5cu2qu_dot(__pyx_v_p, __pyx_v_cd); if (unlikely(__pyx_t_5 == ((double)-1) && PyErr_Occurred())) __PYX_ERR(0, 277, __pyx_L3_error) - if (unlikely(__pyx_t_5 == 0)) { - PyErr_SetString(PyExc_ZeroDivisionError, "float division"); - __PYX_ERR(0, 277, __pyx_L3_error) - } - __pyx_v_h = (__pyx_t_4 / __pyx_t_5); - - /* "fontTools/cu2qu/cu2qu.py":276 - * cd = d - c - * p = ab * 1j - * try: # <<<<<<<<<<<<<< - * h = dot(p, a - c) / dot(p, cd) - * except ZeroDivisionError: - */ - } - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - goto __pyx_L8_try_end; - __pyx_L3_error:; - - /* "fontTools/cu2qu/cu2qu.py":278 - * try: - * h = dot(p, a - c) / dot(p, cd) - * except ZeroDivisionError: # <<<<<<<<<<<<<< - * return complex(NAN, NAN) - * return c + cd * h - */ - __pyx_t_6 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_ZeroDivisionError); - if (__pyx_t_6) { - __Pyx_AddTraceback("fontTools.cu2qu.cu2qu.calc_intersect", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9) < 0) __PYX_ERR(0, 278, __pyx_L5_except_error) - __Pyx_XGOTREF(__pyx_t_7); - __Pyx_XGOTREF(__pyx_t_8); - __Pyx_XGOTREF(__pyx_t_9); - - /* "fontTools/cu2qu/cu2qu.py":279 - * h = dot(p, a - c) / dot(p, cd) - * except ZeroDivisionError: - * return complex(NAN, NAN) # <<<<<<<<<<<<<< - * return c + cd * h - * - */ - __Pyx_GetModuleGlobalName(__pyx_t_10, __pyx_n_s_NAN); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 279, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_GetModuleGlobalName(__pyx_t_11, __pyx_n_s_NAN); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 279, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_11); - __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 279, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_12); - __Pyx_GIVEREF(__pyx_t_10); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_10)) __PYX_ERR(0, 279, __pyx_L5_except_error); - __Pyx_GIVEREF(__pyx_t_11); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_11)) __PYX_ERR(0, 279, __pyx_L5_except_error); - __pyx_t_10 = 0; - __pyx_t_11 = 0; - __pyx_t_11 = __Pyx_PyObject_Call(((PyObject *)(&PyComplex_Type)), __pyx_t_12, NULL); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 279, __pyx_L5_except_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; - __pyx_t_13 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_11); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 279, __pyx_L5_except_error) - __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - __pyx_r = __pyx_t_13; - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - goto __pyx_L6_except_return; - } - goto __pyx_L5_except_error; - - /* "fontTools/cu2qu/cu2qu.py":276 - * cd = d - c - * p = ab * 1j - * try: # <<<<<<<<<<<<<< - * h = dot(p, a - c) / dot(p, cd) - * except ZeroDivisionError: - */ - __pyx_L5_except_error:; - __Pyx_XGIVEREF(__pyx_t_1); - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); - goto __pyx_L1_error; - __pyx_L6_except_return:; - __Pyx_XGIVEREF(__pyx_t_1); - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); - goto __pyx_L0; - __pyx_L8_try_end:; - } - - /* "fontTools/cu2qu/cu2qu.py":280 - * except ZeroDivisionError: - * return complex(NAN, NAN) - * return c + cd * h # <<<<<<<<<<<<<< - * - * - */ - __pyx_r = __Pyx_c_sum_double(__pyx_v_c, __Pyx_c_prod_double(__pyx_v_cd, __pyx_t_double_complex_from_parts(__pyx_v_h, 0))); - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":255 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.returns(cython.complex) - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_XDECREF(__pyx_t_10); - __Pyx_XDECREF(__pyx_t_11); - __Pyx_XDECREF(__pyx_t_12); - __Pyx_AddTraceback("fontTools.cu2qu.cu2qu.calc_intersect", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = __pyx_t_double_complex_from_parts(0, 0); - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "fontTools/cu2qu/cu2qu.py":283 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.returns(cython.int) - * @cython.locals( - */ - -static int __pyx_f_9fontTools_5cu2qu_5cu2qu_cubic_farthest_fit_inside(__pyx_t_double_complex __pyx_v_p0, __pyx_t_double_complex __pyx_v_p1, __pyx_t_double_complex __pyx_v_p2, __pyx_t_double_complex __pyx_v_p3, double __pyx_v_tolerance) { - __pyx_t_double_complex __pyx_v_mid; - __pyx_t_double_complex __pyx_v_deriv3; - int __pyx_r; - int __pyx_t_1; - int __pyx_t_2; - int __pyx_t_3; - int __pyx_t_4; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - - /* "fontTools/cu2qu/cu2qu.py":312 - * """ - * # First check p2 then p1, as p2 has higher error early on. - * if abs(p2) <= tolerance and abs(p1) <= tolerance: # <<<<<<<<<<<<<< - * return True - * - */ - __pyx_t_2 = (__Pyx_c_abs_double(__pyx_v_p2) <= __pyx_v_tolerance); - if (__pyx_t_2) { - } else { - __pyx_t_1 = __pyx_t_2; - goto __pyx_L4_bool_binop_done; - } - __pyx_t_2 = (__Pyx_c_abs_double(__pyx_v_p1) <= __pyx_v_tolerance); - __pyx_t_1 = __pyx_t_2; - __pyx_L4_bool_binop_done:; - if (__pyx_t_1) { - - /* "fontTools/cu2qu/cu2qu.py":313 - * # First check p2 then p1, as p2 has higher error early on. - * if abs(p2) <= tolerance and abs(p1) <= tolerance: - * return True # <<<<<<<<<<<<<< - * - * # Split. - */ - __pyx_r = 1; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":312 - * """ - * # First check p2 then p1, as p2 has higher error early on. - * if abs(p2) <= tolerance and abs(p1) <= tolerance: # <<<<<<<<<<<<<< - * return True - * - */ - } - - /* "fontTools/cu2qu/cu2qu.py":316 - * - * # Split. - * mid = (p0 + 3 * (p1 + p2) + p3) * 0.125 # <<<<<<<<<<<<<< - * if abs(mid) > tolerance: - * return False - */ - __pyx_v_mid = __Pyx_c_prod_double(__Pyx_c_sum_double(__Pyx_c_sum_double(__pyx_v_p0, __Pyx_c_prod_double(__pyx_t_double_complex_from_parts(3, 0), __Pyx_c_sum_double(__pyx_v_p1, __pyx_v_p2))), __pyx_v_p3), __pyx_t_double_complex_from_parts(0.125, 0)); - - /* "fontTools/cu2qu/cu2qu.py":317 - * # Split. - * mid = (p0 + 3 * (p1 + p2) + p3) * 0.125 - * if abs(mid) > tolerance: # <<<<<<<<<<<<<< - * return False - * deriv3 = (p3 + p2 - p1 - p0) * 0.125 - */ - __pyx_t_1 = (__Pyx_c_abs_double(__pyx_v_mid) > __pyx_v_tolerance); - if (__pyx_t_1) { - - /* "fontTools/cu2qu/cu2qu.py":318 - * mid = (p0 + 3 * (p1 + p2) + p3) * 0.125 - * if abs(mid) > tolerance: - * return False # <<<<<<<<<<<<<< - * deriv3 = (p3 + p2 - p1 - p0) * 0.125 - * return cubic_farthest_fit_inside( - */ - __pyx_r = 0; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":317 - * # Split. - * mid = (p0 + 3 * (p1 + p2) + p3) * 0.125 - * if abs(mid) > tolerance: # <<<<<<<<<<<<<< - * return False - * deriv3 = (p3 + p2 - p1 - p0) * 0.125 - */ - } - - /* "fontTools/cu2qu/cu2qu.py":319 - * if abs(mid) > tolerance: - * return False - * deriv3 = (p3 + p2 - p1 - p0) * 0.125 # <<<<<<<<<<<<<< - * return cubic_farthest_fit_inside( - * p0, (p0 + p1) * 0.5, mid - deriv3, mid, tolerance - */ - __pyx_v_deriv3 = __Pyx_c_prod_double(__Pyx_c_diff_double(__Pyx_c_diff_double(__Pyx_c_sum_double(__pyx_v_p3, __pyx_v_p2), __pyx_v_p1), __pyx_v_p0), __pyx_t_double_complex_from_parts(0.125, 0)); - - /* "fontTools/cu2qu/cu2qu.py":320 - * return False - * deriv3 = (p3 + p2 - p1 - p0) * 0.125 - * return cubic_farthest_fit_inside( # <<<<<<<<<<<<<< - * p0, (p0 + p1) * 0.5, mid - deriv3, mid, tolerance - * ) and cubic_farthest_fit_inside(mid, mid + deriv3, (p2 + p3) * 0.5, p3, tolerance) - */ - __pyx_t_4 = __pyx_f_9fontTools_5cu2qu_5cu2qu_cubic_farthest_fit_inside(__pyx_v_p0, __Pyx_c_prod_double(__Pyx_c_sum_double(__pyx_v_p0, __pyx_v_p1), __pyx_t_double_complex_from_parts(0.5, 0)), __Pyx_c_diff_double(__pyx_v_mid, __pyx_v_deriv3), __pyx_v_mid, __pyx_v_tolerance); if (unlikely(__pyx_t_4 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 320, __pyx_L1_error) - if (__pyx_t_4) { - } else { - __pyx_t_3 = __pyx_t_4; - goto __pyx_L7_bool_binop_done; - } - - /* "fontTools/cu2qu/cu2qu.py":322 - * return cubic_farthest_fit_inside( - * p0, (p0 + p1) * 0.5, mid - deriv3, mid, tolerance - * ) and cubic_farthest_fit_inside(mid, mid + deriv3, (p2 + p3) * 0.5, p3, tolerance) # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_4 = __pyx_f_9fontTools_5cu2qu_5cu2qu_cubic_farthest_fit_inside(__pyx_v_mid, __Pyx_c_sum_double(__pyx_v_mid, __pyx_v_deriv3), __Pyx_c_prod_double(__Pyx_c_sum_double(__pyx_v_p2, __pyx_v_p3), __pyx_t_double_complex_from_parts(0.5, 0)), __pyx_v_p3, __pyx_v_tolerance); if (unlikely(__pyx_t_4 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 322, __pyx_L1_error) - __pyx_t_3 = __pyx_t_4; - __pyx_L7_bool_binop_done:; - __pyx_r = __pyx_t_3; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":283 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.returns(cython.int) - * @cython.locals( - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_AddTraceback("fontTools.cu2qu.cu2qu.cubic_farthest_fit_inside", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = -1; - __pyx_L0:; - return __pyx_r; -} - -/* "fontTools/cu2qu/cu2qu.py":325 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.locals(tolerance=cython.double) - */ - -static CYTHON_INLINE PyObject *__pyx_f_9fontTools_5cu2qu_5cu2qu_cubic_approx_quadratic(PyObject *__pyx_v_cubic, double __pyx_v_tolerance) { - __pyx_t_double_complex __pyx_v_q1; - __pyx_t_double_complex __pyx_v_c0; - __pyx_t_double_complex __pyx_v_c1; - __pyx_t_double_complex __pyx_v_c2; - __pyx_t_double_complex __pyx_v_c3; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - __pyx_t_double_complex __pyx_t_2; - __pyx_t_double_complex __pyx_t_3; - __pyx_t_double_complex __pyx_t_4; - __pyx_t_double_complex __pyx_t_5; - __pyx_t_double_complex __pyx_t_6; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - PyObject *__pyx_t_9 = NULL; - int __pyx_t_10; - int __pyx_t_11; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("cubic_approx_quadratic", 1); - - /* "fontTools/cu2qu/cu2qu.py":349 - * """ - * - * q1 = calc_intersect(cubic[0], cubic[1], cubic[2], cubic[3]) # <<<<<<<<<<<<<< - * if math.isnan(q1.imag): - * return None - */ - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_cubic, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 349, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 349, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_cubic, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 349, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_3 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 349, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_cubic, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 349, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 349, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_cubic, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 349, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_5 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 349, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_6 = __pyx_f_9fontTools_5cu2qu_5cu2qu_calc_intersect(__pyx_t_2, __pyx_t_3, __pyx_t_4, __pyx_t_5); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 349, __pyx_L1_error) - __pyx_v_q1 = __pyx_t_6; - - /* "fontTools/cu2qu/cu2qu.py":350 - * - * q1 = calc_intersect(cubic[0], cubic[1], cubic[2], cubic[3]) - * if math.isnan(q1.imag): # <<<<<<<<<<<<<< - * return None - * c0 = cubic[0] - */ - __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_math); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 350, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_isnan); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 350, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_7 = PyFloat_FromDouble(__Pyx_CIMAG(__pyx_v_q1)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 350, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_9 = NULL; - __pyx_t_10 = 0; - #if CYTHON_UNPACK_METHODS - if (unlikely(PyMethod_Check(__pyx_t_8))) { - __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_8); - if (likely(__pyx_t_9)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); - __Pyx_INCREF(__pyx_t_9); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_8, function); - __pyx_t_10 = 1; - } - } - #endif - { - PyObject *__pyx_callargs[2] = {__pyx_t_9, __pyx_t_7}; - __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+1-__pyx_t_10, 1+__pyx_t_10); - __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 350, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - } - __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_11 < 0))) __PYX_ERR(0, 350, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - if (__pyx_t_11) { - - /* "fontTools/cu2qu/cu2qu.py":351 - * q1 = calc_intersect(cubic[0], cubic[1], cubic[2], cubic[3]) - * if math.isnan(q1.imag): - * return None # <<<<<<<<<<<<<< - * c0 = cubic[0] - * c3 = cubic[3] - */ - __Pyx_XDECREF(__pyx_r); - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":350 - * - * q1 = calc_intersect(cubic[0], cubic[1], cubic[2], cubic[3]) - * if math.isnan(q1.imag): # <<<<<<<<<<<<<< - * return None - * c0 = cubic[0] - */ - } - - /* "fontTools/cu2qu/cu2qu.py":352 - * if math.isnan(q1.imag): - * return None - * c0 = cubic[0] # <<<<<<<<<<<<<< - * c3 = cubic[3] - * c1 = c0 + (q1 - c0) * (2 / 3) - */ - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_cubic, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 352, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_6 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 352, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_c0 = __pyx_t_6; - - /* "fontTools/cu2qu/cu2qu.py":353 - * return None - * c0 = cubic[0] - * c3 = cubic[3] # <<<<<<<<<<<<<< - * c1 = c0 + (q1 - c0) * (2 / 3) - * c2 = c3 + (q1 - c3) * (2 / 3) - */ - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_cubic, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 353, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_6 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 353, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_v_c3 = __pyx_t_6; - - /* "fontTools/cu2qu/cu2qu.py":354 - * c0 = cubic[0] - * c3 = cubic[3] - * c1 = c0 + (q1 - c0) * (2 / 3) # <<<<<<<<<<<<<< - * c2 = c3 + (q1 - c3) * (2 / 3) - * if not cubic_farthest_fit_inside(0, c1 - cubic[1], c2 - cubic[2], 0, tolerance): - */ - __pyx_v_c1 = __Pyx_c_sum_double(__pyx_v_c0, __Pyx_c_prod_double(__Pyx_c_diff_double(__pyx_v_q1, __pyx_v_c0), __pyx_t_double_complex_from_parts((2.0 / 3.0), 0))); - - /* "fontTools/cu2qu/cu2qu.py":355 - * c3 = cubic[3] - * c1 = c0 + (q1 - c0) * (2 / 3) - * c2 = c3 + (q1 - c3) * (2 / 3) # <<<<<<<<<<<<<< - * if not cubic_farthest_fit_inside(0, c1 - cubic[1], c2 - cubic[2], 0, tolerance): - * return None - */ - __pyx_v_c2 = __Pyx_c_sum_double(__pyx_v_c3, __Pyx_c_prod_double(__Pyx_c_diff_double(__pyx_v_q1, __pyx_v_c3), __pyx_t_double_complex_from_parts((2.0 / 3.0), 0))); - - /* "fontTools/cu2qu/cu2qu.py":356 - * c1 = c0 + (q1 - c0) * (2 / 3) - * c2 = c3 + (q1 - c3) * (2 / 3) - * if not cubic_farthest_fit_inside(0, c1 - cubic[1], c2 - cubic[2], 0, tolerance): # <<<<<<<<<<<<<< - * return None - * return c0, q1, c3 - */ - __pyx_t_1 = __pyx_PyComplex_FromComplex(__pyx_v_c1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 356, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_cubic, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 356, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_7 = PyNumber_Subtract(__pyx_t_1, __pyx_t_8); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 356, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __pyx_t_6 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_7); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 356, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_7 = __pyx_PyComplex_FromComplex(__pyx_v_c2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 356, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_cubic, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 356, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_1 = PyNumber_Subtract(__pyx_t_7, __pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 356, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __pyx_t_5 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_1); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 356, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_10 = __pyx_f_9fontTools_5cu2qu_5cu2qu_cubic_farthest_fit_inside(__pyx_t_double_complex_from_parts(0, 0), __pyx_t_6, __pyx_t_5, __pyx_t_double_complex_from_parts(0, 0), __pyx_v_tolerance); if (unlikely(__pyx_t_10 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 356, __pyx_L1_error) - __pyx_t_11 = (!(__pyx_t_10 != 0)); - if (__pyx_t_11) { - - /* "fontTools/cu2qu/cu2qu.py":357 - * c2 = c3 + (q1 - c3) * (2 / 3) - * if not cubic_farthest_fit_inside(0, c1 - cubic[1], c2 - cubic[2], 0, tolerance): - * return None # <<<<<<<<<<<<<< - * return c0, q1, c3 - * - */ - __Pyx_XDECREF(__pyx_r); - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":356 - * c1 = c0 + (q1 - c0) * (2 / 3) - * c2 = c3 + (q1 - c3) * (2 / 3) - * if not cubic_farthest_fit_inside(0, c1 - cubic[1], c2 - cubic[2], 0, tolerance): # <<<<<<<<<<<<<< - * return None - * return c0, q1, c3 - */ - } - - /* "fontTools/cu2qu/cu2qu.py":358 - * if not cubic_farthest_fit_inside(0, c1 - cubic[1], c2 - cubic[2], 0, tolerance): - * return None - * return c0, q1, c3 # <<<<<<<<<<<<<< - * - * - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __pyx_PyComplex_FromComplex(__pyx_v_c0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 358, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_8 = __pyx_PyComplex_FromComplex(__pyx_v_q1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 358, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_7 = __pyx_PyComplex_FromComplex(__pyx_v_c3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 358, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 358, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_9); - __Pyx_GIVEREF(__pyx_t_1); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_1)) __PYX_ERR(0, 358, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_8); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8)) __PYX_ERR(0, 358, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_7); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_t_7)) __PYX_ERR(0, 358, __pyx_L1_error); - __pyx_t_1 = 0; - __pyx_t_8 = 0; - __pyx_t_7 = 0; - __pyx_r = __pyx_t_9; - __pyx_t_9 = 0; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":325 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.inline - * @cython.locals(tolerance=cython.double) - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_AddTraceback("fontTools.cu2qu.cu2qu.cubic_approx_quadratic", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "fontTools/cu2qu/cu2qu.py":361 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.locals(n=cython.int, tolerance=cython.double) - * @cython.locals(i=cython.int) - */ - -static PyObject *__pyx_f_9fontTools_5cu2qu_5cu2qu_cubic_approx_spline(PyObject *__pyx_v_cubic, int __pyx_v_n, double __pyx_v_tolerance, int __pyx_v_all_quadratic) { - __pyx_t_double_complex __pyx_v_q0; - __pyx_t_double_complex __pyx_v_q1; - __pyx_t_double_complex __pyx_v_next_q1; - __pyx_t_double_complex __pyx_v_q2; - __pyx_t_double_complex __pyx_v_d1; - CYTHON_UNUSED __pyx_t_double_complex __pyx_v_c0; - __pyx_t_double_complex __pyx_v_c1; - __pyx_t_double_complex __pyx_v_c2; - __pyx_t_double_complex __pyx_v_c3; - int __pyx_v_i; - PyObject *__pyx_v_cubics = NULL; - PyObject *__pyx_v_next_cubic = NULL; - PyObject *__pyx_v_spline = NULL; - __pyx_t_double_complex __pyx_v_d0; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - int __pyx_t_1; - PyObject *__pyx_t_2 = NULL; - int __pyx_t_3; - __pyx_t_double_complex __pyx_t_4; - __pyx_t_double_complex __pyx_t_5; - __pyx_t_double_complex __pyx_t_6; - __pyx_t_double_complex __pyx_t_7; - PyObject *__pyx_t_8 = NULL; - __pyx_t_double_complex __pyx_t_9; - PyObject *__pyx_t_10 = NULL; - long __pyx_t_11; - long __pyx_t_12; - int __pyx_t_13; - PyObject *__pyx_t_14 = NULL; - PyObject *__pyx_t_15 = NULL; - PyObject *(*__pyx_t_16)(PyObject *); - long __pyx_t_17; - int __pyx_t_18; - int __pyx_t_19; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("cubic_approx_spline", 1); - - /* "fontTools/cu2qu/cu2qu.py":390 - * """ - * - * if n == 1: # <<<<<<<<<<<<<< - * return cubic_approx_quadratic(cubic, tolerance) - * if n == 2 and all_quadratic == False: - */ - __pyx_t_1 = (__pyx_v_n == 1); - if (__pyx_t_1) { - - /* "fontTools/cu2qu/cu2qu.py":391 - * - * if n == 1: - * return cubic_approx_quadratic(cubic, tolerance) # <<<<<<<<<<<<<< - * if n == 2 and all_quadratic == False: - * return cubic - */ - __Pyx_XDECREF(__pyx_r); - __pyx_t_2 = __pyx_f_9fontTools_5cu2qu_5cu2qu_cubic_approx_quadratic(__pyx_v_cubic, __pyx_v_tolerance); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 391, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":390 - * """ - * - * if n == 1: # <<<<<<<<<<<<<< - * return cubic_approx_quadratic(cubic, tolerance) - * if n == 2 and all_quadratic == False: - */ - } - - /* "fontTools/cu2qu/cu2qu.py":392 - * if n == 1: - * return cubic_approx_quadratic(cubic, tolerance) - * if n == 2 and all_quadratic == False: # <<<<<<<<<<<<<< - * return cubic - * - */ - __pyx_t_3 = (__pyx_v_n == 2); - if (__pyx_t_3) { - } else { - __pyx_t_1 = __pyx_t_3; - goto __pyx_L5_bool_binop_done; - } - __pyx_t_3 = (__pyx_v_all_quadratic == 0); - __pyx_t_1 = __pyx_t_3; - __pyx_L5_bool_binop_done:; - if (__pyx_t_1) { - - /* "fontTools/cu2qu/cu2qu.py":393 - * return cubic_approx_quadratic(cubic, tolerance) - * if n == 2 and all_quadratic == False: - * return cubic # <<<<<<<<<<<<<< - * - * cubics = split_cubic_into_n_iter(cubic[0], cubic[1], cubic[2], cubic[3], n) - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_cubic); - __pyx_r = __pyx_v_cubic; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":392 - * if n == 1: - * return cubic_approx_quadratic(cubic, tolerance) - * if n == 2 and all_quadratic == False: # <<<<<<<<<<<<<< - * return cubic - * - */ - } - - /* "fontTools/cu2qu/cu2qu.py":395 - * return cubic - * - * cubics = split_cubic_into_n_iter(cubic[0], cubic[1], cubic[2], cubic[3], n) # <<<<<<<<<<<<<< - * - * # calculate the spline of quadratics and check errors at the same time. - */ - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_cubic, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 395, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 395, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_cubic, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 395, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_5 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 395, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_cubic, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 395, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_6 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 395, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_cubic, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 395, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_7 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 395, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 395, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_8 = __pyx_f_9fontTools_5cu2qu_5cu2qu_split_cubic_into_n_iter(__pyx_t_4, __pyx_t_5, __pyx_t_6, __pyx_t_7, __pyx_t_2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 395, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_v_cubics = __pyx_t_8; - __pyx_t_8 = 0; - - /* "fontTools/cu2qu/cu2qu.py":398 - * - * # calculate the spline of quadratics and check errors at the same time. - * next_cubic = next(cubics) # <<<<<<<<<<<<<< - * next_q1 = cubic_approx_control( - * 0, next_cubic[0], next_cubic[1], next_cubic[2], next_cubic[3] - */ - __pyx_t_8 = __Pyx_PyIter_Next(__pyx_v_cubics); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 398, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_v_next_cubic = __pyx_t_8; - __pyx_t_8 = 0; - - /* "fontTools/cu2qu/cu2qu.py":400 - * next_cubic = next(cubics) - * next_q1 = cubic_approx_control( - * 0, next_cubic[0], next_cubic[1], next_cubic[2], next_cubic[3] # <<<<<<<<<<<<<< - * ) - * q2 = cubic[0] - */ - __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_next_cubic, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 400, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_7 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_8); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 400, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_next_cubic, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 400, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_6 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_8); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 400, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_next_cubic, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 400, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_5 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_8); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 400, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_next_cubic, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 400, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_4 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_8); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 400, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - - /* "fontTools/cu2qu/cu2qu.py":399 - * # calculate the spline of quadratics and check errors at the same time. - * next_cubic = next(cubics) - * next_q1 = cubic_approx_control( # <<<<<<<<<<<<<< - * 0, next_cubic[0], next_cubic[1], next_cubic[2], next_cubic[3] - * ) - */ - __pyx_t_9 = __pyx_f_9fontTools_5cu2qu_5cu2qu_cubic_approx_control(0.0, __pyx_t_7, __pyx_t_6, __pyx_t_5, __pyx_t_4); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 399, __pyx_L1_error) - __pyx_v_next_q1 = __pyx_t_9; - - /* "fontTools/cu2qu/cu2qu.py":402 - * 0, next_cubic[0], next_cubic[1], next_cubic[2], next_cubic[3] - * ) - * q2 = cubic[0] # <<<<<<<<<<<<<< - * d1 = 0j - * spline = [cubic[0], next_q1] - */ - __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_cubic, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 402, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_9 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_8); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 402, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __pyx_v_q2 = __pyx_t_9; - - /* "fontTools/cu2qu/cu2qu.py":403 - * ) - * q2 = cubic[0] - * d1 = 0j # <<<<<<<<<<<<<< - * spline = [cubic[0], next_q1] - * for i in range(1, n + 1): - */ - __pyx_v_d1 = __pyx_t_double_complex_from_parts(0, 0.0); - - /* "fontTools/cu2qu/cu2qu.py":404 - * q2 = cubic[0] - * d1 = 0j - * spline = [cubic[0], next_q1] # <<<<<<<<<<<<<< - * for i in range(1, n + 1): - * # Current cubic to convert - */ - __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_cubic, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 404, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_8); - __pyx_t_2 = __pyx_PyComplex_FromComplex(__pyx_v_next_q1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 404, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_10 = PyList_New(2); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 404, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_GIVEREF(__pyx_t_8); - if (__Pyx_PyList_SET_ITEM(__pyx_t_10, 0, __pyx_t_8)) __PYX_ERR(0, 404, __pyx_L1_error); - __Pyx_GIVEREF(__pyx_t_2); - if (__Pyx_PyList_SET_ITEM(__pyx_t_10, 1, __pyx_t_2)) __PYX_ERR(0, 404, __pyx_L1_error); - __pyx_t_8 = 0; - __pyx_t_2 = 0; - __pyx_v_spline = ((PyObject*)__pyx_t_10); - __pyx_t_10 = 0; - - /* "fontTools/cu2qu/cu2qu.py":405 - * d1 = 0j - * spline = [cubic[0], next_q1] - * for i in range(1, n + 1): # <<<<<<<<<<<<<< - * # Current cubic to convert - * c0, c1, c2, c3 = next_cubic - */ - __pyx_t_11 = (__pyx_v_n + 1); - __pyx_t_12 = __pyx_t_11; - for (__pyx_t_13 = 1; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { - __pyx_v_i = __pyx_t_13; - - /* "fontTools/cu2qu/cu2qu.py":407 - * for i in range(1, n + 1): - * # Current cubic to convert - * c0, c1, c2, c3 = next_cubic # <<<<<<<<<<<<<< - * - * # Current quadratic approximation of current cubic - */ - if ((likely(PyTuple_CheckExact(__pyx_v_next_cubic))) || (PyList_CheckExact(__pyx_v_next_cubic))) { - PyObject* sequence = __pyx_v_next_cubic; - Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); - if (unlikely(size != 4)) { - if (size > 4) __Pyx_RaiseTooManyValuesError(4); - else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); - __PYX_ERR(0, 407, __pyx_L1_error) - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - if (likely(PyTuple_CheckExact(sequence))) { - __pyx_t_10 = PyTuple_GET_ITEM(sequence, 0); - __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); - __pyx_t_8 = PyTuple_GET_ITEM(sequence, 2); - __pyx_t_14 = PyTuple_GET_ITEM(sequence, 3); - } else { - __pyx_t_10 = PyList_GET_ITEM(sequence, 0); - __pyx_t_2 = PyList_GET_ITEM(sequence, 1); - __pyx_t_8 = PyList_GET_ITEM(sequence, 2); - __pyx_t_14 = PyList_GET_ITEM(sequence, 3); - } - __Pyx_INCREF(__pyx_t_10); - __Pyx_INCREF(__pyx_t_2); - __Pyx_INCREF(__pyx_t_8); - __Pyx_INCREF(__pyx_t_14); - #else - { - Py_ssize_t i; - PyObject** temps[4] = {&__pyx_t_10,&__pyx_t_2,&__pyx_t_8,&__pyx_t_14}; - for (i=0; i < 4; i++) { - PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) __PYX_ERR(0, 407, __pyx_L1_error) - __Pyx_GOTREF(item); - *(temps[i]) = item; - } - } - #endif - } else { - Py_ssize_t index = -1; - PyObject** temps[4] = {&__pyx_t_10,&__pyx_t_2,&__pyx_t_8,&__pyx_t_14}; - __pyx_t_15 = PyObject_GetIter(__pyx_v_next_cubic); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 407, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_15); - __pyx_t_16 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_15); - for (index=0; index < 4; index++) { - PyObject* item = __pyx_t_16(__pyx_t_15); if (unlikely(!item)) goto __pyx_L9_unpacking_failed; - __Pyx_GOTREF(item); - *(temps[index]) = item; - } - if (__Pyx_IternextUnpackEndCheck(__pyx_t_16(__pyx_t_15), 4) < 0) __PYX_ERR(0, 407, __pyx_L1_error) - __pyx_t_16 = NULL; - __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; - goto __pyx_L10_unpacking_done; - __pyx_L9_unpacking_failed:; - __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; - __pyx_t_16 = NULL; - if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); - __PYX_ERR(0, 407, __pyx_L1_error) - __pyx_L10_unpacking_done:; - } - __pyx_t_9 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_10); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 407, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - __pyx_t_4 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_2); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 407, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_5 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_8); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 407, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __pyx_t_6 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_14); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 407, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; - __pyx_v_c0 = __pyx_t_9; - __pyx_v_c1 = __pyx_t_4; - __pyx_v_c2 = __pyx_t_5; - __pyx_v_c3 = __pyx_t_6; - - /* "fontTools/cu2qu/cu2qu.py":410 - * - * # Current quadratic approximation of current cubic - * q0 = q2 # <<<<<<<<<<<<<< - * q1 = next_q1 - * if i < n: - */ - __pyx_v_q0 = __pyx_v_q2; - - /* "fontTools/cu2qu/cu2qu.py":411 - * # Current quadratic approximation of current cubic - * q0 = q2 - * q1 = next_q1 # <<<<<<<<<<<<<< - * if i < n: - * next_cubic = next(cubics) - */ - __pyx_v_q1 = __pyx_v_next_q1; - - /* "fontTools/cu2qu/cu2qu.py":412 - * q0 = q2 - * q1 = next_q1 - * if i < n: # <<<<<<<<<<<<<< - * next_cubic = next(cubics) - * next_q1 = cubic_approx_control( - */ - __pyx_t_1 = (__pyx_v_i < __pyx_v_n); - if (__pyx_t_1) { - - /* "fontTools/cu2qu/cu2qu.py":413 - * q1 = next_q1 - * if i < n: - * next_cubic = next(cubics) # <<<<<<<<<<<<<< - * next_q1 = cubic_approx_control( - * i / (n - 1), next_cubic[0], next_cubic[1], next_cubic[2], next_cubic[3] - */ - __pyx_t_14 = __Pyx_PyIter_Next(__pyx_v_cubics); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 413, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_14); - __Pyx_DECREF_SET(__pyx_v_next_cubic, __pyx_t_14); - __pyx_t_14 = 0; - - /* "fontTools/cu2qu/cu2qu.py":415 - * next_cubic = next(cubics) - * next_q1 = cubic_approx_control( - * i / (n - 1), next_cubic[0], next_cubic[1], next_cubic[2], next_cubic[3] # <<<<<<<<<<<<<< - * ) - * spline.append(next_q1) - */ - __pyx_t_17 = (__pyx_v_n - 1); - if (unlikely(__pyx_t_17 == 0)) { - PyErr_SetString(PyExc_ZeroDivisionError, "float division"); - __PYX_ERR(0, 415, __pyx_L1_error) - } - __pyx_t_14 = __Pyx_GetItemInt(__pyx_v_next_cubic, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 415, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_14); - __pyx_t_6 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_14); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 415, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; - __pyx_t_14 = __Pyx_GetItemInt(__pyx_v_next_cubic, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 415, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_14); - __pyx_t_5 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_14); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 415, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; - __pyx_t_14 = __Pyx_GetItemInt(__pyx_v_next_cubic, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 415, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_14); - __pyx_t_4 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_14); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 415, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; - __pyx_t_14 = __Pyx_GetItemInt(__pyx_v_next_cubic, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 415, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_14); - __pyx_t_9 = __Pyx_PyComplex_As___pyx_t_double_complex(__pyx_t_14); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 415, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; - - /* "fontTools/cu2qu/cu2qu.py":414 - * if i < n: - * next_cubic = next(cubics) - * next_q1 = cubic_approx_control( # <<<<<<<<<<<<<< - * i / (n - 1), next_cubic[0], next_cubic[1], next_cubic[2], next_cubic[3] - * ) - */ - __pyx_t_7 = __pyx_f_9fontTools_5cu2qu_5cu2qu_cubic_approx_control((((double)__pyx_v_i) / ((double)__pyx_t_17)), __pyx_t_6, __pyx_t_5, __pyx_t_4, __pyx_t_9); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 414, __pyx_L1_error) - __pyx_v_next_q1 = __pyx_t_7; - - /* "fontTools/cu2qu/cu2qu.py":417 - * i / (n - 1), next_cubic[0], next_cubic[1], next_cubic[2], next_cubic[3] - * ) - * spline.append(next_q1) # <<<<<<<<<<<<<< - * q2 = (q1 + next_q1) * 0.5 - * else: - */ - __pyx_t_14 = __pyx_PyComplex_FromComplex(__pyx_v_next_q1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 417, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_14); - __pyx_t_18 = __Pyx_PyList_Append(__pyx_v_spline, __pyx_t_14); if (unlikely(__pyx_t_18 == ((int)-1))) __PYX_ERR(0, 417, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; - - /* "fontTools/cu2qu/cu2qu.py":418 - * ) - * spline.append(next_q1) - * q2 = (q1 + next_q1) * 0.5 # <<<<<<<<<<<<<< - * else: - * q2 = c3 - */ - __pyx_v_q2 = __Pyx_c_prod_double(__Pyx_c_sum_double(__pyx_v_q1, __pyx_v_next_q1), __pyx_t_double_complex_from_parts(0.5, 0)); - - /* "fontTools/cu2qu/cu2qu.py":412 - * q0 = q2 - * q1 = next_q1 - * if i < n: # <<<<<<<<<<<<<< - * next_cubic = next(cubics) - * next_q1 = cubic_approx_control( - */ - goto __pyx_L11; - } - - /* "fontTools/cu2qu/cu2qu.py":420 - * q2 = (q1 + next_q1) * 0.5 - * else: - * q2 = c3 # <<<<<<<<<<<<<< - * - * # End-point deltas - */ - /*else*/ { - __pyx_v_q2 = __pyx_v_c3; - } - __pyx_L11:; - - /* "fontTools/cu2qu/cu2qu.py":423 - * - * # End-point deltas - * d0 = d1 # <<<<<<<<<<<<<< - * d1 = q2 - c3 - * - */ - __pyx_v_d0 = __pyx_v_d1; - - /* "fontTools/cu2qu/cu2qu.py":424 - * # End-point deltas - * d0 = d1 - * d1 = q2 - c3 # <<<<<<<<<<<<<< - * - * if abs(d1) > tolerance or not cubic_farthest_fit_inside( - */ - __pyx_v_d1 = __Pyx_c_diff_double(__pyx_v_q2, __pyx_v_c3); - - /* "fontTools/cu2qu/cu2qu.py":426 - * d1 = q2 - c3 - * - * if abs(d1) > tolerance or not cubic_farthest_fit_inside( # <<<<<<<<<<<<<< - * d0, - * q0 + (q1 - q0) * (2 / 3) - c1, - */ - __pyx_t_3 = (__Pyx_c_abs_double(__pyx_v_d1) > __pyx_v_tolerance); - if (!__pyx_t_3) { - } else { - __pyx_t_1 = __pyx_t_3; - goto __pyx_L13_bool_binop_done; - } - - /* "fontTools/cu2qu/cu2qu.py":431 - * q2 + (q1 - q2) * (2 / 3) - c2, - * d1, - * tolerance, # <<<<<<<<<<<<<< - * ): - * return None - */ - __pyx_t_19 = __pyx_f_9fontTools_5cu2qu_5cu2qu_cubic_farthest_fit_inside(__pyx_v_d0, __Pyx_c_diff_double(__Pyx_c_sum_double(__pyx_v_q0, __Pyx_c_prod_double(__Pyx_c_diff_double(__pyx_v_q1, __pyx_v_q0), __pyx_t_double_complex_from_parts((2.0 / 3.0), 0))), __pyx_v_c1), __Pyx_c_diff_double(__Pyx_c_sum_double(__pyx_v_q2, __Pyx_c_prod_double(__Pyx_c_diff_double(__pyx_v_q1, __pyx_v_q2), __pyx_t_double_complex_from_parts((2.0 / 3.0), 0))), __pyx_v_c2), __pyx_v_d1, __pyx_v_tolerance); if (unlikely(__pyx_t_19 == ((int)-1) && PyErr_Occurred())) __PYX_ERR(0, 426, __pyx_L1_error) - - /* "fontTools/cu2qu/cu2qu.py":426 - * d1 = q2 - c3 - * - * if abs(d1) > tolerance or not cubic_farthest_fit_inside( # <<<<<<<<<<<<<< - * d0, - * q0 + (q1 - q0) * (2 / 3) - c1, - */ - __pyx_t_3 = (!(__pyx_t_19 != 0)); - __pyx_t_1 = __pyx_t_3; - __pyx_L13_bool_binop_done:; - if (__pyx_t_1) { - - /* "fontTools/cu2qu/cu2qu.py":433 - * tolerance, - * ): - * return None # <<<<<<<<<<<<<< - * spline.append(cubic[3]) - * - */ - __Pyx_XDECREF(__pyx_r); - __pyx_r = Py_None; __Pyx_INCREF(Py_None); - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":426 - * d1 = q2 - c3 - * - * if abs(d1) > tolerance or not cubic_farthest_fit_inside( # <<<<<<<<<<<<<< - * d0, - * q0 + (q1 - q0) * (2 / 3) - c1, - */ - } - } - - /* "fontTools/cu2qu/cu2qu.py":434 - * ): - * return None - * spline.append(cubic[3]) # <<<<<<<<<<<<<< - * - * return spline - */ - __pyx_t_14 = __Pyx_GetItemInt(__pyx_v_cubic, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 434, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_14); - __pyx_t_18 = __Pyx_PyList_Append(__pyx_v_spline, __pyx_t_14); if (unlikely(__pyx_t_18 == ((int)-1))) __PYX_ERR(0, 434, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; - - /* "fontTools/cu2qu/cu2qu.py":436 - * spline.append(cubic[3]) - * - * return spline # <<<<<<<<<<<<<< - * - * - */ - __Pyx_XDECREF(__pyx_r); - __Pyx_INCREF(__pyx_v_spline); - __pyx_r = __pyx_v_spline; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":361 - * - * - * @cython.cfunc # <<<<<<<<<<<<<< - * @cython.locals(n=cython.int, tolerance=cython.double) - * @cython.locals(i=cython.int) - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_XDECREF(__pyx_t_10); - __Pyx_XDECREF(__pyx_t_14); - __Pyx_XDECREF(__pyx_t_15); - __Pyx_AddTraceback("fontTools.cu2qu.cu2qu.cubic_approx_spline", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = 0; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_cubics); - __Pyx_XDECREF(__pyx_v_next_cubic); - __Pyx_XDECREF(__pyx_v_spline); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "fontTools/cu2qu/cu2qu.py":439 - * - * - * @cython.locals(max_err=cython.double) # <<<<<<<<<<<<<< - * @cython.locals(n=cython.int) - * @cython.locals(all_quadratic=cython.int) - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_9fontTools_5cu2qu_5cu2qu_4curve_to_quadratic(PyObject *__pyx_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_9fontTools_5cu2qu_5cu2qu_3curve_to_quadratic, "curve_to_quadratic(curve, double max_err, int all_quadratic=True)\nApproximate a cubic Bezier curve with a spline of n quadratics.\n\n Args:\n cubic (sequence): Four 2D tuples representing control points of\n the cubic Bezier curve.\n max_err (double): Permitted deviation from the original curve.\n all_quadratic (bool): If True (default) returned value is a\n quadratic spline. If False, it's either a single quadratic\n curve or a single cubic curve.\n\n Returns:\n If all_quadratic is True: A list of 2D tuples, representing\n control points of the quadratic spline if it fits within the\n given tolerance, or ``None`` if no suitable spline could be\n calculated.\n\n If all_quadratic is False: Either a quadratic curve (if length\n of output is 3), or a cubic curve (if length of output is 4).\n "); -static PyMethodDef __pyx_mdef_9fontTools_5cu2qu_5cu2qu_4curve_to_quadratic = {"curve_to_quadratic", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_9fontTools_5cu2qu_5cu2qu_4curve_to_quadratic, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_9fontTools_5cu2qu_5cu2qu_3curve_to_quadratic}; -static PyObject *__pyx_pw_9fontTools_5cu2qu_5cu2qu_4curve_to_quadratic(PyObject *__pyx_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - PyObject *__pyx_v_curve = 0; - double __pyx_v_max_err; - int __pyx_v_all_quadratic; - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject* values[3] = {0,0,0}; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("curve_to_quadratic (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - { - PyObject **__pyx_pyargnames[] = {&__pyx_n_s_curve,&__pyx_n_s_max_err,&__pyx_n_s_all_quadratic,0}; - if (__pyx_kwds) { - Py_ssize_t kw_args; - switch (__pyx_nargs) { - case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); - switch (__pyx_nargs) { - case 0: - if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_curve)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 439, __pyx_L3_error) - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_max_err)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 439, __pyx_L3_error) - else { - __Pyx_RaiseArgtupleInvalid("curve_to_quadratic", 0, 2, 3, 1); __PYX_ERR(0, 439, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (kw_args > 0) { - PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_all_quadratic); - if (value) { values[2] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 439, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "curve_to_quadratic") < 0)) __PYX_ERR(0, 439, __pyx_L3_error) - } - } else { - switch (__pyx_nargs) { - case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); - values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - break; - default: goto __pyx_L5_argtuple_error; - } - } - __pyx_v_curve = values[0]; - __pyx_v_max_err = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_max_err == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 442, __pyx_L3_error) - if (values[2]) { - __pyx_v_all_quadratic = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_all_quadratic == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 442, __pyx_L3_error) - } else { - - /* "fontTools/cu2qu/cu2qu.py":442 - * @cython.locals(n=cython.int) - * @cython.locals(all_quadratic=cython.int) - * def curve_to_quadratic(curve, max_err, all_quadratic=True): # <<<<<<<<<<<<<< - * """Approximate a cubic Bezier curve with a spline of n quadratics. - * - */ - __pyx_v_all_quadratic = ((int)((int)1)); - } - } - goto __pyx_L6_skip; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("curve_to_quadratic", 0, 2, 3, __pyx_nargs); __PYX_ERR(0, 439, __pyx_L3_error) - __pyx_L6_skip:; - goto __pyx_L4_argument_unpacking_done; - __pyx_L3_error:; - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_AddTraceback("fontTools.cu2qu.cu2qu.curve_to_quadratic", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_9fontTools_5cu2qu_5cu2qu_3curve_to_quadratic(__pyx_self, __pyx_v_curve, __pyx_v_max_err, __pyx_v_all_quadratic); - - /* "fontTools/cu2qu/cu2qu.py":439 - * - * - * @cython.locals(max_err=cython.double) # <<<<<<<<<<<<<< - * @cython.locals(n=cython.int) - * @cython.locals(all_quadratic=cython.int) - */ - - /* function exit code */ - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_9fontTools_5cu2qu_5cu2qu_3curve_to_quadratic(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_curve, double __pyx_v_max_err, int __pyx_v_all_quadratic) { - int __pyx_v_n; - PyObject *__pyx_v_spline = NULL; - PyObject *__pyx_7genexpr__pyx_v_p = NULL; - PyObject *__pyx_8genexpr1__pyx_v_s = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - Py_ssize_t __pyx_t_3; - PyObject *(*__pyx_t_4)(PyObject *); - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - long __pyx_t_7; - long __pyx_t_8; - int __pyx_t_9; - int __pyx_t_10; - PyObject *__pyx_t_11 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("curve_to_quadratic", 0); - __Pyx_INCREF(__pyx_v_curve); - - /* "fontTools/cu2qu/cu2qu.py":463 - * """ - * - * curve = [complex(*p) for p in curve] # <<<<<<<<<<<<<< - * - * for n in range(1, MAX_N + 1): - */ - { /* enter inner scope */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 463, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_1); - if (likely(PyList_CheckExact(__pyx_v_curve)) || PyTuple_CheckExact(__pyx_v_curve)) { - __pyx_t_2 = __pyx_v_curve; __Pyx_INCREF(__pyx_t_2); - __pyx_t_3 = 0; - __pyx_t_4 = NULL; - } else { - __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_curve); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 463, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 463, __pyx_L5_error) - } - for (;;) { - if (likely(!__pyx_t_4)) { - if (likely(PyList_CheckExact(__pyx_t_2))) { - { - Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2); - #if !CYTHON_ASSUME_SAFE_MACROS - if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 463, __pyx_L5_error) - #endif - if (__pyx_t_3 >= __pyx_temp) break; - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(0, 463, __pyx_L5_error) - #else - __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 463, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_5); - #endif - } else { - { - Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_2); - #if !CYTHON_ASSUME_SAFE_MACROS - if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 463, __pyx_L5_error) - #endif - if (__pyx_t_3 >= __pyx_temp) break; - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(0, 463, __pyx_L5_error) - #else - __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 463, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_5); - #endif - } - } else { - __pyx_t_5 = __pyx_t_4(__pyx_t_2); - if (unlikely(!__pyx_t_5)) { - PyObject* exc_type = PyErr_Occurred(); - if (exc_type) { - if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 463, __pyx_L5_error) - } - break; - } - __Pyx_GOTREF(__pyx_t_5); - } - __Pyx_XDECREF_SET(__pyx_7genexpr__pyx_v_p, __pyx_t_5); - __pyx_t_5 = 0; - __pyx_t_5 = __Pyx_PySequence_Tuple(__pyx_7genexpr__pyx_v_p); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 463, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)(&PyComplex_Type)), __pyx_t_5, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 463, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_6))) __PYX_ERR(0, 463, __pyx_L5_error) - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - } - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_XDECREF(__pyx_7genexpr__pyx_v_p); __pyx_7genexpr__pyx_v_p = 0; - goto __pyx_L9_exit_scope; - __pyx_L5_error:; - __Pyx_XDECREF(__pyx_7genexpr__pyx_v_p); __pyx_7genexpr__pyx_v_p = 0; - goto __pyx_L1_error; - __pyx_L9_exit_scope:; - } /* exit inner scope */ - __Pyx_DECREF_SET(__pyx_v_curve, __pyx_t_1); - __pyx_t_1 = 0; - - /* "fontTools/cu2qu/cu2qu.py":465 - * curve = [complex(*p) for p in curve] - * - * for n in range(1, MAX_N + 1): # <<<<<<<<<<<<<< - * spline = cubic_approx_spline(curve, n, max_err, all_quadratic) - * if spline is not None: - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_MAX_N); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 465, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __Pyx_PyInt_AddObjC(__pyx_t_1, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 465, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __pyx_t_7 = __Pyx_PyInt_As_long(__pyx_t_2); if (unlikely((__pyx_t_7 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 465, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_8 = __pyx_t_7; - for (__pyx_t_9 = 1; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) { - __pyx_v_n = __pyx_t_9; - - /* "fontTools/cu2qu/cu2qu.py":466 - * - * for n in range(1, MAX_N + 1): - * spline = cubic_approx_spline(curve, n, max_err, all_quadratic) # <<<<<<<<<<<<<< - * if spline is not None: - * # done. go home - */ - __pyx_t_2 = __pyx_f_9fontTools_5cu2qu_5cu2qu_cubic_approx_spline(__pyx_v_curve, __pyx_v_n, __pyx_v_max_err, __pyx_v_all_quadratic); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 466, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_XDECREF_SET(__pyx_v_spline, __pyx_t_2); - __pyx_t_2 = 0; - - /* "fontTools/cu2qu/cu2qu.py":467 - * for n in range(1, MAX_N + 1): - * spline = cubic_approx_spline(curve, n, max_err, all_quadratic) - * if spline is not None: # <<<<<<<<<<<<<< - * # done. go home - * return [(s.real, s.imag) for s in spline] - */ - __pyx_t_10 = (__pyx_v_spline != Py_None); - if (__pyx_t_10) { - - /* "fontTools/cu2qu/cu2qu.py":469 - * if spline is not None: - * # done. go home - * return [(s.real, s.imag) for s in spline] # <<<<<<<<<<<<<< - * - * raise ApproxNotFoundError(curve) - */ - __Pyx_XDECREF(__pyx_r); - { /* enter inner scope */ - __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 469, __pyx_L15_error) - __Pyx_GOTREF(__pyx_t_2); - if (likely(PyList_CheckExact(__pyx_v_spline)) || PyTuple_CheckExact(__pyx_v_spline)) { - __pyx_t_1 = __pyx_v_spline; __Pyx_INCREF(__pyx_t_1); - __pyx_t_3 = 0; - __pyx_t_4 = NULL; - } else { - __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_spline); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 469, __pyx_L15_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_4 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 469, __pyx_L15_error) - } - for (;;) { - if (likely(!__pyx_t_4)) { - if (likely(PyList_CheckExact(__pyx_t_1))) { - { - Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1); - #if !CYTHON_ASSUME_SAFE_MACROS - if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 469, __pyx_L15_error) - #endif - if (__pyx_t_3 >= __pyx_temp) break; - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_6); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(0, 469, __pyx_L15_error) - #else - __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 469, __pyx_L15_error) - __Pyx_GOTREF(__pyx_t_6); - #endif - } else { - { - Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_1); - #if !CYTHON_ASSUME_SAFE_MACROS - if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 469, __pyx_L15_error) - #endif - if (__pyx_t_3 >= __pyx_temp) break; - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_6); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(0, 469, __pyx_L15_error) - #else - __pyx_t_6 = __Pyx_PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 469, __pyx_L15_error) - __Pyx_GOTREF(__pyx_t_6); - #endif - } - } else { - __pyx_t_6 = __pyx_t_4(__pyx_t_1); - if (unlikely(!__pyx_t_6)) { - PyObject* exc_type = PyErr_Occurred(); - if (exc_type) { - if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 469, __pyx_L15_error) - } - break; - } - __Pyx_GOTREF(__pyx_t_6); - } - __Pyx_XDECREF_SET(__pyx_8genexpr1__pyx_v_s, __pyx_t_6); - __pyx_t_6 = 0; - __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_8genexpr1__pyx_v_s, __pyx_n_s_real); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 469, __pyx_L15_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_8genexpr1__pyx_v_s, __pyx_n_s_imag); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 469, __pyx_L15_error) - __Pyx_GOTREF(__pyx_t_5); - __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 469, __pyx_L15_error) - __Pyx_GOTREF(__pyx_t_11); - __Pyx_GIVEREF(__pyx_t_6); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_6)) __PYX_ERR(0, 469, __pyx_L15_error); - __Pyx_GIVEREF(__pyx_t_5); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_5)) __PYX_ERR(0, 469, __pyx_L15_error); - __pyx_t_6 = 0; - __pyx_t_5 = 0; - if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_11))) __PYX_ERR(0, 469, __pyx_L15_error) - __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; - } - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_8genexpr1__pyx_v_s); __pyx_8genexpr1__pyx_v_s = 0; - goto __pyx_L19_exit_scope; - __pyx_L15_error:; - __Pyx_XDECREF(__pyx_8genexpr1__pyx_v_s); __pyx_8genexpr1__pyx_v_s = 0; - goto __pyx_L1_error; - __pyx_L19_exit_scope:; - } /* exit inner scope */ - __pyx_r = __pyx_t_2; - __pyx_t_2 = 0; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":467 - * for n in range(1, MAX_N + 1): - * spline = cubic_approx_spline(curve, n, max_err, all_quadratic) - * if spline is not None: # <<<<<<<<<<<<<< - * # done. go home - * return [(s.real, s.imag) for s in spline] - */ - } - } - - /* "fontTools/cu2qu/cu2qu.py":471 - * return [(s.real, s.imag) for s in spline] - * - * raise ApproxNotFoundError(curve) # <<<<<<<<<<<<<< - * - * - */ - __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_ApproxNotFoundError); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 471, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_11 = NULL; - __pyx_t_9 = 0; - #if CYTHON_UNPACK_METHODS - if (unlikely(PyMethod_Check(__pyx_t_1))) { - __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_1); - if (likely(__pyx_t_11)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); - __Pyx_INCREF(__pyx_t_11); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_1, function); - __pyx_t_9 = 1; - } - } - #endif - { - PyObject *__pyx_callargs[2] = {__pyx_t_11, __pyx_v_curve}; - __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_1, __pyx_callargs+1-__pyx_t_9, 1+__pyx_t_9); - __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 471, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - } - __Pyx_Raise(__pyx_t_2, 0, 0, 0); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __PYX_ERR(0, 471, __pyx_L1_error) - - /* "fontTools/cu2qu/cu2qu.py":439 - * - * - * @cython.locals(max_err=cython.double) # <<<<<<<<<<<<<< - * @cython.locals(n=cython.int) - * @cython.locals(all_quadratic=cython.int) - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_11); - __Pyx_AddTraceback("fontTools.cu2qu.cu2qu.curve_to_quadratic", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_spline); - __Pyx_XDECREF(__pyx_7genexpr__pyx_v_p); - __Pyx_XDECREF(__pyx_8genexpr1__pyx_v_s); - __Pyx_XDECREF(__pyx_v_curve); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -/* "fontTools/cu2qu/cu2qu.py":474 - * - * - * @cython.locals(l=cython.int, last_i=cython.int, i=cython.int) # <<<<<<<<<<<<<< - * @cython.locals(all_quadratic=cython.int) - * def curves_to_quadratic(curves, max_errors, all_quadratic=True): - */ - -/* Python wrapper */ -static PyObject *__pyx_pw_9fontTools_5cu2qu_5cu2qu_6curves_to_quadratic(PyObject *__pyx_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -); /*proto*/ -PyDoc_STRVAR(__pyx_doc_9fontTools_5cu2qu_5cu2qu_5curves_to_quadratic, "curves_to_quadratic(curves, max_errors, int all_quadratic=True)\nReturn quadratic Bezier splines approximating the input cubic Beziers.\n\n Args:\n curves: A sequence of *n* curves, each curve being a sequence of four\n 2D tuples.\n max_errors: A sequence of *n* floats representing the maximum permissible\n deviation from each of the cubic Bezier curves.\n all_quadratic (bool): If True (default) returned values are a\n quadratic spline. If False, they are either a single quadratic\n curve or a single cubic curve.\n\n Example::\n\n >>> curves_to_quadratic( [\n ... [ (50,50), (100,100), (150,100), (200,50) ],\n ... [ (75,50), (120,100), (150,75), (200,60) ]\n ... ], [1,1] )\n [[(50.0, 50.0), (75.0, 75.0), (125.0, 91.66666666666666), (175.0, 75.0), (200.0, 50.0)], [(75.0, 50.0), (97.5, 75.0), (135.41666666666666, 82.08333333333333), (175.0, 67.5), (200.0, 60.0)]]\n\n The returned splines have \"implied oncurve points\" suitable for use in\n TrueType ``glif`` outlines - i.e. in the first spline returned above,\n the first quadratic segment runs from (50,50) to\n ( (75 + 125)/2 , (120 + 91.666..)/2 ) = (100, 83.333...).\n\n Returns:\n If all_quadratic is True, a list of splines, each spline being a list\n of 2D tuples.\n\n If all_quadratic is False, a list of curves, each curve being a quadratic\n (length 3), or cubic (length 4).\n\n Raises:\n fontTools.cu2qu.Errors.ApproxNotFoundError: if no suitable approximation\n can be found for all curves with the given parameters.\n "); -static PyMethodDef __pyx_mdef_9fontTools_5cu2qu_5cu2qu_6curves_to_quadratic = {"curves_to_quadratic", (PyCFunction)(void*)(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_9fontTools_5cu2qu_5cu2qu_6curves_to_quadratic, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_9fontTools_5cu2qu_5cu2qu_5curves_to_quadratic}; -static PyObject *__pyx_pw_9fontTools_5cu2qu_5cu2qu_6curves_to_quadratic(PyObject *__pyx_self, -#if CYTHON_METH_FASTCALL -PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds -#else -PyObject *__pyx_args, PyObject *__pyx_kwds -#endif -) { - PyObject *__pyx_v_curves = 0; - PyObject *__pyx_v_max_errors = 0; - int __pyx_v_all_quadratic; - #if !CYTHON_METH_FASTCALL - CYTHON_UNUSED Py_ssize_t __pyx_nargs; - #endif - CYTHON_UNUSED PyObject *const *__pyx_kwvalues; - PyObject* values[3] = {0,0,0}; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - PyObject *__pyx_r = 0; - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("curves_to_quadratic (wrapper)", 0); - #if !CYTHON_METH_FASTCALL - #if CYTHON_ASSUME_SAFE_MACROS - __pyx_nargs = PyTuple_GET_SIZE(__pyx_args); - #else - __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL; - #endif - #endif - __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs); - { - PyObject **__pyx_pyargnames[] = {&__pyx_n_s_curves,&__pyx_n_s_max_errors,&__pyx_n_s_all_quadratic,0}; - if (__pyx_kwds) { - Py_ssize_t kw_args; - switch (__pyx_nargs) { - case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); - CYTHON_FALLTHROUGH; - case 1: values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - CYTHON_FALLTHROUGH; - case 0: break; - default: goto __pyx_L5_argtuple_error; - } - kw_args = __Pyx_NumKwargs_FASTCALL(__pyx_kwds); - switch (__pyx_nargs) { - case 0: - if (likely((values[0] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_curves)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[0]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 474, __pyx_L3_error) - else goto __pyx_L5_argtuple_error; - CYTHON_FALLTHROUGH; - case 1: - if (likely((values[1] = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_max_errors)) != 0)) { - (void)__Pyx_Arg_NewRef_FASTCALL(values[1]); - kw_args--; - } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 474, __pyx_L3_error) - else { - __Pyx_RaiseArgtupleInvalid("curves_to_quadratic", 0, 2, 3, 1); __PYX_ERR(0, 474, __pyx_L3_error) - } - CYTHON_FALLTHROUGH; - case 2: - if (kw_args > 0) { - PyObject* value = __Pyx_GetKwValue_FASTCALL(__pyx_kwds, __pyx_kwvalues, __pyx_n_s_all_quadratic); - if (value) { values[2] = __Pyx_Arg_NewRef_FASTCALL(value); kw_args--; } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 474, __pyx_L3_error) - } - } - if (unlikely(kw_args > 0)) { - const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "curves_to_quadratic") < 0)) __PYX_ERR(0, 474, __pyx_L3_error) - } - } else { - switch (__pyx_nargs) { - case 3: values[2] = __Pyx_Arg_FASTCALL(__pyx_args, 2); - CYTHON_FALLTHROUGH; - case 2: values[1] = __Pyx_Arg_FASTCALL(__pyx_args, 1); - values[0] = __Pyx_Arg_FASTCALL(__pyx_args, 0); - break; - default: goto __pyx_L5_argtuple_error; - } - } - __pyx_v_curves = values[0]; - __pyx_v_max_errors = values[1]; - if (values[2]) { - __pyx_v_all_quadratic = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_all_quadratic == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 476, __pyx_L3_error) - } else { - - /* "fontTools/cu2qu/cu2qu.py":476 - * @cython.locals(l=cython.int, last_i=cython.int, i=cython.int) - * @cython.locals(all_quadratic=cython.int) - * def curves_to_quadratic(curves, max_errors, all_quadratic=True): # <<<<<<<<<<<<<< - * """Return quadratic Bezier splines approximating the input cubic Beziers. - * - */ - __pyx_v_all_quadratic = ((int)((int)1)); - } - } - goto __pyx_L6_skip; - __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("curves_to_quadratic", 0, 2, 3, __pyx_nargs); __PYX_ERR(0, 474, __pyx_L3_error) - __pyx_L6_skip:; - goto __pyx_L4_argument_unpacking_done; - __pyx_L3_error:; - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_AddTraceback("fontTools.cu2qu.cu2qu.curves_to_quadratic", __pyx_clineno, __pyx_lineno, __pyx_filename); - __Pyx_RefNannyFinishContext(); - return NULL; - __pyx_L4_argument_unpacking_done:; - __pyx_r = __pyx_pf_9fontTools_5cu2qu_5cu2qu_5curves_to_quadratic(__pyx_self, __pyx_v_curves, __pyx_v_max_errors, __pyx_v_all_quadratic); - - /* "fontTools/cu2qu/cu2qu.py":474 - * - * - * @cython.locals(l=cython.int, last_i=cython.int, i=cython.int) # <<<<<<<<<<<<<< - * @cython.locals(all_quadratic=cython.int) - * def curves_to_quadratic(curves, max_errors, all_quadratic=True): - */ - - /* function exit code */ - { - Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) { - __Pyx_Arg_XDECREF_FASTCALL(values[__pyx_temp]); - } - } - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -static PyObject *__pyx_pf_9fontTools_5cu2qu_5cu2qu_5curves_to_quadratic(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_curves, PyObject *__pyx_v_max_errors, int __pyx_v_all_quadratic) { - int __pyx_v_l; - int __pyx_v_last_i; - int __pyx_v_i; - PyObject *__pyx_v_splines = NULL; - PyObject *__pyx_v_n = NULL; - PyObject *__pyx_v_spline = NULL; - PyObject *__pyx_8genexpr2__pyx_v_curve = NULL; - PyObject *__pyx_8genexpr3__pyx_v_p = NULL; - PyObject *__pyx_8genexpr4__pyx_v_spline = NULL; - PyObject *__pyx_8genexpr5__pyx_v_s = NULL; - PyObject *__pyx_r = NULL; - __Pyx_RefNannyDeclarations - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - Py_ssize_t __pyx_t_3; - PyObject *(*__pyx_t_4)(PyObject *); - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - Py_ssize_t __pyx_t_7; - PyObject *(*__pyx_t_8)(PyObject *); - PyObject *__pyx_t_9 = NULL; - PyObject *__pyx_t_10 = NULL; - int __pyx_t_11; - int __pyx_t_12; - double __pyx_t_13; - long __pyx_t_14; - PyObject *__pyx_t_15 = NULL; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("curves_to_quadratic", 0); - __Pyx_INCREF(__pyx_v_curves); - - /* "fontTools/cu2qu/cu2qu.py":513 - * """ - * - * curves = [[complex(*p) for p in curve] for curve in curves] # <<<<<<<<<<<<<< - * assert len(max_errors) == len(curves) - * - */ - { /* enter inner scope */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 513, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_1); - if (likely(PyList_CheckExact(__pyx_v_curves)) || PyTuple_CheckExact(__pyx_v_curves)) { - __pyx_t_2 = __pyx_v_curves; __Pyx_INCREF(__pyx_t_2); - __pyx_t_3 = 0; - __pyx_t_4 = NULL; - } else { - __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_curves); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 513, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_4 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 513, __pyx_L5_error) - } - for (;;) { - if (likely(!__pyx_t_4)) { - if (likely(PyList_CheckExact(__pyx_t_2))) { - { - Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2); - #if !CYTHON_ASSUME_SAFE_MACROS - if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 513, __pyx_L5_error) - #endif - if (__pyx_t_3 >= __pyx_temp) break; - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(0, 513, __pyx_L5_error) - #else - __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 513, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_5); - #endif - } else { - { - Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_2); - #if !CYTHON_ASSUME_SAFE_MACROS - if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 513, __pyx_L5_error) - #endif - if (__pyx_t_3 >= __pyx_temp) break; - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(0, 513, __pyx_L5_error) - #else - __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 513, __pyx_L5_error) - __Pyx_GOTREF(__pyx_t_5); - #endif - } - } else { - __pyx_t_5 = __pyx_t_4(__pyx_t_2); - if (unlikely(!__pyx_t_5)) { - PyObject* exc_type = PyErr_Occurred(); - if (exc_type) { - if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 513, __pyx_L5_error) - } - break; - } - __Pyx_GOTREF(__pyx_t_5); - } - __Pyx_XDECREF_SET(__pyx_8genexpr2__pyx_v_curve, __pyx_t_5); - __pyx_t_5 = 0; - { /* enter inner scope */ - __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 513, __pyx_L10_error) - __Pyx_GOTREF(__pyx_t_5); - if (likely(PyList_CheckExact(__pyx_8genexpr2__pyx_v_curve)) || PyTuple_CheckExact(__pyx_8genexpr2__pyx_v_curve)) { - __pyx_t_6 = __pyx_8genexpr2__pyx_v_curve; __Pyx_INCREF(__pyx_t_6); - __pyx_t_7 = 0; - __pyx_t_8 = NULL; - } else { - __pyx_t_7 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_8genexpr2__pyx_v_curve); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 513, __pyx_L10_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_8 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_6); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 513, __pyx_L10_error) - } - for (;;) { - if (likely(!__pyx_t_8)) { - if (likely(PyList_CheckExact(__pyx_t_6))) { - { - Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_6); - #if !CYTHON_ASSUME_SAFE_MACROS - if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 513, __pyx_L10_error) - #endif - if (__pyx_t_7 >= __pyx_temp) break; - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_9 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely((0 < 0))) __PYX_ERR(0, 513, __pyx_L10_error) - #else - __pyx_t_9 = __Pyx_PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 513, __pyx_L10_error) - __Pyx_GOTREF(__pyx_t_9); - #endif - } else { - { - Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_6); - #if !CYTHON_ASSUME_SAFE_MACROS - if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 513, __pyx_L10_error) - #endif - if (__pyx_t_7 >= __pyx_temp) break; - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_9); __pyx_t_7++; if (unlikely((0 < 0))) __PYX_ERR(0, 513, __pyx_L10_error) - #else - __pyx_t_9 = __Pyx_PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 513, __pyx_L10_error) - __Pyx_GOTREF(__pyx_t_9); - #endif - } - } else { - __pyx_t_9 = __pyx_t_8(__pyx_t_6); - if (unlikely(!__pyx_t_9)) { - PyObject* exc_type = PyErr_Occurred(); - if (exc_type) { - if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 513, __pyx_L10_error) - } - break; - } - __Pyx_GOTREF(__pyx_t_9); - } - __Pyx_XDECREF_SET(__pyx_8genexpr3__pyx_v_p, __pyx_t_9); - __pyx_t_9 = 0; - __pyx_t_9 = __Pyx_PySequence_Tuple(__pyx_8genexpr3__pyx_v_p); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 513, __pyx_L10_error) - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_10 = __Pyx_PyObject_Call(((PyObject *)(&PyComplex_Type)), __pyx_t_9, NULL); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 513, __pyx_L10_error) - __Pyx_GOTREF(__pyx_t_10); - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - if (unlikely(__Pyx_ListComp_Append(__pyx_t_5, (PyObject*)__pyx_t_10))) __PYX_ERR(0, 513, __pyx_L10_error) - __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; - } - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_XDECREF(__pyx_8genexpr3__pyx_v_p); __pyx_8genexpr3__pyx_v_p = 0; - goto __pyx_L14_exit_scope; - __pyx_L10_error:; - __Pyx_XDECREF(__pyx_8genexpr3__pyx_v_p); __pyx_8genexpr3__pyx_v_p = 0; - goto __pyx_L5_error; - __pyx_L14_exit_scope:; - } /* exit inner scope */ - if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(0, 513, __pyx_L5_error) - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - } - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_XDECREF(__pyx_8genexpr2__pyx_v_curve); __pyx_8genexpr2__pyx_v_curve = 0; - goto __pyx_L16_exit_scope; - __pyx_L5_error:; - __Pyx_XDECREF(__pyx_8genexpr2__pyx_v_curve); __pyx_8genexpr2__pyx_v_curve = 0; - goto __pyx_L1_error; - __pyx_L16_exit_scope:; - } /* exit inner scope */ - __Pyx_DECREF_SET(__pyx_v_curves, __pyx_t_1); - __pyx_t_1 = 0; - - /* "fontTools/cu2qu/cu2qu.py":514 - * - * curves = [[complex(*p) for p in curve] for curve in curves] - * assert len(max_errors) == len(curves) # <<<<<<<<<<<<<< - * - * l = len(curves) - */ - #ifndef CYTHON_WITHOUT_ASSERTIONS - if (unlikely(__pyx_assertions_enabled())) { - __pyx_t_3 = PyObject_Length(__pyx_v_max_errors); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(0, 514, __pyx_L1_error) - __pyx_t_7 = PyObject_Length(__pyx_v_curves); if (unlikely(__pyx_t_7 == ((Py_ssize_t)-1))) __PYX_ERR(0, 514, __pyx_L1_error) - __pyx_t_11 = (__pyx_t_3 == __pyx_t_7); - if (unlikely(!__pyx_t_11)) { - __Pyx_Raise(__pyx_builtin_AssertionError, 0, 0, 0); - __PYX_ERR(0, 514, __pyx_L1_error) - } - } - #else - if ((1)); else __PYX_ERR(0, 514, __pyx_L1_error) - #endif - - /* "fontTools/cu2qu/cu2qu.py":516 - * assert len(max_errors) == len(curves) - * - * l = len(curves) # <<<<<<<<<<<<<< - * splines = [None] * l - * last_i = i = 0 - */ - __pyx_t_7 = PyObject_Length(__pyx_v_curves); if (unlikely(__pyx_t_7 == ((Py_ssize_t)-1))) __PYX_ERR(0, 516, __pyx_L1_error) - __pyx_v_l = __pyx_t_7; - - /* "fontTools/cu2qu/cu2qu.py":517 - * - * l = len(curves) - * splines = [None] * l # <<<<<<<<<<<<<< - * last_i = i = 0 - * n = 1 - */ - __pyx_t_1 = PyList_New(1 * ((__pyx_v_l<0) ? 0:__pyx_v_l)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 517, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - { Py_ssize_t __pyx_temp; - for (__pyx_temp=0; __pyx_temp < __pyx_v_l; __pyx_temp++) { - __Pyx_INCREF(Py_None); - __Pyx_GIVEREF(Py_None); - if (__Pyx_PyList_SET_ITEM(__pyx_t_1, __pyx_temp, Py_None)) __PYX_ERR(0, 517, __pyx_L1_error); - } - } - __pyx_v_splines = ((PyObject*)__pyx_t_1); - __pyx_t_1 = 0; - - /* "fontTools/cu2qu/cu2qu.py":518 - * l = len(curves) - * splines = [None] * l - * last_i = i = 0 # <<<<<<<<<<<<<< - * n = 1 - * while True: - */ - __pyx_v_last_i = 0; - __pyx_v_i = 0; - - /* "fontTools/cu2qu/cu2qu.py":519 - * splines = [None] * l - * last_i = i = 0 - * n = 1 # <<<<<<<<<<<<<< - * while True: - * spline = cubic_approx_spline(curves[i], n, max_errors[i], all_quadratic) - */ - __Pyx_INCREF(__pyx_int_1); - __pyx_v_n = __pyx_int_1; - - /* "fontTools/cu2qu/cu2qu.py":520 - * last_i = i = 0 - * n = 1 - * while True: # <<<<<<<<<<<<<< - * spline = cubic_approx_spline(curves[i], n, max_errors[i], all_quadratic) - * if spline is None: - */ - while (1) { - - /* "fontTools/cu2qu/cu2qu.py":521 - * n = 1 - * while True: - * spline = cubic_approx_spline(curves[i], n, max_errors[i], all_quadratic) # <<<<<<<<<<<<<< - * if spline is None: - * if n == MAX_N: - */ - __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_curves, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 521, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_12 = __Pyx_PyInt_As_int(__pyx_v_n); if (unlikely((__pyx_t_12 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 521, __pyx_L1_error) - __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_max_errors, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 521, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_13 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely((__pyx_t_13 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 521, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __pyx_f_9fontTools_5cu2qu_5cu2qu_cubic_approx_spline(__pyx_t_1, __pyx_t_12, __pyx_t_13, __pyx_v_all_quadratic); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 521, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF_SET(__pyx_v_spline, __pyx_t_2); - __pyx_t_2 = 0; - - /* "fontTools/cu2qu/cu2qu.py":522 - * while True: - * spline = cubic_approx_spline(curves[i], n, max_errors[i], all_quadratic) - * if spline is None: # <<<<<<<<<<<<<< - * if n == MAX_N: - * break - */ - __pyx_t_11 = (__pyx_v_spline == Py_None); - if (__pyx_t_11) { - - /* "fontTools/cu2qu/cu2qu.py":523 - * spline = cubic_approx_spline(curves[i], n, max_errors[i], all_quadratic) - * if spline is None: - * if n == MAX_N: # <<<<<<<<<<<<<< - * break - * n += 1 - */ - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_MAX_N); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 523, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_1 = PyObject_RichCompare(__pyx_v_n, __pyx_t_2, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 523, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_11 < 0))) __PYX_ERR(0, 523, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - if (__pyx_t_11) { - - /* "fontTools/cu2qu/cu2qu.py":524 - * if spline is None: - * if n == MAX_N: - * break # <<<<<<<<<<<<<< - * n += 1 - * last_i = i - */ - goto __pyx_L18_break; - - /* "fontTools/cu2qu/cu2qu.py":523 - * spline = cubic_approx_spline(curves[i], n, max_errors[i], all_quadratic) - * if spline is None: - * if n == MAX_N: # <<<<<<<<<<<<<< - * break - * n += 1 - */ - } - - /* "fontTools/cu2qu/cu2qu.py":525 - * if n == MAX_N: - * break - * n += 1 # <<<<<<<<<<<<<< - * last_i = i - * continue - */ - __pyx_t_1 = __Pyx_PyInt_AddObjC(__pyx_v_n, __pyx_int_1, 1, 1, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 525, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF_SET(__pyx_v_n, __pyx_t_1); - __pyx_t_1 = 0; - - /* "fontTools/cu2qu/cu2qu.py":526 - * break - * n += 1 - * last_i = i # <<<<<<<<<<<<<< - * continue - * splines[i] = spline - */ - __pyx_v_last_i = __pyx_v_i; - - /* "fontTools/cu2qu/cu2qu.py":527 - * n += 1 - * last_i = i - * continue # <<<<<<<<<<<<<< - * splines[i] = spline - * i = (i + 1) % l - */ - goto __pyx_L17_continue; - - /* "fontTools/cu2qu/cu2qu.py":522 - * while True: - * spline = cubic_approx_spline(curves[i], n, max_errors[i], all_quadratic) - * if spline is None: # <<<<<<<<<<<<<< - * if n == MAX_N: - * break - */ - } - - /* "fontTools/cu2qu/cu2qu.py":528 - * last_i = i - * continue - * splines[i] = spline # <<<<<<<<<<<<<< - * i = (i + 1) % l - * if i == last_i: - */ - if (unlikely((__Pyx_SetItemInt(__pyx_v_splines, __pyx_v_i, __pyx_v_spline, int, 1, __Pyx_PyInt_From_int, 1, 1, 1) < 0))) __PYX_ERR(0, 528, __pyx_L1_error) - - /* "fontTools/cu2qu/cu2qu.py":529 - * continue - * splines[i] = spline - * i = (i + 1) % l # <<<<<<<<<<<<<< - * if i == last_i: - * # done. go home - */ - __pyx_t_14 = (__pyx_v_i + 1); - if (unlikely(__pyx_v_l == 0)) { - PyErr_SetString(PyExc_ZeroDivisionError, "integer division or modulo by zero"); - __PYX_ERR(0, 529, __pyx_L1_error) - } - __pyx_v_i = __Pyx_mod_long(__pyx_t_14, __pyx_v_l); - - /* "fontTools/cu2qu/cu2qu.py":530 - * splines[i] = spline - * i = (i + 1) % l - * if i == last_i: # <<<<<<<<<<<<<< - * # done. go home - * return [[(s.real, s.imag) for s in spline] for spline in splines] - */ - __pyx_t_11 = (__pyx_v_i == __pyx_v_last_i); - if (__pyx_t_11) { - - /* "fontTools/cu2qu/cu2qu.py":532 - * if i == last_i: - * # done. go home - * return [[(s.real, s.imag) for s in spline] for spline in splines] # <<<<<<<<<<<<<< - * - * raise ApproxNotFoundError(curves) - */ - __Pyx_XDECREF(__pyx_r); - { /* enter inner scope */ - __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 532, __pyx_L24_error) - __Pyx_GOTREF(__pyx_t_1); - __pyx_t_2 = __pyx_v_splines; __Pyx_INCREF(__pyx_t_2); - __pyx_t_7 = 0; - for (;;) { - { - Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_2); - #if !CYTHON_ASSUME_SAFE_MACROS - if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 532, __pyx_L24_error) - #endif - if (__pyx_t_7 >= __pyx_temp) break; - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely((0 < 0))) __PYX_ERR(0, 532, __pyx_L24_error) - #else - __pyx_t_5 = __Pyx_PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 532, __pyx_L24_error) - __Pyx_GOTREF(__pyx_t_5); - #endif - __Pyx_XDECREF_SET(__pyx_8genexpr4__pyx_v_spline, __pyx_t_5); - __pyx_t_5 = 0; - { /* enter inner scope */ - __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 532, __pyx_L29_error) - __Pyx_GOTREF(__pyx_t_5); - if (likely(PyList_CheckExact(__pyx_8genexpr4__pyx_v_spline)) || PyTuple_CheckExact(__pyx_8genexpr4__pyx_v_spline)) { - __pyx_t_6 = __pyx_8genexpr4__pyx_v_spline; __Pyx_INCREF(__pyx_t_6); - __pyx_t_3 = 0; - __pyx_t_4 = NULL; - } else { - __pyx_t_3 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_8genexpr4__pyx_v_spline); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 532, __pyx_L29_error) - __Pyx_GOTREF(__pyx_t_6); - __pyx_t_4 = __Pyx_PyObject_GetIterNextFunc(__pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 532, __pyx_L29_error) - } - for (;;) { - if (likely(!__pyx_t_4)) { - if (likely(PyList_CheckExact(__pyx_t_6))) { - { - Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_6); - #if !CYTHON_ASSUME_SAFE_MACROS - if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 532, __pyx_L29_error) - #endif - if (__pyx_t_3 >= __pyx_temp) break; - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_10 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_3); __Pyx_INCREF(__pyx_t_10); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(0, 532, __pyx_L29_error) - #else - __pyx_t_10 = __Pyx_PySequence_ITEM(__pyx_t_6, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 532, __pyx_L29_error) - __Pyx_GOTREF(__pyx_t_10); - #endif - } else { - { - Py_ssize_t __pyx_temp = __Pyx_PyTuple_GET_SIZE(__pyx_t_6); - #if !CYTHON_ASSUME_SAFE_MACROS - if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 532, __pyx_L29_error) - #endif - if (__pyx_t_3 >= __pyx_temp) break; - } - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_3); __Pyx_INCREF(__pyx_t_10); __pyx_t_3++; if (unlikely((0 < 0))) __PYX_ERR(0, 532, __pyx_L29_error) - #else - __pyx_t_10 = __Pyx_PySequence_ITEM(__pyx_t_6, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 532, __pyx_L29_error) - __Pyx_GOTREF(__pyx_t_10); - #endif - } - } else { - __pyx_t_10 = __pyx_t_4(__pyx_t_6); - if (unlikely(!__pyx_t_10)) { - PyObject* exc_type = PyErr_Occurred(); - if (exc_type) { - if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear(); - else __PYX_ERR(0, 532, __pyx_L29_error) - } - break; - } - __Pyx_GOTREF(__pyx_t_10); - } - __Pyx_XDECREF_SET(__pyx_8genexpr5__pyx_v_s, __pyx_t_10); - __pyx_t_10 = 0; - __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_8genexpr5__pyx_v_s, __pyx_n_s_real); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 532, __pyx_L29_error) - __Pyx_GOTREF(__pyx_t_10); - __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_8genexpr5__pyx_v_s, __pyx_n_s_imag); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 532, __pyx_L29_error) - __Pyx_GOTREF(__pyx_t_9); - __pyx_t_15 = PyTuple_New(2); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 532, __pyx_L29_error) - __Pyx_GOTREF(__pyx_t_15); - __Pyx_GIVEREF(__pyx_t_10); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_10)) __PYX_ERR(0, 532, __pyx_L29_error); - __Pyx_GIVEREF(__pyx_t_9); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_9)) __PYX_ERR(0, 532, __pyx_L29_error); - __pyx_t_10 = 0; - __pyx_t_9 = 0; - if (unlikely(__Pyx_ListComp_Append(__pyx_t_5, (PyObject*)__pyx_t_15))) __PYX_ERR(0, 532, __pyx_L29_error) - __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; - } - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_XDECREF(__pyx_8genexpr5__pyx_v_s); __pyx_8genexpr5__pyx_v_s = 0; - goto __pyx_L33_exit_scope; - __pyx_L29_error:; - __Pyx_XDECREF(__pyx_8genexpr5__pyx_v_s); __pyx_8genexpr5__pyx_v_s = 0; - goto __pyx_L24_error; - __pyx_L33_exit_scope:; - } /* exit inner scope */ - if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_5))) __PYX_ERR(0, 532, __pyx_L24_error) - __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; - } - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_XDECREF(__pyx_8genexpr4__pyx_v_spline); __pyx_8genexpr4__pyx_v_spline = 0; - goto __pyx_L35_exit_scope; - __pyx_L24_error:; - __Pyx_XDECREF(__pyx_8genexpr4__pyx_v_spline); __pyx_8genexpr4__pyx_v_spline = 0; - goto __pyx_L1_error; - __pyx_L35_exit_scope:; - } /* exit inner scope */ - __pyx_r = __pyx_t_1; - __pyx_t_1 = 0; - goto __pyx_L0; - - /* "fontTools/cu2qu/cu2qu.py":530 - * splines[i] = spline - * i = (i + 1) % l - * if i == last_i: # <<<<<<<<<<<<<< - * # done. go home - * return [[(s.real, s.imag) for s in spline] for spline in splines] - */ - } - __pyx_L17_continue:; - } - __pyx_L18_break:; - - /* "fontTools/cu2qu/cu2qu.py":534 - * return [[(s.real, s.imag) for s in spline] for spline in splines] - * - * raise ApproxNotFoundError(curves) # <<<<<<<<<<<<<< - */ - __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_ApproxNotFoundError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 534, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_2); - __pyx_t_5 = NULL; - __pyx_t_12 = 0; - #if CYTHON_UNPACK_METHODS - if (unlikely(PyMethod_Check(__pyx_t_2))) { - __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); - if (likely(__pyx_t_5)) { - PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); - __Pyx_INCREF(__pyx_t_5); - __Pyx_INCREF(function); - __Pyx_DECREF_SET(__pyx_t_2, function); - __pyx_t_12 = 1; - } - } - #endif - { - PyObject *__pyx_callargs[2] = {__pyx_t_5, __pyx_v_curves}; - __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_12, 1+__pyx_t_12); - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 534, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_1); - __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - } - __Pyx_Raise(__pyx_t_1, 0, 0, 0); - __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - __PYX_ERR(0, 534, __pyx_L1_error) - - /* "fontTools/cu2qu/cu2qu.py":474 - * - * - * @cython.locals(l=cython.int, last_i=cython.int, i=cython.int) # <<<<<<<<<<<<<< - * @cython.locals(all_quadratic=cython.int) - * def curves_to_quadratic(curves, max_errors, all_quadratic=True): - */ - - /* function exit code */ - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_1); - __Pyx_XDECREF(__pyx_t_2); - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_9); - __Pyx_XDECREF(__pyx_t_10); - __Pyx_XDECREF(__pyx_t_15); - __Pyx_AddTraceback("fontTools.cu2qu.cu2qu.curves_to_quadratic", __pyx_clineno, __pyx_lineno, __pyx_filename); - __pyx_r = NULL; - __pyx_L0:; - __Pyx_XDECREF(__pyx_v_splines); - __Pyx_XDECREF(__pyx_v_n); - __Pyx_XDECREF(__pyx_v_spline); - __Pyx_XDECREF(__pyx_8genexpr2__pyx_v_curve); - __Pyx_XDECREF(__pyx_8genexpr3__pyx_v_p); - __Pyx_XDECREF(__pyx_8genexpr4__pyx_v_spline); - __Pyx_XDECREF(__pyx_8genexpr5__pyx_v_s); - __Pyx_XDECREF(__pyx_v_curves); - __Pyx_XGIVEREF(__pyx_r); - __Pyx_RefNannyFinishContext(); - return __pyx_r; -} - -#if CYTHON_USE_FREELISTS -static struct __pyx_obj_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen *__pyx_freelist_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen[8]; -static int __pyx_freecount_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen = 0; -#endif - -static PyObject *__pyx_tp_new_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { - PyObject *o; - #if CYTHON_COMPILING_IN_LIMITED_API - allocfunc alloc_func = (allocfunc)PyType_GetSlot(t, Py_tp_alloc); - o = alloc_func(t, 0); - #else - #if CYTHON_USE_FREELISTS - if (likely((int)(__pyx_freecount_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen > 0) & (int)(t->tp_basicsize == sizeof(struct __pyx_obj_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen)))) { - o = (PyObject*)__pyx_freelist_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen[--__pyx_freecount_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen]; - memset(o, 0, sizeof(struct __pyx_obj_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen)); - (void) PyObject_INIT(o, t); - } else - #endif - { - o = (*t->tp_alloc)(t, 0); - if (unlikely(!o)) return 0; - } - #endif - return o; -} - -static void __pyx_tp_dealloc_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen(PyObject *o) { - #if CYTHON_USE_TP_FINALIZE - if (unlikely((PY_VERSION_HEX >= 0x03080000 || __Pyx_PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE)) && __Pyx_PyObject_GetSlot(o, tp_finalize, destructor)) && (!PyType_IS_GC(Py_TYPE(o)) || !__Pyx_PyObject_GC_IsFinalized(o))) { - if (__Pyx_PyObject_GetSlot(o, tp_dealloc, destructor) == __pyx_tp_dealloc_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen) { - if (PyObject_CallFinalizerFromDealloc(o)) return; - } - } - #endif - #if CYTHON_USE_FREELISTS - if (((int)(__pyx_freecount_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen < 8) & (int)(Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen)))) { - __pyx_freelist_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen[__pyx_freecount_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen++] = ((struct __pyx_obj_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen *)o); - } else - #endif - { - #if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY - (*Py_TYPE(o)->tp_free)(o); - #else - { - freefunc tp_free = (freefunc)PyType_GetSlot(Py_TYPE(o), Py_tp_free); - if (tp_free) tp_free(o); - } - #endif - } -} -#if CYTHON_USE_TYPE_SPECS -static PyType_Slot __pyx_type_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen_slots[] = { - {Py_tp_dealloc, (void *)__pyx_tp_dealloc_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen}, - {Py_tp_new, (void *)__pyx_tp_new_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen}, - {0, 0}, -}; -static PyType_Spec __pyx_type_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen_spec = { - "fontTools.cu2qu.cu2qu.__pyx_scope_struct___split_cubic_into_n_gen", - sizeof(struct __pyx_obj_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen), - 0, - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_FINALIZE, - __pyx_type_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen_slots, -}; -#else - -static PyTypeObject __pyx_type_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen = { - PyVarObject_HEAD_INIT(0, 0) - "fontTools.cu2qu.cu2qu.""__pyx_scope_struct___split_cubic_into_n_gen", /*tp_name*/ - sizeof(struct __pyx_obj_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - __pyx_tp_dealloc_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen, /*tp_dealloc*/ - #if PY_VERSION_HEX < 0x030800b4 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030800b4 - 0, /*tp_vectorcall_offset*/ - #endif - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - #if PY_MAJOR_VERSION < 3 - 0, /*tp_compare*/ - #endif - #if PY_MAJOR_VERSION >= 3 - 0, /*tp_as_async*/ - #endif - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_FINALIZE, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - 0, /*tp_richcompare*/ - 0, /*tp_weaklistoffset*/ - 0, /*tp_iter*/ - 0, /*tp_iternext*/ - 0, /*tp_methods*/ - 0, /*tp_members*/ - 0, /*tp_getset*/ - 0, /*tp_base*/ - 0, /*tp_dict*/ - 0, /*tp_descr_get*/ - 0, /*tp_descr_set*/ - #if !CYTHON_USE_TYPE_SPECS - 0, /*tp_dictoffset*/ - #endif - 0, /*tp_init*/ - 0, /*tp_alloc*/ - __pyx_tp_new_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen, /*tp_new*/ - 0, /*tp_free*/ - 0, /*tp_is_gc*/ - 0, /*tp_bases*/ - 0, /*tp_mro*/ - 0, /*tp_cache*/ - 0, /*tp_subclasses*/ - 0, /*tp_weaklist*/ - 0, /*tp_del*/ - 0, /*tp_version_tag*/ - #if PY_VERSION_HEX >= 0x030400a1 - #if CYTHON_USE_TP_FINALIZE - 0, /*tp_finalize*/ - #else - NULL, /*tp_finalize*/ - #endif - #endif - #if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) - 0, /*tp_vectorcall*/ - #endif - #if __PYX_NEED_TP_PRINT_SLOT == 1 - 0, /*tp_print*/ - #endif - #if PY_VERSION_HEX >= 0x030C0000 - 0, /*tp_watched*/ - #endif - #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 - 0, /*tp_pypy_flags*/ - #endif -}; -#endif - -static PyMethodDef __pyx_methods[] = { - {0, 0, 0, 0} -}; -#ifndef CYTHON_SMALL_CODE -#if defined(__clang__) - #define CYTHON_SMALL_CODE -#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) - #define CYTHON_SMALL_CODE __attribute__((cold)) -#else - #define CYTHON_SMALL_CODE -#endif -#endif -/* #### Code section: pystring_table ### */ - -static int __Pyx_CreateStringTabAndInitStrings(void) { - __Pyx_StringTabEntry __pyx_string_tab[] = { - {&__pyx_n_s_ApproxNotFoundError, __pyx_k_ApproxNotFoundError, sizeof(__pyx_k_ApproxNotFoundError), 0, 0, 1, 1}, - {&__pyx_n_s_AssertionError, __pyx_k_AssertionError, sizeof(__pyx_k_AssertionError), 0, 0, 1, 1}, - {&__pyx_n_s_AttributeError, __pyx_k_AttributeError, sizeof(__pyx_k_AttributeError), 0, 0, 1, 1}, - {&__pyx_n_s_COMPILED, __pyx_k_COMPILED, sizeof(__pyx_k_COMPILED), 0, 0, 1, 1}, - {&__pyx_n_s_Cu2QuError, __pyx_k_Cu2QuError, sizeof(__pyx_k_Cu2QuError), 0, 0, 1, 1}, - {&__pyx_n_s_Error, __pyx_k_Error, sizeof(__pyx_k_Error), 0, 0, 1, 1}, - {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, - {&__pyx_kp_s_Lib_fontTools_cu2qu_cu2qu_py, __pyx_k_Lib_fontTools_cu2qu_cu2qu_py, sizeof(__pyx_k_Lib_fontTools_cu2qu_cu2qu_py), 0, 0, 1, 0}, - {&__pyx_n_s_MAX_N, __pyx_k_MAX_N, sizeof(__pyx_k_MAX_N), 0, 0, 1, 1}, - {&__pyx_n_s_NAN, __pyx_k_NAN, sizeof(__pyx_k_NAN), 0, 0, 1, 1}, - {&__pyx_n_u_NaN, __pyx_k_NaN, sizeof(__pyx_k_NaN), 0, 1, 0, 1}, - {&__pyx_kp_u_Return_quadratic_Bezier_splines, __pyx_k_Return_quadratic_Bezier_splines, sizeof(__pyx_k_Return_quadratic_Bezier_splines), 0, 1, 0, 0}, - {&__pyx_n_s_ZeroDivisionError, __pyx_k_ZeroDivisionError, sizeof(__pyx_k_ZeroDivisionError), 0, 0, 1, 1}, - {&__pyx_kp_u__2, __pyx_k__2, sizeof(__pyx_k__2), 0, 1, 0, 0}, - {&__pyx_n_s__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 0, 1, 1}, - {&__pyx_n_s__9, __pyx_k__9, sizeof(__pyx_k__9), 0, 0, 1, 1}, - {&__pyx_n_s_a, __pyx_k_a, sizeof(__pyx_k_a), 0, 0, 1, 1}, - {&__pyx_n_s_a1, __pyx_k_a1, sizeof(__pyx_k_a1), 0, 0, 1, 1}, - {&__pyx_n_s_all, __pyx_k_all, sizeof(__pyx_k_all), 0, 0, 1, 1}, - {&__pyx_n_s_all_quadratic, __pyx_k_all_quadratic, sizeof(__pyx_k_all_quadratic), 0, 0, 1, 1}, - {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1}, - {&__pyx_n_s_asyncio_coroutines, __pyx_k_asyncio_coroutines, sizeof(__pyx_k_asyncio_coroutines), 0, 0, 1, 1}, - {&__pyx_n_s_b, __pyx_k_b, sizeof(__pyx_k_b), 0, 0, 1, 1}, - {&__pyx_n_s_b1, __pyx_k_b1, sizeof(__pyx_k_b1), 0, 0, 1, 1}, - {&__pyx_n_s_c, __pyx_k_c, sizeof(__pyx_k_c), 0, 0, 1, 1}, - {&__pyx_n_s_c1, __pyx_k_c1, sizeof(__pyx_k_c1), 0, 0, 1, 1}, - {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, - {&__pyx_n_s_close, __pyx_k_close, sizeof(__pyx_k_close), 0, 0, 1, 1}, - {&__pyx_n_s_curve, __pyx_k_curve, sizeof(__pyx_k_curve), 0, 0, 1, 1}, - {&__pyx_n_s_curve_to_quadratic, __pyx_k_curve_to_quadratic, sizeof(__pyx_k_curve_to_quadratic), 0, 0, 1, 1}, - {&__pyx_n_u_curve_to_quadratic, __pyx_k_curve_to_quadratic, sizeof(__pyx_k_curve_to_quadratic), 0, 1, 0, 1}, - {&__pyx_n_s_curves, __pyx_k_curves, sizeof(__pyx_k_curves), 0, 0, 1, 1}, - {&__pyx_n_s_curves_to_quadratic, __pyx_k_curves_to_quadratic, sizeof(__pyx_k_curves_to_quadratic), 0, 0, 1, 1}, - {&__pyx_n_u_curves_to_quadratic, __pyx_k_curves_to_quadratic, sizeof(__pyx_k_curves_to_quadratic), 0, 1, 0, 1}, - {&__pyx_kp_u_curves_to_quadratic_line_474, __pyx_k_curves_to_quadratic_line_474, sizeof(__pyx_k_curves_to_quadratic_line_474), 0, 1, 0, 0}, - {&__pyx_n_s_cython, __pyx_k_cython, sizeof(__pyx_k_cython), 0, 0, 1, 1}, - {&__pyx_n_s_d, __pyx_k_d, sizeof(__pyx_k_d), 0, 0, 1, 1}, - {&__pyx_n_s_d1, __pyx_k_d1, sizeof(__pyx_k_d1), 0, 0, 1, 1}, - {&__pyx_n_s_delta_2, __pyx_k_delta_2, sizeof(__pyx_k_delta_2), 0, 0, 1, 1}, - {&__pyx_n_s_delta_3, __pyx_k_delta_3, sizeof(__pyx_k_delta_3), 0, 0, 1, 1}, - {&__pyx_kp_u_disable, __pyx_k_disable, sizeof(__pyx_k_disable), 0, 1, 0, 0}, - {&__pyx_n_s_dt, __pyx_k_dt, sizeof(__pyx_k_dt), 0, 0, 1, 1}, - {&__pyx_kp_u_enable, __pyx_k_enable, sizeof(__pyx_k_enable), 0, 1, 0, 0}, - {&__pyx_n_s_errors, __pyx_k_errors, sizeof(__pyx_k_errors), 0, 0, 1, 1}, - {&__pyx_n_s_fontTools_cu2qu_cu2qu, __pyx_k_fontTools_cu2qu_cu2qu, sizeof(__pyx_k_fontTools_cu2qu_cu2qu), 0, 0, 1, 1}, - {&__pyx_n_s_fontTools_misc, __pyx_k_fontTools_misc, sizeof(__pyx_k_fontTools_misc), 0, 0, 1, 1}, - {&__pyx_kp_u_gc, __pyx_k_gc, sizeof(__pyx_k_gc), 0, 1, 0, 0}, - {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, - {&__pyx_n_s_imag, __pyx_k_imag, sizeof(__pyx_k_imag), 0, 0, 1, 1}, - {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, - {&__pyx_n_s_initializing, __pyx_k_initializing, sizeof(__pyx_k_initializing), 0, 0, 1, 1}, - {&__pyx_n_s_is_coroutine, __pyx_k_is_coroutine, sizeof(__pyx_k_is_coroutine), 0, 0, 1, 1}, - {&__pyx_kp_u_isenabled, __pyx_k_isenabled, sizeof(__pyx_k_isenabled), 0, 1, 0, 0}, - {&__pyx_n_s_isnan, __pyx_k_isnan, sizeof(__pyx_k_isnan), 0, 0, 1, 1}, - {&__pyx_n_s_l, __pyx_k_l, sizeof(__pyx_k_l), 0, 0, 1, 1}, - {&__pyx_n_s_last_i, __pyx_k_last_i, sizeof(__pyx_k_last_i), 0, 0, 1, 1}, - {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, - {&__pyx_n_s_math, __pyx_k_math, sizeof(__pyx_k_math), 0, 0, 1, 1}, - {&__pyx_n_s_max_err, __pyx_k_max_err, sizeof(__pyx_k_max_err), 0, 0, 1, 1}, - {&__pyx_n_s_max_errors, __pyx_k_max_errors, sizeof(__pyx_k_max_errors), 0, 0, 1, 1}, - {&__pyx_n_s_n, __pyx_k_n, sizeof(__pyx_k_n), 0, 0, 1, 1}, - {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, - {&__pyx_n_s_p, __pyx_k_p, sizeof(__pyx_k_p), 0, 0, 1, 1}, - {&__pyx_n_s_p0, __pyx_k_p0, sizeof(__pyx_k_p0), 0, 0, 1, 1}, - {&__pyx_n_s_p1, __pyx_k_p1, sizeof(__pyx_k_p1), 0, 0, 1, 1}, - {&__pyx_n_s_p2, __pyx_k_p2, sizeof(__pyx_k_p2), 0, 0, 1, 1}, - {&__pyx_n_s_p3, __pyx_k_p3, sizeof(__pyx_k_p3), 0, 0, 1, 1}, - {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, - {&__pyx_n_s_real, __pyx_k_real, sizeof(__pyx_k_real), 0, 0, 1, 1}, - {&__pyx_n_s_s, __pyx_k_s, sizeof(__pyx_k_s), 0, 0, 1, 1}, - {&__pyx_n_s_send, __pyx_k_send, sizeof(__pyx_k_send), 0, 0, 1, 1}, - {&__pyx_n_s_spec, __pyx_k_spec, sizeof(__pyx_k_spec), 0, 0, 1, 1}, - {&__pyx_n_s_spline, __pyx_k_spline, sizeof(__pyx_k_spline), 0, 0, 1, 1}, - {&__pyx_n_s_splines, __pyx_k_splines, sizeof(__pyx_k_splines), 0, 0, 1, 1}, - {&__pyx_n_s_split_cubic_into_n_gen, __pyx_k_split_cubic_into_n_gen, sizeof(__pyx_k_split_cubic_into_n_gen), 0, 0, 1, 1}, - {&__pyx_n_s_t1, __pyx_k_t1, sizeof(__pyx_k_t1), 0, 0, 1, 1}, - {&__pyx_n_s_t1_2, __pyx_k_t1_2, sizeof(__pyx_k_t1_2), 0, 0, 1, 1}, - {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, - {&__pyx_n_s_throw, __pyx_k_throw, sizeof(__pyx_k_throw), 0, 0, 1, 1}, - {0, 0, 0, 0, 0, 0, 0} - }; - return __Pyx_InitStrings(__pyx_string_tab); -} -/* #### Code section: cached_builtins ### */ -static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { - __pyx_builtin_AttributeError = __Pyx_GetBuiltinName(__pyx_n_s_AttributeError); if (!__pyx_builtin_AttributeError) __PYX_ERR(0, 22, __pyx_L1_error) - __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(0, 22, __pyx_L1_error) - __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 146, __pyx_L1_error) - __pyx_builtin_ZeroDivisionError = __Pyx_GetBuiltinName(__pyx_n_s_ZeroDivisionError); if (!__pyx_builtin_ZeroDivisionError) __PYX_ERR(0, 278, __pyx_L1_error) - __pyx_builtin_AssertionError = __Pyx_GetBuiltinName(__pyx_n_s_AssertionError); if (!__pyx_builtin_AssertionError) __PYX_ERR(0, 514, __pyx_L1_error) - return 0; - __pyx_L1_error:; - return -1; -} -/* #### Code section: cached_constants ### */ - -static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); - - /* "fontTools/cu2qu/cu2qu.py":127 - * - * - * @cython.locals( # <<<<<<<<<<<<<< - * p0=cython.complex, - * p1=cython.complex, - */ - __pyx_tuple__4 = PyTuple_Pack(19, __pyx_n_s_p0, __pyx_n_s_p1, __pyx_n_s_p2, __pyx_n_s_p3, __pyx_n_s_n, __pyx_n_s_a1, __pyx_n_s_b1, __pyx_n_s_c1, __pyx_n_s_d1, __pyx_n_s_dt, __pyx_n_s_delta_2, __pyx_n_s_delta_3, __pyx_n_s_i, __pyx_n_s_a, __pyx_n_s_b, __pyx_n_s_c, __pyx_n_s_d, __pyx_n_s_t1, __pyx_n_s_t1_2); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 127, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__4); - __Pyx_GIVEREF(__pyx_tuple__4); - __pyx_codeobj_ = (PyObject*)__Pyx_PyCode_New(5, 0, 0, 19, 0, CO_OPTIMIZED|CO_NEWLOCALS|CO_GENERATOR, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__4, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Lib_fontTools_cu2qu_cu2qu_py, __pyx_n_s_split_cubic_into_n_gen, 127, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj_)) __PYX_ERR(0, 127, __pyx_L1_error) - - /* "fontTools/cu2qu/cu2qu.py":439 - * - * - * @cython.locals(max_err=cython.double) # <<<<<<<<<<<<<< - * @cython.locals(n=cython.int) - * @cython.locals(all_quadratic=cython.int) - */ - __pyx_tuple__5 = PyTuple_Pack(7, __pyx_n_s_curve, __pyx_n_s_max_err, __pyx_n_s_all_quadratic, __pyx_n_s_n, __pyx_n_s_spline, __pyx_n_s_p, __pyx_n_s_s); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 439, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__5); - __Pyx_GIVEREF(__pyx_tuple__5); - __pyx_codeobj__6 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 7, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__5, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Lib_fontTools_cu2qu_cu2qu_py, __pyx_n_s_curve_to_quadratic, 439, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__6)) __PYX_ERR(0, 439, __pyx_L1_error) - - /* "fontTools/cu2qu/cu2qu.py":474 - * - * - * @cython.locals(l=cython.int, last_i=cython.int, i=cython.int) # <<<<<<<<<<<<<< - * @cython.locals(all_quadratic=cython.int) - * def curves_to_quadratic(curves, max_errors, all_quadratic=True): - */ - __pyx_tuple__7 = PyTuple_Pack(13, __pyx_n_s_curves, __pyx_n_s_max_errors, __pyx_n_s_all_quadratic, __pyx_n_s_l, __pyx_n_s_last_i, __pyx_n_s_i, __pyx_n_s_splines, __pyx_n_s_n, __pyx_n_s_spline, __pyx_n_s_curve, __pyx_n_s_p, __pyx_n_s_spline, __pyx_n_s_s); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 474, __pyx_L1_error) - __Pyx_GOTREF(__pyx_tuple__7); - __Pyx_GIVEREF(__pyx_tuple__7); - __pyx_codeobj__8 = (PyObject*)__Pyx_PyCode_New(3, 0, 0, 13, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Lib_fontTools_cu2qu_cu2qu_py, __pyx_n_s_curves_to_quadratic, 474, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__8)) __PYX_ERR(0, 474, __pyx_L1_error) - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_RefNannyFinishContext(); - return -1; -} -/* #### Code section: init_constants ### */ - -static CYTHON_SMALL_CODE int __Pyx_InitConstants(void) { - if (__Pyx_CreateStringTabAndInitStrings() < 0) __PYX_ERR(0, 1, __pyx_L1_error); - __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_int_4 = PyInt_FromLong(4); if (unlikely(!__pyx_int_4)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_int_6 = PyInt_FromLong(6); if (unlikely(!__pyx_int_6)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_int_100 = PyInt_FromLong(100); if (unlikely(!__pyx_int_100)) __PYX_ERR(0, 1, __pyx_L1_error) - return 0; - __pyx_L1_error:; - return -1; -} -/* #### Code section: init_globals ### */ - -static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { - /* AssertionsEnabled.init */ - if (likely(__Pyx_init_assertions_enabled() == 0)); else - -if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 1, __pyx_L1_error) - - return 0; - __pyx_L1_error:; - return -1; -} -/* #### Code section: init_module ### */ - -static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ -static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ - -static int __Pyx_modinit_global_init_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); - /*--- Global init code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_variable_export_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); - /*--- Variable export code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_function_export_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); - /*--- Function export code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_type_init_code(void) { - __Pyx_RefNannyDeclarations - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); - /*--- Type init code ---*/ - #if CYTHON_USE_TYPE_SPECS - __pyx_ptype_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen_spec, NULL); if (unlikely(!__pyx_ptype_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen)) __PYX_ERR(0, 127, __pyx_L1_error) - if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen_spec, __pyx_ptype_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen) < 0) __PYX_ERR(0, 127, __pyx_L1_error) - #else - __pyx_ptype_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen = &__pyx_type_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen; - #endif - #if !CYTHON_COMPILING_IN_LIMITED_API - #endif - #if !CYTHON_USE_TYPE_SPECS - if (__Pyx_PyType_Ready(__pyx_ptype_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen) < 0) __PYX_ERR(0, 127, __pyx_L1_error) - #endif - #if PY_MAJOR_VERSION < 3 - __pyx_ptype_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen->tp_print = 0; - #endif - #if !CYTHON_COMPILING_IN_LIMITED_API - if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_ptype_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen->tp_dictoffset && __pyx_ptype_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen->tp_getattro == PyObject_GenericGetAttr)) { - __pyx_ptype_9fontTools_5cu2qu_5cu2qu___pyx_scope_struct___split_cubic_into_n_gen->tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; - } - #endif - __Pyx_RefNannyFinishContext(); - return 0; - __pyx_L1_error:; - __Pyx_RefNannyFinishContext(); - return -1; -} - -static int __Pyx_modinit_type_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); - /*--- Type import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_variable_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); - /*--- Variable import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - -static int __Pyx_modinit_function_import_code(void) { - __Pyx_RefNannyDeclarations - __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); - /*--- Function import code ---*/ - __Pyx_RefNannyFinishContext(); - return 0; -} - - -#if PY_MAJOR_VERSION >= 3 -#if CYTHON_PEP489_MULTI_PHASE_INIT -static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ -static int __pyx_pymod_exec_cu2qu(PyObject* module); /*proto*/ -static PyModuleDef_Slot __pyx_moduledef_slots[] = { - {Py_mod_create, (void*)__pyx_pymod_create}, - {Py_mod_exec, (void*)__pyx_pymod_exec_cu2qu}, - {0, NULL} -}; -#endif - -#ifdef __cplusplus -namespace { - struct PyModuleDef __pyx_moduledef = - #else - static struct PyModuleDef __pyx_moduledef = - #endif - { - PyModuleDef_HEAD_INIT, - "cu2qu", - 0, /* m_doc */ - #if CYTHON_PEP489_MULTI_PHASE_INIT - 0, /* m_size */ - #elif CYTHON_USE_MODULE_STATE - sizeof(__pyx_mstate), /* m_size */ - #else - -1, /* m_size */ - #endif - __pyx_methods /* m_methods */, - #if CYTHON_PEP489_MULTI_PHASE_INIT - __pyx_moduledef_slots, /* m_slots */ - #else - NULL, /* m_reload */ - #endif - #if CYTHON_USE_MODULE_STATE - __pyx_m_traverse, /* m_traverse */ - __pyx_m_clear, /* m_clear */ - NULL /* m_free */ - #else - NULL, /* m_traverse */ - NULL, /* m_clear */ - NULL /* m_free */ - #endif - }; - #ifdef __cplusplus -} /* anonymous namespace */ -#endif -#endif - -#ifndef CYTHON_NO_PYINIT_EXPORT -#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC -#elif PY_MAJOR_VERSION < 3 -#ifdef __cplusplus -#define __Pyx_PyMODINIT_FUNC extern "C" void -#else -#define __Pyx_PyMODINIT_FUNC void -#endif -#else -#ifdef __cplusplus -#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * -#else -#define __Pyx_PyMODINIT_FUNC PyObject * -#endif -#endif - - -#if PY_MAJOR_VERSION < 3 -__Pyx_PyMODINIT_FUNC initcu2qu(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC initcu2qu(void) -#else -__Pyx_PyMODINIT_FUNC PyInit_cu2qu(void) CYTHON_SMALL_CODE; /*proto*/ -__Pyx_PyMODINIT_FUNC PyInit_cu2qu(void) -#if CYTHON_PEP489_MULTI_PHASE_INIT -{ - return PyModuleDef_Init(&__pyx_moduledef); -} -static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { - #if PY_VERSION_HEX >= 0x030700A1 - static PY_INT64_T main_interpreter_id = -1; - PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); - if (main_interpreter_id == -1) { - main_interpreter_id = current_id; - return (unlikely(current_id == -1)) ? -1 : 0; - } else if (unlikely(main_interpreter_id != current_id)) - #else - static PyInterpreterState *main_interpreter = NULL; - PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; - if (!main_interpreter) { - main_interpreter = current_interpreter; - } else if (unlikely(main_interpreter != current_interpreter)) - #endif - { - PyErr_SetString( - PyExc_ImportError, - "Interpreter change detected - this module can only be loaded into one interpreter per process."); - return -1; - } - return 0; -} -#if CYTHON_COMPILING_IN_LIMITED_API -static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *module, const char* from_name, const char* to_name, int allow_none) -#else -static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) -#endif -{ - PyObject *value = PyObject_GetAttrString(spec, from_name); - int result = 0; - if (likely(value)) { - if (allow_none || value != Py_None) { -#if CYTHON_COMPILING_IN_LIMITED_API - result = PyModule_AddObject(module, to_name, value); -#else - result = PyDict_SetItemString(moddict, to_name, value); -#endif - } - Py_DECREF(value); - } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { - PyErr_Clear(); - } else { - result = -1; - } - return result; -} -static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def) { - PyObject *module = NULL, *moddict, *modname; - CYTHON_UNUSED_VAR(def); - if (__Pyx_check_single_interpreter()) - return NULL; - if (__pyx_m) - return __Pyx_NewRef(__pyx_m); - modname = PyObject_GetAttrString(spec, "name"); - if (unlikely(!modname)) goto bad; - module = PyModule_NewObject(modname); - Py_DECREF(modname); - if (unlikely(!module)) goto bad; -#if CYTHON_COMPILING_IN_LIMITED_API - moddict = module; -#else - moddict = PyModule_GetDict(module); - if (unlikely(!moddict)) goto bad; -#endif - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; - if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; - return module; -bad: - Py_XDECREF(module); - return NULL; -} - - -static CYTHON_SMALL_CODE int __pyx_pymod_exec_cu2qu(PyObject *__pyx_pyinit_module) -#endif -#endif -{ - int stringtab_initialized = 0; - #if CYTHON_USE_MODULE_STATE - int pystate_addmodule_run = 0; - #endif - PyObject *__pyx_t_1 = NULL; - PyObject *__pyx_t_2 = NULL; - PyObject *__pyx_t_3 = NULL; - int __pyx_t_4; - PyObject *__pyx_t_5 = NULL; - PyObject *__pyx_t_6 = NULL; - PyObject *__pyx_t_7 = NULL; - PyObject *__pyx_t_8 = NULL; - PyObject *__pyx_t_9 = NULL; - double __pyx_t_10; - int __pyx_lineno = 0; - const char *__pyx_filename = NULL; - int __pyx_clineno = 0; - __Pyx_RefNannyDeclarations - #if CYTHON_PEP489_MULTI_PHASE_INIT - if (__pyx_m) { - if (__pyx_m == __pyx_pyinit_module) return 0; - PyErr_SetString(PyExc_RuntimeError, "Module 'cu2qu' has already been imported. Re-initialisation is not supported."); - return -1; - } - #elif PY_MAJOR_VERSION >= 3 - if (__pyx_m) return __Pyx_NewRef(__pyx_m); - #endif - /*--- Module creation code ---*/ - #if CYTHON_PEP489_MULTI_PHASE_INIT - __pyx_m = __pyx_pyinit_module; - Py_INCREF(__pyx_m); - #else - #if PY_MAJOR_VERSION < 3 - __pyx_m = Py_InitModule4("cu2qu", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); - if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) - #elif CYTHON_USE_MODULE_STATE - __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) - { - int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); - __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "cu2qu" pseudovariable */ - if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) - pystate_addmodule_run = 1; - } - #else - __pyx_m = PyModule_Create(&__pyx_moduledef); - if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #endif - CYTHON_UNUSED_VAR(__pyx_t_1); - __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) - Py_INCREF(__pyx_d); - __pyx_b = __Pyx_PyImport_AddModuleRef(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_cython_runtime = __Pyx_PyImport_AddModuleRef((const char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) - if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #if CYTHON_REFNANNY -__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); -if (!__Pyx_RefNanny) { - PyErr_Clear(); - __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); - if (!__Pyx_RefNanny) - Py_FatalError("failed to import 'refnanny' module"); -} -#endif - __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit_cu2qu(void)", 0); - if (__Pyx_check_binary_version(__PYX_LIMITED_VERSION_HEX, __Pyx_get_runtime_version(), CYTHON_COMPILING_IN_LIMITED_API) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #ifdef __Pxy_PyFrame_Initialize_Offsets - __Pxy_PyFrame_Initialize_Offsets(); - #endif - __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) - __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) - #ifdef __Pyx_CyFunction_USED - if (__pyx_CyFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_FusedFunction_USED - if (__pyx_FusedFunction_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_Coroutine_USED - if (__pyx_Coroutine_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_Generator_USED - if (__pyx_Generator_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_AsyncGen_USED - if (__pyx_AsyncGen_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - #ifdef __Pyx_StopAsyncIteration_USED - if (__pyx_StopAsyncIteration_init(__pyx_m) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - /*--- Library function declarations ---*/ - /*--- Threads initialization code ---*/ - #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS - PyEval_InitThreads(); - #endif - /*--- Initialize various global constants etc. ---*/ - if (__Pyx_InitConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - stringtab_initialized = 1; - if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) - if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - if (__pyx_module_is_main_fontTools__cu2qu__cu2qu) { - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - } - #if PY_MAJOR_VERSION >= 3 - { - PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) - if (!PyDict_GetItemString(modules, "fontTools.cu2qu.cu2qu")) { - if (unlikely((PyDict_SetItemString(modules, "fontTools.cu2qu.cu2qu", __pyx_m) < 0))) __PYX_ERR(0, 1, __pyx_L1_error) - } - } - #endif - /*--- Builtin init code ---*/ - if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - /*--- Constants init code ---*/ - if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - /*--- Global type/function init code ---*/ - (void)__Pyx_modinit_global_init_code(); - (void)__Pyx_modinit_variable_export_code(); - (void)__Pyx_modinit_function_export_code(); - if (unlikely((__Pyx_modinit_type_init_code() < 0))) __PYX_ERR(0, 1, __pyx_L1_error) - (void)__Pyx_modinit_type_import_code(); - (void)__Pyx_modinit_variable_import_code(); - (void)__Pyx_modinit_function_import_code(); - /*--- Execution code ---*/ - #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) - if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) - #endif - - /* "fontTools/cu2qu/cu2qu.py":18 - * # limitations under the License. - * - * try: # <<<<<<<<<<<<<< - * import cython - * - */ - { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); - __Pyx_XGOTREF(__pyx_t_1); - __Pyx_XGOTREF(__pyx_t_2); - __Pyx_XGOTREF(__pyx_t_3); - /*try:*/ { - - /* "fontTools/cu2qu/cu2qu.py":21 - * import cython - * - * COMPILED = cython.compiled # <<<<<<<<<<<<<< - * except (AttributeError, ImportError): - * # if cython not installed, use mock module with no-op decorators and types - */ - if (PyDict_SetItem(__pyx_d, __pyx_n_s_COMPILED, Py_True) < 0) __PYX_ERR(0, 21, __pyx_L2_error) - - /* "fontTools/cu2qu/cu2qu.py":18 - * # limitations under the License. - * - * try: # <<<<<<<<<<<<<< - * import cython - * - */ - } - __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; - __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - goto __pyx_L7_try_end; - __pyx_L2_error:; - - /* "fontTools/cu2qu/cu2qu.py":22 - * - * COMPILED = cython.compiled - * except (AttributeError, ImportError): # <<<<<<<<<<<<<< - * # if cython not installed, use mock module with no-op decorators and types - * from fontTools.misc import cython - */ - __pyx_t_4 = __Pyx_PyErr_ExceptionMatches2(__pyx_builtin_AttributeError, __pyx_builtin_ImportError); - if (__pyx_t_4) { - __Pyx_AddTraceback("fontTools.cu2qu.cu2qu", __pyx_clineno, __pyx_lineno, __pyx_filename); - if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(0, 22, __pyx_L4_except_error) - __Pyx_XGOTREF(__pyx_t_5); - __Pyx_XGOTREF(__pyx_t_6); - __Pyx_XGOTREF(__pyx_t_7); - - /* "fontTools/cu2qu/cu2qu.py":24 - * except (AttributeError, ImportError): - * # if cython not installed, use mock module with no-op decorators and types - * from fontTools.misc import cython # <<<<<<<<<<<<<< - * - * COMPILED = False - */ - __pyx_t_8 = PyList_New(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 24, __pyx_L4_except_error) - __Pyx_GOTREF(__pyx_t_8); - __Pyx_INCREF(__pyx_n_s_cython); - __Pyx_GIVEREF(__pyx_n_s_cython); - if (__Pyx_PyList_SET_ITEM(__pyx_t_8, 0, __pyx_n_s_cython)) __PYX_ERR(0, 24, __pyx_L4_except_error); - __pyx_t_9 = __Pyx_Import(__pyx_n_s_fontTools_misc, __pyx_t_8, 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 24, __pyx_L4_except_error) - __Pyx_GOTREF(__pyx_t_9); - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __pyx_t_8 = __Pyx_ImportFrom(__pyx_t_9, __pyx_n_s_cython); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 24, __pyx_L4_except_error) - __Pyx_GOTREF(__pyx_t_8); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_cython, __pyx_t_8) < 0) __PYX_ERR(0, 24, __pyx_L4_except_error) - __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; - __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; - - /* "fontTools/cu2qu/cu2qu.py":26 - * from fontTools.misc import cython - * - * COMPILED = False # <<<<<<<<<<<<<< - * - * import math - */ - if (PyDict_SetItem(__pyx_d, __pyx_n_s_COMPILED, Py_False) < 0) __PYX_ERR(0, 26, __pyx_L4_except_error) - __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; - __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; - __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; - goto __pyx_L3_exception_handled; - } - goto __pyx_L4_except_error; - - /* "fontTools/cu2qu/cu2qu.py":18 - * # limitations under the License. - * - * try: # <<<<<<<<<<<<<< - * import cython - * - */ - __pyx_L4_except_error:; - __Pyx_XGIVEREF(__pyx_t_1); - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); - goto __pyx_L1_error; - __pyx_L3_exception_handled:; - __Pyx_XGIVEREF(__pyx_t_1); - __Pyx_XGIVEREF(__pyx_t_2); - __Pyx_XGIVEREF(__pyx_t_3); - __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); - __pyx_L7_try_end:; - } - - /* "fontTools/cu2qu/cu2qu.py":28 - * COMPILED = False - * - * import math # <<<<<<<<<<<<<< - * - * from .errors import Error as Cu2QuError, ApproxNotFoundError - */ - __pyx_t_7 = __Pyx_ImportDottedModule(__pyx_n_s_math, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 28, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_math, __pyx_t_7) < 0) __PYX_ERR(0, 28, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - - /* "fontTools/cu2qu/cu2qu.py":30 - * import math - * - * from .errors import Error as Cu2QuError, ApproxNotFoundError # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_7 = PyList_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_INCREF(__pyx_n_s_Error); - __Pyx_GIVEREF(__pyx_n_s_Error); - if (__Pyx_PyList_SET_ITEM(__pyx_t_7, 0, __pyx_n_s_Error)) __PYX_ERR(0, 30, __pyx_L1_error); - __Pyx_INCREF(__pyx_n_s_ApproxNotFoundError); - __Pyx_GIVEREF(__pyx_n_s_ApproxNotFoundError); - if (__Pyx_PyList_SET_ITEM(__pyx_t_7, 1, __pyx_n_s_ApproxNotFoundError)) __PYX_ERR(0, 30, __pyx_L1_error); - __pyx_t_6 = __Pyx_Import(__pyx_n_s_errors, __pyx_t_7, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_7 = __Pyx_ImportFrom(__pyx_t_6, __pyx_n_s_Error); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_Cu2QuError, __pyx_t_7) < 0) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __pyx_t_7 = __Pyx_ImportFrom(__pyx_t_6, __pyx_n_s_ApproxNotFoundError); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_ApproxNotFoundError, __pyx_t_7) < 0) __PYX_ERR(0, 30, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - - /* "fontTools/cu2qu/cu2qu.py":33 - * - * - * __all__ = ["curve_to_quadratic", "curves_to_quadratic"] # <<<<<<<<<<<<<< - * - * MAX_N = 100 - */ - __pyx_t_6 = PyList_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 33, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_INCREF(__pyx_n_u_curve_to_quadratic); - __Pyx_GIVEREF(__pyx_n_u_curve_to_quadratic); - if (__Pyx_PyList_SET_ITEM(__pyx_t_6, 0, __pyx_n_u_curve_to_quadratic)) __PYX_ERR(0, 33, __pyx_L1_error); - __Pyx_INCREF(__pyx_n_u_curves_to_quadratic); - __Pyx_GIVEREF(__pyx_n_u_curves_to_quadratic); - if (__Pyx_PyList_SET_ITEM(__pyx_t_6, 1, __pyx_n_u_curves_to_quadratic)) __PYX_ERR(0, 33, __pyx_L1_error); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_all, __pyx_t_6) < 0) __PYX_ERR(0, 33, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - - /* "fontTools/cu2qu/cu2qu.py":35 - * __all__ = ["curve_to_quadratic", "curves_to_quadratic"] - * - * MAX_N = 100 # <<<<<<<<<<<<<< - * - * NAN = float("NaN") - */ - if (PyDict_SetItem(__pyx_d, __pyx_n_s_MAX_N, __pyx_int_100) < 0) __PYX_ERR(0, 35, __pyx_L1_error) - - /* "fontTools/cu2qu/cu2qu.py":37 - * MAX_N = 100 - * - * NAN = float("NaN") # <<<<<<<<<<<<<< - * - * - */ - __pyx_t_10 = __Pyx_PyUnicode_AsDouble(__pyx_n_u_NaN); if (unlikely(__pyx_t_10 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 37, __pyx_L1_error) - __pyx_t_6 = PyFloat_FromDouble(__pyx_t_10); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 37, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_NAN, __pyx_t_6) < 0) __PYX_ERR(0, 37, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - - /* "fontTools/cu2qu/cu2qu.py":127 - * - * - * @cython.locals( # <<<<<<<<<<<<<< - * p0=cython.complex, - * p1=cython.complex, - */ - __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_9fontTools_5cu2qu_5cu2qu_1_split_cubic_into_n_gen, 0, __pyx_n_s_split_cubic_into_n_gen, NULL, __pyx_n_s_fontTools_cu2qu_cu2qu, __pyx_d, ((PyObject *)__pyx_codeobj_)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 127, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - if (PyDict_SetItem(__pyx_d, __pyx_n_s_split_cubic_into_n_gen, __pyx_t_6) < 0) __PYX_ERR(0, 127, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - - /* "fontTools/cu2qu/cu2qu.py":442 - * @cython.locals(n=cython.int) - * @cython.locals(all_quadratic=cython.int) - * def curve_to_quadratic(curve, max_err, all_quadratic=True): # <<<<<<<<<<<<<< - * """Approximate a cubic Bezier curve with a spline of n quadratics. - * - */ - __pyx_t_6 = __Pyx_PyBool_FromLong(((int)1)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 442, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - - /* "fontTools/cu2qu/cu2qu.py":439 - * - * - * @cython.locals(max_err=cython.double) # <<<<<<<<<<<<<< - * @cython.locals(n=cython.int) - * @cython.locals(all_quadratic=cython.int) - */ - __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 439, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_GIVEREF(__pyx_t_6); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6)) __PYX_ERR(0, 439, __pyx_L1_error); - __pyx_t_6 = 0; - __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_9fontTools_5cu2qu_5cu2qu_4curve_to_quadratic, 0, __pyx_n_s_curve_to_quadratic, NULL, __pyx_n_s_fontTools_cu2qu_cu2qu, __pyx_d, ((PyObject *)__pyx_codeobj__6)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 439, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_6, __pyx_t_7); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - if (PyDict_SetItem(__pyx_d, __pyx_n_s_curve_to_quadratic, __pyx_t_6) < 0) __PYX_ERR(0, 439, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - - /* "fontTools/cu2qu/cu2qu.py":476 - * @cython.locals(l=cython.int, last_i=cython.int, i=cython.int) - * @cython.locals(all_quadratic=cython.int) - * def curves_to_quadratic(curves, max_errors, all_quadratic=True): # <<<<<<<<<<<<<< - * """Return quadratic Bezier splines approximating the input cubic Beziers. - * - */ - __pyx_t_6 = __Pyx_PyBool_FromLong(((int)1)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 476, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - - /* "fontTools/cu2qu/cu2qu.py":474 - * - * - * @cython.locals(l=cython.int, last_i=cython.int, i=cython.int) # <<<<<<<<<<<<<< - * @cython.locals(all_quadratic=cython.int) - * def curves_to_quadratic(curves, max_errors, all_quadratic=True): - */ - __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 474, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_7); - __Pyx_GIVEREF(__pyx_t_6); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6)) __PYX_ERR(0, 474, __pyx_L1_error); - __pyx_t_6 = 0; - __pyx_t_6 = __Pyx_CyFunction_New(&__pyx_mdef_9fontTools_5cu2qu_5cu2qu_6curves_to_quadratic, 0, __pyx_n_s_curves_to_quadratic, NULL, __pyx_n_s_fontTools_cu2qu_cu2qu, __pyx_d, ((PyObject *)__pyx_codeobj__8)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 474, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_6, __pyx_t_7); - __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; - if (PyDict_SetItem(__pyx_d, __pyx_n_s_curves_to_quadratic, __pyx_t_6) < 0) __PYX_ERR(0, 474, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - - /* "fontTools/cu2qu/cu2qu.py":1 - * # cython: language_level=3 # <<<<<<<<<<<<<< - * # distutils: define_macros=CYTHON_TRACE_NOGIL=1 - * - */ - __pyx_t_6 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_GOTREF(__pyx_t_6); - if (PyDict_SetItem(__pyx_t_6, __pyx_kp_u_curves_to_quadratic_line_474, __pyx_kp_u_Return_quadratic_Bezier_splines) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_6) < 0) __PYX_ERR(0, 1, __pyx_L1_error) - __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; - - /*--- Wrapped vars code ---*/ - - goto __pyx_L0; - __pyx_L1_error:; - __Pyx_XDECREF(__pyx_t_5); - __Pyx_XDECREF(__pyx_t_6); - __Pyx_XDECREF(__pyx_t_7); - __Pyx_XDECREF(__pyx_t_8); - __Pyx_XDECREF(__pyx_t_9); - if (__pyx_m) { - if (__pyx_d && stringtab_initialized) { - __Pyx_AddTraceback("init fontTools.cu2qu.cu2qu", __pyx_clineno, __pyx_lineno, __pyx_filename); - } - #if !CYTHON_USE_MODULE_STATE - Py_CLEAR(__pyx_m); - #else - Py_DECREF(__pyx_m); - if (pystate_addmodule_run) { - PyObject *tp, *value, *tb; - PyErr_Fetch(&tp, &value, &tb); - PyState_RemoveModule(&__pyx_moduledef); - PyErr_Restore(tp, value, tb); - } - #endif - } else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_ImportError, "init fontTools.cu2qu.cu2qu"); - } - __pyx_L0:; - __Pyx_RefNannyFinishContext(); - #if CYTHON_PEP489_MULTI_PHASE_INIT - return (__pyx_m != NULL) ? 0 : -1; - #elif PY_MAJOR_VERSION >= 3 - return __pyx_m; - #else - return; - #endif -} -/* #### Code section: cleanup_globals ### */ -/* #### Code section: cleanup_module ### */ -/* #### Code section: main_method ### */ -/* #### Code section: utility_code_pragmas ### */ -#ifdef _MSC_VER -#pragma warning( push ) -/* Warning 4127: conditional expression is constant - * Cython uses constant conditional expressions to allow in inline functions to be optimized at - * compile-time, so this warning is not useful - */ -#pragma warning( disable : 4127 ) -#endif - - - -/* #### Code section: utility_code_def ### */ - -/* --- Runtime support code --- */ -/* Refnanny */ -#if CYTHON_REFNANNY -static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { - PyObject *m = NULL, *p = NULL; - void *r = NULL; - m = PyImport_ImportModule(modname); - if (!m) goto end; - p = PyObject_GetAttrString(m, "RefNannyAPI"); - if (!p) goto end; - r = PyLong_AsVoidPtr(p); -end: - Py_XDECREF(p); - Py_XDECREF(m); - return (__Pyx_RefNannyAPIStruct *)r; -} -#endif - -/* PyErrExceptionMatches */ -#if CYTHON_FAST_THREAD_STATE -static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { - Py_ssize_t i, n; - n = PyTuple_GET_SIZE(tuple); -#if PY_MAJOR_VERSION >= 3 - for (i=0; i= 0x030C00A6 - PyObject *current_exception = tstate->current_exception; - if (unlikely(!current_exception)) return 0; - exc_type = (PyObject*) Py_TYPE(current_exception); - if (exc_type == err) return 1; -#else - exc_type = tstate->curexc_type; - if (exc_type == err) return 1; - if (unlikely(!exc_type)) return 0; -#endif - #if CYTHON_AVOID_BORROWED_REFS - Py_INCREF(exc_type); - #endif - if (unlikely(PyTuple_Check(err))) { - result = __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); - } else { - result = __Pyx_PyErr_GivenExceptionMatches(exc_type, err); - } - #if CYTHON_AVOID_BORROWED_REFS - Py_DECREF(exc_type); - #endif - return result; -} -#endif - -/* PyErrFetchRestore */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { -#if PY_VERSION_HEX >= 0x030C00A6 - PyObject *tmp_value; - assert(type == NULL || (value != NULL && type == (PyObject*) Py_TYPE(value))); - if (value) { - #if CYTHON_COMPILING_IN_CPYTHON - if (unlikely(((PyBaseExceptionObject*) value)->traceback != tb)) - #endif - PyException_SetTraceback(value, tb); - } - tmp_value = tstate->current_exception; - tstate->current_exception = value; - Py_XDECREF(tmp_value); - Py_XDECREF(type); - Py_XDECREF(tb); -#else - PyObject *tmp_type, *tmp_value, *tmp_tb; - tmp_type = tstate->curexc_type; - tmp_value = tstate->curexc_value; - tmp_tb = tstate->curexc_traceback; - tstate->curexc_type = type; - tstate->curexc_value = value; - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -#endif -} -static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { -#if PY_VERSION_HEX >= 0x030C00A6 - PyObject* exc_value; - exc_value = tstate->current_exception; - tstate->current_exception = 0; - *value = exc_value; - *type = NULL; - *tb = NULL; - if (exc_value) { - *type = (PyObject*) Py_TYPE(exc_value); - Py_INCREF(*type); - #if CYTHON_COMPILING_IN_CPYTHON - *tb = ((PyBaseExceptionObject*) exc_value)->traceback; - Py_XINCREF(*tb); - #else - *tb = PyException_GetTraceback(exc_value); - #endif - } -#else - *type = tstate->curexc_type; - *value = tstate->curexc_value; - *tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; -#endif -} -#endif - -/* PyObjectGetAttrStr */ -#if CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { - PyTypeObject* tp = Py_TYPE(obj); - if (likely(tp->tp_getattro)) - return tp->tp_getattro(obj, attr_name); -#if PY_MAJOR_VERSION < 3 - if (likely(tp->tp_getattr)) - return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); -#endif - return PyObject_GetAttr(obj, attr_name); -} -#endif - -/* PyObjectGetAttrStrNoError */ -#if __PYX_LIMITED_VERSION_HEX < 0x030d00A1 -static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) - __Pyx_PyErr_Clear(); -} -#endif -static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { - PyObject *result; -#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 - (void) PyObject_GetOptionalAttr(obj, attr_name, &result); - return result; -#else -#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 - PyTypeObject* tp = Py_TYPE(obj); - if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { - return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); - } -#endif - result = __Pyx_PyObject_GetAttrStr(obj, attr_name); - if (unlikely(!result)) { - __Pyx_PyObject_GetAttrStr_ClearAttributeError(); - } - return result; -#endif -} - -/* GetBuiltinName */ -static PyObject *__Pyx_GetBuiltinName(PyObject *name) { - PyObject* result = __Pyx_PyObject_GetAttrStrNoError(__pyx_b, name); - if (unlikely(!result) && !PyErr_Occurred()) { - PyErr_Format(PyExc_NameError, -#if PY_MAJOR_VERSION >= 3 - "name '%U' is not defined", name); -#else - "name '%.200s' is not defined", PyString_AS_STRING(name)); -#endif - } - return result; -} - -/* PyIntCompare */ -static CYTHON_INLINE int __Pyx_PyInt_BoolEqObjC(PyObject *op1, PyObject *op2, long intval, long inplace) { - CYTHON_MAYBE_UNUSED_VAR(intval); - CYTHON_UNUSED_VAR(inplace); - if (op1 == op2) { - return 1; - } - #if PY_MAJOR_VERSION < 3 - if (likely(PyInt_CheckExact(op1))) { - const long b = intval; - long a = PyInt_AS_LONG(op1); - return (a == b); - } - #endif - #if CYTHON_USE_PYLONG_INTERNALS - if (likely(PyLong_CheckExact(op1))) { - int unequal; - unsigned long uintval; - Py_ssize_t size = __Pyx_PyLong_DigitCount(op1); - const digit* digits = __Pyx_PyLong_Digits(op1); - if (intval == 0) { - return (__Pyx_PyLong_IsZero(op1) == 1); - } else if (intval < 0) { - if (__Pyx_PyLong_IsNonNeg(op1)) - return 0; - intval = -intval; - } else { - if (__Pyx_PyLong_IsNeg(op1)) - return 0; - } - uintval = (unsigned long) intval; -#if PyLong_SHIFT * 4 < SIZEOF_LONG*8 - if (uintval >> (PyLong_SHIFT * 4)) { - unequal = (size != 5) || (digits[0] != (uintval & (unsigned long) PyLong_MASK)) - | (digits[1] != ((uintval >> (1 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[2] != ((uintval >> (2 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[3] != ((uintval >> (3 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[4] != ((uintval >> (4 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)); - } else -#endif -#if PyLong_SHIFT * 3 < SIZEOF_LONG*8 - if (uintval >> (PyLong_SHIFT * 3)) { - unequal = (size != 4) || (digits[0] != (uintval & (unsigned long) PyLong_MASK)) - | (digits[1] != ((uintval >> (1 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[2] != ((uintval >> (2 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[3] != ((uintval >> (3 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)); - } else -#endif -#if PyLong_SHIFT * 2 < SIZEOF_LONG*8 - if (uintval >> (PyLong_SHIFT * 2)) { - unequal = (size != 3) || (digits[0] != (uintval & (unsigned long) PyLong_MASK)) - | (digits[1] != ((uintval >> (1 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)) | (digits[2] != ((uintval >> (2 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)); - } else -#endif -#if PyLong_SHIFT * 1 < SIZEOF_LONG*8 - if (uintval >> (PyLong_SHIFT * 1)) { - unequal = (size != 2) || (digits[0] != (uintval & (unsigned long) PyLong_MASK)) - | (digits[1] != ((uintval >> (1 * PyLong_SHIFT)) & (unsigned long) PyLong_MASK)); - } else -#endif - unequal = (size != 1) || (((unsigned long) digits[0]) != (uintval & (unsigned long) PyLong_MASK)); - return (unequal == 0); - } - #endif - if (PyFloat_CheckExact(op1)) { - const long b = intval; -#if CYTHON_COMPILING_IN_LIMITED_API - double a = __pyx_PyFloat_AsDouble(op1); -#else - double a = PyFloat_AS_DOUBLE(op1); -#endif - return ((double)a == (double)b); - } - return __Pyx_PyObject_IsTrueAndDecref( - PyObject_RichCompare(op1, op2, Py_EQ)); -} - -/* RaiseTooManyValuesToUnpack */ -static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { - PyErr_Format(PyExc_ValueError, - "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); -} - -/* RaiseNeedMoreValuesToUnpack */ -static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { - PyErr_Format(PyExc_ValueError, - "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", - index, (index == 1) ? "" : "s"); -} - -/* IterFinish */ -static CYTHON_INLINE int __Pyx_IterFinish(void) { - PyObject* exc_type; - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - exc_type = __Pyx_PyErr_CurrentExceptionType(); - if (unlikely(exc_type)) { - if (unlikely(!__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) - return -1; - __Pyx_PyErr_Clear(); - return 0; - } - return 0; -} - -/* UnpackItemEndCheck */ -static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { - if (unlikely(retval)) { - Py_DECREF(retval); - __Pyx_RaiseTooManyValuesError(expected); - return -1; - } - return __Pyx_IterFinish(); -} - -/* GetItemInt */ -static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { - PyObject *r; - if (unlikely(!j)) return NULL; - r = PyObject_GetItem(o, j); - Py_DECREF(j); - return r; -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, - CYTHON_NCP_UNUSED int wraparound, - CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - Py_ssize_t wrapped_i = i; - if (wraparound & unlikely(i < 0)) { - wrapped_i += PyList_GET_SIZE(o); - } - if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { - PyObject *r = PyList_GET_ITEM(o, wrapped_i); - Py_INCREF(r); - return r; - } - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -#else - return PySequence_GetItem(o, i); -#endif -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, - CYTHON_NCP_UNUSED int wraparound, - CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - Py_ssize_t wrapped_i = i; - if (wraparound & unlikely(i < 0)) { - wrapped_i += PyTuple_GET_SIZE(o); - } - if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { - PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); - Py_INCREF(r); - return r; - } - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -#else - return PySequence_GetItem(o, i); -#endif -} -static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, - CYTHON_NCP_UNUSED int wraparound, - CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS - if (is_list || PyList_CheckExact(o)) { - Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); - if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { - PyObject *r = PyList_GET_ITEM(o, n); - Py_INCREF(r); - return r; - } - } - else if (PyTuple_CheckExact(o)) { - Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); - if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { - PyObject *r = PyTuple_GET_ITEM(o, n); - Py_INCREF(r); - return r; - } - } else { - PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping; - PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence; - if (mm && mm->mp_subscript) { - PyObject *r, *key = PyInt_FromSsize_t(i); - if (unlikely(!key)) return NULL; - r = mm->mp_subscript(o, key); - Py_DECREF(key); - return r; - } - if (likely(sm && sm->sq_item)) { - if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) { - Py_ssize_t l = sm->sq_length(o); - if (likely(l >= 0)) { - i += l; - } else { - if (!PyErr_ExceptionMatches(PyExc_OverflowError)) - return NULL; - PyErr_Clear(); - } - } - return sm->sq_item(o, i); - } - } -#else - if (is_list || !PyMapping_Check(o)) { - return PySequence_GetItem(o, i); - } -#endif - return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); -} - -/* PyDictVersioning */ -#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS -static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; -} -static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { - PyObject **dictptr = NULL; - Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; - if (offset) { -#if CYTHON_COMPILING_IN_CPYTHON - dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); -#else - dictptr = _PyObject_GetDictPtr(obj); -#endif - } - return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; -} -static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { - PyObject *dict = Py_TYPE(obj)->tp_dict; - if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) - return 0; - return obj_dict_version == __Pyx_get_object_dict_version(obj); -} -#endif - -/* GetModuleGlobalName */ -#if CYTHON_USE_DICT_VERSIONS -static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) -#else -static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) -#endif -{ - PyObject *result; -#if !CYTHON_AVOID_BORROWED_REFS -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && PY_VERSION_HEX < 0x030d0000 - result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } else if (unlikely(PyErr_Occurred())) { - return NULL; - } -#elif CYTHON_COMPILING_IN_LIMITED_API - if (unlikely(!__pyx_m)) { - return NULL; - } - result = PyObject_GetAttr(__pyx_m, name); - if (likely(result)) { - return result; - } -#else - result = PyDict_GetItem(__pyx_d, name); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } -#endif -#else - result = PyObject_GetItem(__pyx_d, name); - __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) - if (likely(result)) { - return __Pyx_NewRef(result); - } - PyErr_Clear(); -#endif - return __Pyx_GetBuiltinName(name); -} - -/* PyFunctionFastCall */ -#if CYTHON_FAST_PYCALL && !CYTHON_VECTORCALL -static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, - PyObject *globals) { - PyFrameObject *f; - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject **fastlocals; - Py_ssize_t i; - PyObject *result; - assert(globals != NULL); - /* XXX Perhaps we should create a specialized - PyFrame_New() that doesn't take locals, but does - take builtins without sanity checking them. - */ - assert(tstate != NULL); - f = PyFrame_New(tstate, co, globals, NULL); - if (f == NULL) { - return NULL; - } - fastlocals = __Pyx_PyFrame_GetLocalsplus(f); - for (i = 0; i < na; i++) { - Py_INCREF(*args); - fastlocals[i] = *args++; - } - result = PyEval_EvalFrameEx(f,0); - ++tstate->recursion_depth; - Py_DECREF(f); - --tstate->recursion_depth; - return result; -} -static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { - PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); - PyObject *globals = PyFunction_GET_GLOBALS(func); - PyObject *argdefs = PyFunction_GET_DEFAULTS(func); - PyObject *closure; -#if PY_MAJOR_VERSION >= 3 - PyObject *kwdefs; -#endif - PyObject *kwtuple, **k; - PyObject **d; - Py_ssize_t nd; - Py_ssize_t nk; - PyObject *result; - assert(kwargs == NULL || PyDict_Check(kwargs)); - nk = kwargs ? PyDict_Size(kwargs) : 0; - #if PY_MAJOR_VERSION < 3 - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) { - return NULL; - } - #else - if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) { - return NULL; - } - #endif - if ( -#if PY_MAJOR_VERSION >= 3 - co->co_kwonlyargcount == 0 && -#endif - likely(kwargs == NULL || nk == 0) && - co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { - if (argdefs == NULL && co->co_argcount == nargs) { - result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); - goto done; - } - else if (nargs == 0 && argdefs != NULL - && co->co_argcount == Py_SIZE(argdefs)) { - /* function called with no arguments, but all parameters have - a default value: use default values as arguments .*/ - args = &PyTuple_GET_ITEM(argdefs, 0); - result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); - goto done; - } - } - if (kwargs != NULL) { - Py_ssize_t pos, i; - kwtuple = PyTuple_New(2 * nk); - if (kwtuple == NULL) { - result = NULL; - goto done; - } - k = &PyTuple_GET_ITEM(kwtuple, 0); - pos = i = 0; - while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { - Py_INCREF(k[i]); - Py_INCREF(k[i+1]); - i += 2; - } - nk = i / 2; - } - else { - kwtuple = NULL; - k = NULL; - } - closure = PyFunction_GET_CLOSURE(func); -#if PY_MAJOR_VERSION >= 3 - kwdefs = PyFunction_GET_KW_DEFAULTS(func); -#endif - if (argdefs != NULL) { - d = &PyTuple_GET_ITEM(argdefs, 0); - nd = Py_SIZE(argdefs); - } - else { - d = NULL; - nd = 0; - } -#if PY_MAJOR_VERSION >= 3 - result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, kwdefs, closure); -#else - result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, - args, (int)nargs, - k, (int)nk, - d, (int)nd, closure); -#endif - Py_XDECREF(kwtuple); -done: - Py_LeaveRecursiveCall(); - return result; -} -#endif - -/* PyObjectCall */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { - PyObject *result; - ternaryfunc call = Py_TYPE(func)->tp_call; - if (unlikely(!call)) - return PyObject_Call(func, arg, kw); - #if PY_MAJOR_VERSION < 3 - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - #else - if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) - return NULL; - #endif - result = (*call)(func, arg, kw); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -/* PyObjectCallMethO */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { - PyObject *self, *result; - PyCFunction cfunc; - cfunc = __Pyx_CyOrPyCFunction_GET_FUNCTION(func); - self = __Pyx_CyOrPyCFunction_GET_SELF(func); - #if PY_MAJOR_VERSION < 3 - if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) - return NULL; - #else - if (unlikely(Py_EnterRecursiveCall(" while calling a Python object"))) - return NULL; - #endif - result = cfunc(self, arg); - Py_LeaveRecursiveCall(); - if (unlikely(!result) && unlikely(!PyErr_Occurred())) { - PyErr_SetString( - PyExc_SystemError, - "NULL result without error in PyObject_Call"); - } - return result; -} -#endif - -/* PyObjectFastCall */ -#if PY_VERSION_HEX < 0x03090000 || CYTHON_COMPILING_IN_LIMITED_API -static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs) { - PyObject *argstuple; - PyObject *result = 0; - size_t i; - argstuple = PyTuple_New((Py_ssize_t)nargs); - if (unlikely(!argstuple)) return NULL; - for (i = 0; i < nargs; i++) { - Py_INCREF(args[i]); - if (__Pyx_PyTuple_SET_ITEM(argstuple, (Py_ssize_t)i, args[i]) < 0) goto bad; - } - result = __Pyx_PyObject_Call(func, argstuple, kwargs); - bad: - Py_DECREF(argstuple); - return result; -} -#endif -static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t _nargs, PyObject *kwargs) { - Py_ssize_t nargs = __Pyx_PyVectorcall_NARGS(_nargs); -#if CYTHON_COMPILING_IN_CPYTHON - if (nargs == 0 && kwargs == NULL) { - if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_NOARGS)) - return __Pyx_PyObject_CallMethO(func, NULL); - } - else if (nargs == 1 && kwargs == NULL) { - if (__Pyx_CyOrPyCFunction_Check(func) && likely( __Pyx_CyOrPyCFunction_GET_FLAGS(func) & METH_O)) - return __Pyx_PyObject_CallMethO(func, args[0]); - } -#endif - #if PY_VERSION_HEX < 0x030800B1 - #if CYTHON_FAST_PYCCALL - if (PyCFunction_Check(func)) { - if (kwargs) { - return _PyCFunction_FastCallDict(func, args, nargs, kwargs); - } else { - return _PyCFunction_FastCallKeywords(func, args, nargs, NULL); - } - } - #if PY_VERSION_HEX >= 0x030700A1 - if (!kwargs && __Pyx_IS_TYPE(func, &PyMethodDescr_Type)) { - return _PyMethodDescr_FastCallKeywords(func, args, nargs, NULL); - } - #endif - #endif - #if CYTHON_FAST_PYCALL - if (PyFunction_Check(func)) { - return __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs); - } - #endif - #endif - if (kwargs == NULL) { - #if CYTHON_VECTORCALL - #if PY_VERSION_HEX < 0x03090000 - vectorcallfunc f = _PyVectorcall_Function(func); - #else - vectorcallfunc f = PyVectorcall_Function(func); - #endif - if (f) { - return f(func, args, (size_t)nargs, NULL); - } - #elif defined(__Pyx_CyFunction_USED) && CYTHON_BACKPORT_VECTORCALL - if (__Pyx_CyFunction_CheckExact(func)) { - __pyx_vectorcallfunc f = __Pyx_CyFunction_func_vectorcall(func); - if (f) return f(func, args, (size_t)nargs, NULL); - } - #endif - } - if (nargs == 0) { - return __Pyx_PyObject_Call(func, __pyx_empty_tuple, kwargs); - } - #if PY_VERSION_HEX >= 0x03090000 && !CYTHON_COMPILING_IN_LIMITED_API - return PyObject_VectorcallDict(func, args, (size_t)nargs, kwargs); - #else - return __Pyx_PyObject_FastCall_fallback(func, args, (size_t)nargs, kwargs); - #endif -} - -/* TupleAndListFromArray */ -#if CYTHON_COMPILING_IN_CPYTHON -static CYTHON_INLINE void __Pyx_copy_object_array(PyObject *const *CYTHON_RESTRICT src, PyObject** CYTHON_RESTRICT dest, Py_ssize_t length) { - PyObject *v; - Py_ssize_t i; - for (i = 0; i < length; i++) { - v = dest[i] = src[i]; - Py_INCREF(v); - } -} -static CYTHON_INLINE PyObject * -__Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n) -{ - PyObject *res; - if (n <= 0) { - Py_INCREF(__pyx_empty_tuple); - return __pyx_empty_tuple; - } - res = PyTuple_New(n); - if (unlikely(res == NULL)) return NULL; - __Pyx_copy_object_array(src, ((PyTupleObject*)res)->ob_item, n); - return res; -} -static CYTHON_INLINE PyObject * -__Pyx_PyList_FromArray(PyObject *const *src, Py_ssize_t n) -{ - PyObject *res; - if (n <= 0) { - return PyList_New(0); - } - res = PyList_New(n); - if (unlikely(res == NULL)) return NULL; - __Pyx_copy_object_array(src, ((PyListObject*)res)->ob_item, n); - return res; -} -#endif - -/* BytesEquals */ -static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { -#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API - return PyObject_RichCompareBool(s1, s2, equals); -#else - if (s1 == s2) { - return (equals == Py_EQ); - } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { - const char *ps1, *ps2; - Py_ssize_t length = PyBytes_GET_SIZE(s1); - if (length != PyBytes_GET_SIZE(s2)) - return (equals == Py_NE); - ps1 = PyBytes_AS_STRING(s1); - ps2 = PyBytes_AS_STRING(s2); - if (ps1[0] != ps2[0]) { - return (equals == Py_NE); - } else if (length == 1) { - return (equals == Py_EQ); - } else { - int result; -#if CYTHON_USE_UNICODE_INTERNALS && (PY_VERSION_HEX < 0x030B0000) - Py_hash_t hash1, hash2; - hash1 = ((PyBytesObject*)s1)->ob_shash; - hash2 = ((PyBytesObject*)s2)->ob_shash; - if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { - return (equals == Py_NE); - } -#endif - result = memcmp(ps1, ps2, (size_t)length); - return (equals == Py_EQ) ? (result == 0) : (result != 0); - } - } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { - return (equals == Py_NE); - } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { - return (equals == Py_NE); - } else { - int result; - PyObject* py_result = PyObject_RichCompare(s1, s2, equals); - if (!py_result) - return -1; - result = __Pyx_PyObject_IsTrue(py_result); - Py_DECREF(py_result); - return result; - } -#endif -} - -/* UnicodeEquals */ -static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { -#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API - return PyObject_RichCompareBool(s1, s2, equals); -#else -#if PY_MAJOR_VERSION < 3 - PyObject* owned_ref = NULL; -#endif - int s1_is_unicode, s2_is_unicode; - if (s1 == s2) { - goto return_eq; - } - s1_is_unicode = PyUnicode_CheckExact(s1); - s2_is_unicode = PyUnicode_CheckExact(s2); -#if PY_MAJOR_VERSION < 3 - if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { - owned_ref = PyUnicode_FromObject(s2); - if (unlikely(!owned_ref)) - return -1; - s2 = owned_ref; - s2_is_unicode = 1; - } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { - owned_ref = PyUnicode_FromObject(s1); - if (unlikely(!owned_ref)) - return -1; - s1 = owned_ref; - s1_is_unicode = 1; - } else if (((!s2_is_unicode) & (!s1_is_unicode))) { - return __Pyx_PyBytes_Equals(s1, s2, equals); - } -#endif - if (s1_is_unicode & s2_is_unicode) { - Py_ssize_t length; - int kind; - void *data1, *data2; - if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) - return -1; - length = __Pyx_PyUnicode_GET_LENGTH(s1); - if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { - goto return_ne; - } -#if CYTHON_USE_UNICODE_INTERNALS - { - Py_hash_t hash1, hash2; - #if CYTHON_PEP393_ENABLED - hash1 = ((PyASCIIObject*)s1)->hash; - hash2 = ((PyASCIIObject*)s2)->hash; - #else - hash1 = ((PyUnicodeObject*)s1)->hash; - hash2 = ((PyUnicodeObject*)s2)->hash; - #endif - if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { - goto return_ne; - } - } -#endif - kind = __Pyx_PyUnicode_KIND(s1); - if (kind != __Pyx_PyUnicode_KIND(s2)) { - goto return_ne; - } - data1 = __Pyx_PyUnicode_DATA(s1); - data2 = __Pyx_PyUnicode_DATA(s2); - if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { - goto return_ne; - } else if (length == 1) { - goto return_eq; - } else { - int result = memcmp(data1, data2, (size_t)(length * kind)); - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(owned_ref); - #endif - return (equals == Py_EQ) ? (result == 0) : (result != 0); - } - } else if ((s1 == Py_None) & s2_is_unicode) { - goto return_ne; - } else if ((s2 == Py_None) & s1_is_unicode) { - goto return_ne; - } else { - int result; - PyObject* py_result = PyObject_RichCompare(s1, s2, equals); - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(owned_ref); - #endif - if (!py_result) - return -1; - result = __Pyx_PyObject_IsTrue(py_result); - Py_DECREF(py_result); - return result; - } -return_eq: - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(owned_ref); - #endif - return (equals == Py_EQ); -return_ne: - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(owned_ref); - #endif - return (equals == Py_NE); -#endif -} - -/* fastcall */ -#if CYTHON_METH_FASTCALL -static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues, PyObject *s) -{ - Py_ssize_t i, n = PyTuple_GET_SIZE(kwnames); - for (i = 0; i < n; i++) - { - if (s == PyTuple_GET_ITEM(kwnames, i)) return kwvalues[i]; - } - for (i = 0; i < n; i++) - { - int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); - if (unlikely(eq != 0)) { - if (unlikely(eq < 0)) return NULL; - return kwvalues[i]; - } - } - return NULL; -} -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 -CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { - Py_ssize_t i, nkwargs = PyTuple_GET_SIZE(kwnames); - PyObject *dict; - dict = PyDict_New(); - if (unlikely(!dict)) - return NULL; - for (i=0; i= 3 - "%s() got multiple values for keyword argument '%U'", func_name, kw_name); - #else - "%s() got multiple values for keyword argument '%s'", func_name, - PyString_AsString(kw_name)); - #endif -} - -/* ParseKeywords */ -static int __Pyx_ParseOptionalKeywords( - PyObject *kwds, - PyObject *const *kwvalues, - PyObject **argnames[], - PyObject *kwds2, - PyObject *values[], - Py_ssize_t num_pos_args, - const char* function_name) -{ - PyObject *key = 0, *value = 0; - Py_ssize_t pos = 0; - PyObject*** name; - PyObject*** first_kw_arg = argnames + num_pos_args; - int kwds_is_tuple = CYTHON_METH_FASTCALL && likely(PyTuple_Check(kwds)); - while (1) { - Py_XDECREF(key); key = NULL; - Py_XDECREF(value); value = NULL; - if (kwds_is_tuple) { - Py_ssize_t size; -#if CYTHON_ASSUME_SAFE_MACROS - size = PyTuple_GET_SIZE(kwds); -#else - size = PyTuple_Size(kwds); - if (size < 0) goto bad; -#endif - if (pos >= size) break; -#if CYTHON_AVOID_BORROWED_REFS - key = __Pyx_PySequence_ITEM(kwds, pos); - if (!key) goto bad; -#elif CYTHON_ASSUME_SAFE_MACROS - key = PyTuple_GET_ITEM(kwds, pos); -#else - key = PyTuple_GetItem(kwds, pos); - if (!key) goto bad; -#endif - value = kwvalues[pos]; - pos++; - } - else - { - if (!PyDict_Next(kwds, &pos, &key, &value)) break; -#if CYTHON_AVOID_BORROWED_REFS - Py_INCREF(key); -#endif - } - name = first_kw_arg; - while (*name && (**name != key)) name++; - if (*name) { - values[name-argnames] = value; -#if CYTHON_AVOID_BORROWED_REFS - Py_INCREF(value); - Py_DECREF(key); -#endif - key = NULL; - value = NULL; - continue; - } -#if !CYTHON_AVOID_BORROWED_REFS - Py_INCREF(key); -#endif - Py_INCREF(value); - name = first_kw_arg; - #if PY_MAJOR_VERSION < 3 - if (likely(PyString_Check(key))) { - while (*name) { - if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) - && _PyString_Eq(**name, key)) { - values[name-argnames] = value; -#if CYTHON_AVOID_BORROWED_REFS - value = NULL; -#endif - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - if ((**argname == key) || ( - (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) - && _PyString_Eq(**argname, key))) { - goto arg_passed_twice; - } - argname++; - } - } - } else - #endif - if (likely(PyUnicode_Check(key))) { - while (*name) { - int cmp = ( - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : - #endif - PyUnicode_Compare(**name, key) - ); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) { - values[name-argnames] = value; -#if CYTHON_AVOID_BORROWED_REFS - value = NULL; -#endif - break; - } - name++; - } - if (*name) continue; - else { - PyObject*** argname = argnames; - while (argname != first_kw_arg) { - int cmp = (**argname == key) ? 0 : - #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 - (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : - #endif - PyUnicode_Compare(**argname, key); - if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; - if (cmp == 0) goto arg_passed_twice; - argname++; - } - } - } else - goto invalid_keyword_type; - if (kwds2) { - if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; - } else { - goto invalid_keyword; - } - } - Py_XDECREF(key); - Py_XDECREF(value); - return 0; -arg_passed_twice: - __Pyx_RaiseDoubleKeywordsError(function_name, key); - goto bad; -invalid_keyword_type: - PyErr_Format(PyExc_TypeError, - "%.200s() keywords must be strings", function_name); - goto bad; -invalid_keyword: - #if PY_MAJOR_VERSION < 3 - PyErr_Format(PyExc_TypeError, - "%.200s() got an unexpected keyword argument '%.200s'", - function_name, PyString_AsString(key)); - #else - PyErr_Format(PyExc_TypeError, - "%s() got an unexpected keyword argument '%U'", - function_name, key); - #endif -bad: - Py_XDECREF(key); - Py_XDECREF(value); - return -1; -} - -/* GetException */ -#if CYTHON_FAST_THREAD_STATE -static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) -#else -static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) -#endif -{ - PyObject *local_type = NULL, *local_value, *local_tb = NULL; -#if CYTHON_FAST_THREAD_STATE - PyObject *tmp_type, *tmp_value, *tmp_tb; - #if PY_VERSION_HEX >= 0x030C00A6 - local_value = tstate->current_exception; - tstate->current_exception = 0; - if (likely(local_value)) { - local_type = (PyObject*) Py_TYPE(local_value); - Py_INCREF(local_type); - local_tb = PyException_GetTraceback(local_value); - } - #else - local_type = tstate->curexc_type; - local_value = tstate->curexc_value; - local_tb = tstate->curexc_traceback; - tstate->curexc_type = 0; - tstate->curexc_value = 0; - tstate->curexc_traceback = 0; - #endif -#else - PyErr_Fetch(&local_type, &local_value, &local_tb); -#endif - PyErr_NormalizeException(&local_type, &local_value, &local_tb); -#if CYTHON_FAST_THREAD_STATE && PY_VERSION_HEX >= 0x030C00A6 - if (unlikely(tstate->current_exception)) -#elif CYTHON_FAST_THREAD_STATE - if (unlikely(tstate->curexc_type)) -#else - if (unlikely(PyErr_Occurred())) -#endif - goto bad; - #if PY_MAJOR_VERSION >= 3 - if (local_tb) { - if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) - goto bad; - } - #endif - Py_XINCREF(local_tb); - Py_XINCREF(local_type); - Py_XINCREF(local_value); - *type = local_type; - *value = local_value; - *tb = local_tb; -#if CYTHON_FAST_THREAD_STATE - #if CYTHON_USE_EXC_INFO_STACK - { - _PyErr_StackItem *exc_info = tstate->exc_info; - #if PY_VERSION_HEX >= 0x030B00a4 - tmp_value = exc_info->exc_value; - exc_info->exc_value = local_value; - tmp_type = NULL; - tmp_tb = NULL; - Py_XDECREF(local_type); - Py_XDECREF(local_tb); - #else - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = local_type; - exc_info->exc_value = local_value; - exc_info->exc_traceback = local_tb; - #endif - } - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = local_type; - tstate->exc_value = local_value; - tstate->exc_traceback = local_tb; - #endif - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); -#else - PyErr_SetExcInfo(local_type, local_value, local_tb); -#endif - return 0; -bad: - *type = 0; - *value = 0; - *tb = 0; - Py_XDECREF(local_type); - Py_XDECREF(local_value); - Py_XDECREF(local_tb); - return -1; -} - -/* pep479 */ -static void __Pyx_Generator_Replace_StopIteration(int in_async_gen) { - PyObject *exc, *val, *tb, *cur_exc; - __Pyx_PyThreadState_declare - #ifdef __Pyx_StopAsyncIteration_USED - int is_async_stopiteration = 0; - #endif - CYTHON_MAYBE_UNUSED_VAR(in_async_gen); - cur_exc = PyErr_Occurred(); - if (likely(!__Pyx_PyErr_GivenExceptionMatches(cur_exc, PyExc_StopIteration))) { - #ifdef __Pyx_StopAsyncIteration_USED - if (in_async_gen && unlikely(__Pyx_PyErr_GivenExceptionMatches(cur_exc, __Pyx_PyExc_StopAsyncIteration))) { - is_async_stopiteration = 1; - } else - #endif - return; - } - __Pyx_PyThreadState_assign - __Pyx_GetException(&exc, &val, &tb); - Py_XDECREF(exc); - Py_XDECREF(val); - Py_XDECREF(tb); - PyErr_SetString(PyExc_RuntimeError, - #ifdef __Pyx_StopAsyncIteration_USED - is_async_stopiteration ? "async generator raised StopAsyncIteration" : - in_async_gen ? "async generator raised StopIteration" : - #endif - "generator raised StopIteration"); -} - -/* GetTopmostException */ -#if CYTHON_USE_EXC_INFO_STACK && CYTHON_FAST_THREAD_STATE -static _PyErr_StackItem * -__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) -{ - _PyErr_StackItem *exc_info = tstate->exc_info; - while ((exc_info->exc_value == NULL || exc_info->exc_value == Py_None) && - exc_info->previous_item != NULL) - { - exc_info = exc_info->previous_item; - } - return exc_info; -} -#endif - -/* SaveResetException */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 - _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); - PyObject *exc_value = exc_info->exc_value; - if (exc_value == NULL || exc_value == Py_None) { - *value = NULL; - *type = NULL; - *tb = NULL; - } else { - *value = exc_value; - Py_INCREF(*value); - *type = (PyObject*) Py_TYPE(exc_value); - Py_INCREF(*type); - *tb = PyException_GetTraceback(exc_value); - } - #elif CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); - *type = exc_info->exc_type; - *value = exc_info->exc_value; - *tb = exc_info->exc_traceback; - Py_XINCREF(*type); - Py_XINCREF(*value); - Py_XINCREF(*tb); - #else - *type = tstate->exc_type; - *value = tstate->exc_value; - *tb = tstate->exc_traceback; - Py_XINCREF(*type); - Py_XINCREF(*value); - Py_XINCREF(*tb); - #endif -} -static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { - #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 - _PyErr_StackItem *exc_info = tstate->exc_info; - PyObject *tmp_value = exc_info->exc_value; - exc_info->exc_value = value; - Py_XDECREF(tmp_value); - Py_XDECREF(type); - Py_XDECREF(tb); - #else - PyObject *tmp_type, *tmp_value, *tmp_tb; - #if CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = type; - exc_info->exc_value = value; - exc_info->exc_traceback = tb; - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = type; - tstate->exc_value = value; - tstate->exc_traceback = tb; - #endif - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); - #endif -} -#endif - -/* IterNext */ -static PyObject *__Pyx_PyIter_Next2Default(PyObject* defval) { - PyObject* exc_type; - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - exc_type = __Pyx_PyErr_CurrentExceptionType(); - if (unlikely(exc_type)) { - if (!defval || unlikely(!__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) - return NULL; - __Pyx_PyErr_Clear(); - Py_INCREF(defval); - return defval; - } - if (defval) { - Py_INCREF(defval); - return defval; - } - __Pyx_PyErr_SetNone(PyExc_StopIteration); - return NULL; -} -static void __Pyx_PyIter_Next_ErrorNoIterator(PyObject *iterator) { - __Pyx_TypeName iterator_type_name = __Pyx_PyType_GetName(Py_TYPE(iterator)); - PyErr_Format(PyExc_TypeError, - __Pyx_FMT_TYPENAME " object is not an iterator", iterator_type_name); - __Pyx_DECREF_TypeName(iterator_type_name); -} -static CYTHON_INLINE PyObject *__Pyx_PyIter_Next2(PyObject* iterator, PyObject* defval) { - PyObject* next; - iternextfunc iternext = Py_TYPE(iterator)->tp_iternext; - if (likely(iternext)) { -#if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY - next = iternext(iterator); - if (likely(next)) - return next; -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030d0000 - if (unlikely(iternext == &_PyObject_NextNotImplemented)) - return NULL; -#endif -#else - next = PyIter_Next(iterator); - if (likely(next)) - return next; -#endif - } else if (CYTHON_USE_TYPE_SLOTS || unlikely(!PyIter_Check(iterator))) { - __Pyx_PyIter_Next_ErrorNoIterator(iterator); - return NULL; - } -#if !CYTHON_USE_TYPE_SLOTS - else { - next = PyIter_Next(iterator); - if (likely(next)) - return next; - } -#endif - return __Pyx_PyIter_Next2Default(defval); -} - -/* PyIntBinop */ -#if !CYTHON_COMPILING_IN_PYPY -static PyObject* __Pyx_PyInt_AddObjC(PyObject *op1, PyObject *op2, long intval, int inplace, int zerodivision_check) { - CYTHON_MAYBE_UNUSED_VAR(intval); - CYTHON_MAYBE_UNUSED_VAR(inplace); - CYTHON_UNUSED_VAR(zerodivision_check); - #if PY_MAJOR_VERSION < 3 - if (likely(PyInt_CheckExact(op1))) { - const long b = intval; - long x; - long a = PyInt_AS_LONG(op1); - - x = (long)((unsigned long)a + (unsigned long)b); - if (likely((x^a) >= 0 || (x^b) >= 0)) - return PyInt_FromLong(x); - return PyLong_Type.tp_as_number->nb_add(op1, op2); - } - #endif - #if CYTHON_USE_PYLONG_INTERNALS - if (likely(PyLong_CheckExact(op1))) { - const long b = intval; - long a, x; -#ifdef HAVE_LONG_LONG - const PY_LONG_LONG llb = intval; - PY_LONG_LONG lla, llx; -#endif - if (unlikely(__Pyx_PyLong_IsZero(op1))) { - return __Pyx_NewRef(op2); - } - if (likely(__Pyx_PyLong_IsCompact(op1))) { - a = __Pyx_PyLong_CompactValue(op1); - } else { - const digit* digits = __Pyx_PyLong_Digits(op1); - const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(op1); - switch (size) { - case -2: - if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - a = -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; - #ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { - lla = -(PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; - #endif - } - CYTHON_FALLTHROUGH; - case 2: - if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { - a = (long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; - #ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 2 * PyLong_SHIFT) { - lla = (PY_LONG_LONG) (((((unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; - #endif - } - CYTHON_FALLTHROUGH; - case -3: - if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - a = -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; - #ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { - lla = -(PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; - #endif - } - CYTHON_FALLTHROUGH; - case 3: - if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { - a = (long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; - #ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 3 * PyLong_SHIFT) { - lla = (PY_LONG_LONG) (((((((unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; - #endif - } - CYTHON_FALLTHROUGH; - case -4: - if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - a = -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; - #ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { - lla = -(PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; - #endif - } - CYTHON_FALLTHROUGH; - case 4: - if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { - a = (long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])); - break; - #ifdef HAVE_LONG_LONG - } else if (8 * sizeof(PY_LONG_LONG) - 1 > 4 * PyLong_SHIFT) { - lla = (PY_LONG_LONG) (((((((((unsigned PY_LONG_LONG)digits[3]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[2]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[1]) << PyLong_SHIFT) | (unsigned PY_LONG_LONG)digits[0])); - goto long_long; - #endif - } - CYTHON_FALLTHROUGH; - default: return PyLong_Type.tp_as_number->nb_add(op1, op2); - } - } - x = a + b; - return PyLong_FromLong(x); -#ifdef HAVE_LONG_LONG - long_long: - llx = lla + llb; - return PyLong_FromLongLong(llx); -#endif - - - } - #endif - if (PyFloat_CheckExact(op1)) { - const long b = intval; -#if CYTHON_COMPILING_IN_LIMITED_API - double a = __pyx_PyFloat_AsDouble(op1); -#else - double a = PyFloat_AS_DOUBLE(op1); -#endif - double result; - - PyFPE_START_PROTECT("add", return NULL) - result = ((double)a) + (double)b; - PyFPE_END_PROTECT(result) - return PyFloat_FromDouble(result); - } - return (inplace ? PyNumber_InPlaceAdd : PyNumber_Add)(op1, op2); -} -#endif - -/* RaiseException */ -#if PY_MAJOR_VERSION < 3 -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { - __Pyx_PyThreadState_declare - CYTHON_UNUSED_VAR(cause); - Py_XINCREF(type); - if (!value || value == Py_None) - value = NULL; - else - Py_INCREF(value); - if (!tb || tb == Py_None) - tb = NULL; - else { - Py_INCREF(tb); - if (!PyTraceBack_Check(tb)) { - PyErr_SetString(PyExc_TypeError, - "raise: arg 3 must be a traceback or None"); - goto raise_error; - } - } - if (PyType_Check(type)) { -#if CYTHON_COMPILING_IN_PYPY - if (!value) { - Py_INCREF(Py_None); - value = Py_None; - } -#endif - PyErr_NormalizeException(&type, &value, &tb); - } else { - if (value) { - PyErr_SetString(PyExc_TypeError, - "instance exception may not have a separate value"); - goto raise_error; - } - value = type; - type = (PyObject*) Py_TYPE(type); - Py_INCREF(type); - if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { - PyErr_SetString(PyExc_TypeError, - "raise: exception class must be a subclass of BaseException"); - goto raise_error; - } - } - __Pyx_PyThreadState_assign - __Pyx_ErrRestore(type, value, tb); - return; -raise_error: - Py_XDECREF(value); - Py_XDECREF(type); - Py_XDECREF(tb); - return; -} -#else -static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { - PyObject* owned_instance = NULL; - if (tb == Py_None) { - tb = 0; - } else if (tb && !PyTraceBack_Check(tb)) { - PyErr_SetString(PyExc_TypeError, - "raise: arg 3 must be a traceback or None"); - goto bad; - } - if (value == Py_None) - value = 0; - if (PyExceptionInstance_Check(type)) { - if (value) { - PyErr_SetString(PyExc_TypeError, - "instance exception may not have a separate value"); - goto bad; - } - value = type; - type = (PyObject*) Py_TYPE(value); - } else if (PyExceptionClass_Check(type)) { - PyObject *instance_class = NULL; - if (value && PyExceptionInstance_Check(value)) { - instance_class = (PyObject*) Py_TYPE(value); - if (instance_class != type) { - int is_subclass = PyObject_IsSubclass(instance_class, type); - if (!is_subclass) { - instance_class = NULL; - } else if (unlikely(is_subclass == -1)) { - goto bad; - } else { - type = instance_class; - } - } - } - if (!instance_class) { - PyObject *args; - if (!value) - args = PyTuple_New(0); - else if (PyTuple_Check(value)) { - Py_INCREF(value); - args = value; - } else - args = PyTuple_Pack(1, value); - if (!args) - goto bad; - owned_instance = PyObject_Call(type, args, NULL); - Py_DECREF(args); - if (!owned_instance) - goto bad; - value = owned_instance; - if (!PyExceptionInstance_Check(value)) { - PyErr_Format(PyExc_TypeError, - "calling %R should have returned an instance of " - "BaseException, not %R", - type, Py_TYPE(value)); - goto bad; - } - } - } else { - PyErr_SetString(PyExc_TypeError, - "raise: exception class must be a subclass of BaseException"); - goto bad; - } - if (cause) { - PyObject *fixed_cause; - if (cause == Py_None) { - fixed_cause = NULL; - } else if (PyExceptionClass_Check(cause)) { - fixed_cause = PyObject_CallObject(cause, NULL); - if (fixed_cause == NULL) - goto bad; - } else if (PyExceptionInstance_Check(cause)) { - fixed_cause = cause; - Py_INCREF(fixed_cause); - } else { - PyErr_SetString(PyExc_TypeError, - "exception causes must derive from " - "BaseException"); - goto bad; - } - PyException_SetCause(value, fixed_cause); - } - PyErr_SetObject(type, value); - if (tb) { - #if PY_VERSION_HEX >= 0x030C00A6 - PyException_SetTraceback(value, tb); - #elif CYTHON_FAST_THREAD_STATE - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject* tmp_tb = tstate->curexc_traceback; - if (tb != tmp_tb) { - Py_INCREF(tb); - tstate->curexc_traceback = tb; - Py_XDECREF(tmp_tb); - } -#else - PyObject *tmp_type, *tmp_value, *tmp_tb; - PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); - Py_INCREF(tb); - PyErr_Restore(tmp_type, tmp_value, tb); - Py_XDECREF(tmp_tb); -#endif - } -bad: - Py_XDECREF(owned_instance); - return; -} -#endif - -/* SetItemInt */ -static int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) { - int r; - if (unlikely(!j)) return -1; - r = PyObject_SetItem(o, j, v); - Py_DECREF(j); - return r; -} -static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v, int is_list, - CYTHON_NCP_UNUSED int wraparound, CYTHON_NCP_UNUSED int boundscheck) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS - if (is_list || PyList_CheckExact(o)) { - Py_ssize_t n = (!wraparound) ? i : ((likely(i >= 0)) ? i : i + PyList_GET_SIZE(o)); - if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o)))) { - PyObject* old = PyList_GET_ITEM(o, n); - Py_INCREF(v); - PyList_SET_ITEM(o, n, v); - Py_DECREF(old); - return 1; - } - } else { - PyMappingMethods *mm = Py_TYPE(o)->tp_as_mapping; - PySequenceMethods *sm = Py_TYPE(o)->tp_as_sequence; - if (mm && mm->mp_ass_subscript) { - int r; - PyObject *key = PyInt_FromSsize_t(i); - if (unlikely(!key)) return -1; - r = mm->mp_ass_subscript(o, key, v); - Py_DECREF(key); - return r; - } - if (likely(sm && sm->sq_ass_item)) { - if (wraparound && unlikely(i < 0) && likely(sm->sq_length)) { - Py_ssize_t l = sm->sq_length(o); - if (likely(l >= 0)) { - i += l; - } else { - if (!PyErr_ExceptionMatches(PyExc_OverflowError)) - return -1; - PyErr_Clear(); - } - } - return sm->sq_ass_item(o, i, v); - } - } -#else - if (is_list || !PyMapping_Check(o)) - { - return PySequence_SetItem(o, i, v); - } -#endif - return __Pyx_SetItemInt_Generic(o, PyInt_FromSsize_t(i), v); -} - -/* ModInt[long] */ -static CYTHON_INLINE long __Pyx_mod_long(long a, long b) { - long r = a % b; - r += ((r != 0) & ((r ^ b) < 0)) * b; - return r; -} - -/* FixUpExtensionType */ -#if CYTHON_USE_TYPE_SPECS -static int __Pyx_fix_up_extension_type_from_spec(PyType_Spec *spec, PyTypeObject *type) { -#if PY_VERSION_HEX > 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API - CYTHON_UNUSED_VAR(spec); - CYTHON_UNUSED_VAR(type); -#else - const PyType_Slot *slot = spec->slots; - while (slot && slot->slot && slot->slot != Py_tp_members) - slot++; - if (slot && slot->slot == Py_tp_members) { - int changed = 0; -#if !(PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON) - const -#endif - PyMemberDef *memb = (PyMemberDef*) slot->pfunc; - while (memb && memb->name) { - if (memb->name[0] == '_' && memb->name[1] == '_') { -#if PY_VERSION_HEX < 0x030900b1 - if (strcmp(memb->name, "__weaklistoffset__") == 0) { - assert(memb->type == T_PYSSIZET); - assert(memb->flags == READONLY); - type->tp_weaklistoffset = memb->offset; - changed = 1; - } - else if (strcmp(memb->name, "__dictoffset__") == 0) { - assert(memb->type == T_PYSSIZET); - assert(memb->flags == READONLY); - type->tp_dictoffset = memb->offset; - changed = 1; - } -#if CYTHON_METH_FASTCALL - else if (strcmp(memb->name, "__vectorcalloffset__") == 0) { - assert(memb->type == T_PYSSIZET); - assert(memb->flags == READONLY); -#if PY_VERSION_HEX >= 0x030800b4 - type->tp_vectorcall_offset = memb->offset; -#else - type->tp_print = (printfunc) memb->offset; -#endif - changed = 1; - } -#endif -#else - if ((0)); -#endif -#if PY_VERSION_HEX <= 0x030900b1 && CYTHON_COMPILING_IN_CPYTHON - else if (strcmp(memb->name, "__module__") == 0) { - PyObject *descr; - assert(memb->type == T_OBJECT); - assert(memb->flags == 0 || memb->flags == READONLY); - descr = PyDescr_NewMember(type, memb); - if (unlikely(!descr)) - return -1; - if (unlikely(PyDict_SetItem(type->tp_dict, PyDescr_NAME(descr), descr) < 0)) { - Py_DECREF(descr); - return -1; - } - Py_DECREF(descr); - changed = 1; - } -#endif - } - memb++; - } - if (changed) - PyType_Modified(type); - } -#endif - return 0; -} -#endif - -/* PyObjectCallNoArg */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { - PyObject *arg[2] = {NULL, NULL}; - return __Pyx_PyObject_FastCall(func, arg + 1, 0 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); -} - -/* PyObjectCallOneArg */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { - PyObject *args[2] = {NULL, arg}; - return __Pyx_PyObject_FastCall(func, args+1, 1 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); -} - -/* PyObjectGetMethod */ -static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { - PyObject *attr; -#if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP - __Pyx_TypeName type_name; - PyTypeObject *tp = Py_TYPE(obj); - PyObject *descr; - descrgetfunc f = NULL; - PyObject **dictptr, *dict; - int meth_found = 0; - assert (*method == NULL); - if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { - attr = __Pyx_PyObject_GetAttrStr(obj, name); - goto try_unpack; - } - if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { - return 0; - } - descr = _PyType_Lookup(tp, name); - if (likely(descr != NULL)) { - Py_INCREF(descr); -#if defined(Py_TPFLAGS_METHOD_DESCRIPTOR) && Py_TPFLAGS_METHOD_DESCRIPTOR - if (__Pyx_PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_METHOD_DESCRIPTOR)) -#elif PY_MAJOR_VERSION >= 3 - #ifdef __Pyx_CyFunction_USED - if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) - #else - if (likely(PyFunction_Check(descr) || __Pyx_IS_TYPE(descr, &PyMethodDescr_Type))) - #endif -#else - #ifdef __Pyx_CyFunction_USED - if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) - #else - if (likely(PyFunction_Check(descr))) - #endif -#endif - { - meth_found = 1; - } else { - f = Py_TYPE(descr)->tp_descr_get; - if (f != NULL && PyDescr_IsData(descr)) { - attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); - Py_DECREF(descr); - goto try_unpack; - } - } - } - dictptr = _PyObject_GetDictPtr(obj); - if (dictptr != NULL && (dict = *dictptr) != NULL) { - Py_INCREF(dict); - attr = __Pyx_PyDict_GetItemStr(dict, name); - if (attr != NULL) { - Py_INCREF(attr); - Py_DECREF(dict); - Py_XDECREF(descr); - goto try_unpack; - } - Py_DECREF(dict); - } - if (meth_found) { - *method = descr; - return 1; - } - if (f != NULL) { - attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); - Py_DECREF(descr); - goto try_unpack; - } - if (likely(descr != NULL)) { - *method = descr; - return 0; - } - type_name = __Pyx_PyType_GetName(tp); - PyErr_Format(PyExc_AttributeError, -#if PY_MAJOR_VERSION >= 3 - "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", - type_name, name); -#else - "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", - type_name, PyString_AS_STRING(name)); -#endif - __Pyx_DECREF_TypeName(type_name); - return 0; -#else - attr = __Pyx_PyObject_GetAttrStr(obj, name); - goto try_unpack; -#endif -try_unpack: -#if CYTHON_UNPACK_METHODS - if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { - PyObject *function = PyMethod_GET_FUNCTION(attr); - Py_INCREF(function); - Py_DECREF(attr); - *method = function; - return 1; - } -#endif - *method = attr; - return 0; -} - -/* PyObjectCallMethod0 */ -static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) { - PyObject *method = NULL, *result = NULL; - int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); - if (likely(is_method)) { - result = __Pyx_PyObject_CallOneArg(method, obj); - Py_DECREF(method); - return result; - } - if (unlikely(!method)) goto bad; - result = __Pyx_PyObject_CallNoArg(method); - Py_DECREF(method); -bad: - return result; -} - -/* ValidateBasesTuple */ -#if CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API || CYTHON_USE_TYPE_SPECS -static int __Pyx_validate_bases_tuple(const char *type_name, Py_ssize_t dictoffset, PyObject *bases) { - Py_ssize_t i, n; -#if CYTHON_ASSUME_SAFE_MACROS - n = PyTuple_GET_SIZE(bases); -#else - n = PyTuple_Size(bases); - if (n < 0) return -1; -#endif - for (i = 1; i < n; i++) - { -#if CYTHON_AVOID_BORROWED_REFS - PyObject *b0 = PySequence_GetItem(bases, i); - if (!b0) return -1; -#elif CYTHON_ASSUME_SAFE_MACROS - PyObject *b0 = PyTuple_GET_ITEM(bases, i); -#else - PyObject *b0 = PyTuple_GetItem(bases, i); - if (!b0) return -1; -#endif - PyTypeObject *b; -#if PY_MAJOR_VERSION < 3 - if (PyClass_Check(b0)) - { - PyErr_Format(PyExc_TypeError, "base class '%.200s' is an old-style class", - PyString_AS_STRING(((PyClassObject*)b0)->cl_name)); -#if CYTHON_AVOID_BORROWED_REFS - Py_DECREF(b0); -#endif - return -1; - } -#endif - b = (PyTypeObject*) b0; - if (!__Pyx_PyType_HasFeature(b, Py_TPFLAGS_HEAPTYPE)) - { - __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); - PyErr_Format(PyExc_TypeError, - "base class '" __Pyx_FMT_TYPENAME "' is not a heap type", b_name); - __Pyx_DECREF_TypeName(b_name); -#if CYTHON_AVOID_BORROWED_REFS - Py_DECREF(b0); -#endif - return -1; - } - if (dictoffset == 0) - { - Py_ssize_t b_dictoffset = 0; -#if CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY - b_dictoffset = b->tp_dictoffset; -#else - PyObject *py_b_dictoffset = PyObject_GetAttrString((PyObject*)b, "__dictoffset__"); - if (!py_b_dictoffset) goto dictoffset_return; - b_dictoffset = PyLong_AsSsize_t(py_b_dictoffset); - Py_DECREF(py_b_dictoffset); - if (b_dictoffset == -1 && PyErr_Occurred()) goto dictoffset_return; -#endif - if (b_dictoffset) { - { - __Pyx_TypeName b_name = __Pyx_PyType_GetName(b); - PyErr_Format(PyExc_TypeError, - "extension type '%.200s' has no __dict__ slot, " - "but base type '" __Pyx_FMT_TYPENAME "' has: " - "either add 'cdef dict __dict__' to the extension type " - "or add '__slots__ = [...]' to the base type", - type_name, b_name); - __Pyx_DECREF_TypeName(b_name); - } -#if !(CYTHON_USE_TYPE_SLOTS || CYTHON_COMPILING_IN_PYPY) - dictoffset_return: -#endif -#if CYTHON_AVOID_BORROWED_REFS - Py_DECREF(b0); -#endif - return -1; - } - } -#if CYTHON_AVOID_BORROWED_REFS - Py_DECREF(b0); -#endif - } - return 0; -} -#endif - -/* PyType_Ready */ -static int __Pyx_PyType_Ready(PyTypeObject *t) { -#if CYTHON_USE_TYPE_SPECS || !(CYTHON_COMPILING_IN_CPYTHON || CYTHON_COMPILING_IN_LIMITED_API) || defined(PYSTON_MAJOR_VERSION) - (void)__Pyx_PyObject_CallMethod0; -#if CYTHON_USE_TYPE_SPECS - (void)__Pyx_validate_bases_tuple; -#endif - return PyType_Ready(t); -#else - int r; - PyObject *bases = __Pyx_PyType_GetSlot(t, tp_bases, PyObject*); - if (bases && unlikely(__Pyx_validate_bases_tuple(t->tp_name, t->tp_dictoffset, bases) == -1)) - return -1; -#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) - { - int gc_was_enabled; - #if PY_VERSION_HEX >= 0x030A00b1 - gc_was_enabled = PyGC_Disable(); - (void)__Pyx_PyObject_CallMethod0; - #else - PyObject *ret, *py_status; - PyObject *gc = NULL; - #if PY_VERSION_HEX >= 0x030700a1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM+0 >= 0x07030400) - gc = PyImport_GetModule(__pyx_kp_u_gc); - #endif - if (unlikely(!gc)) gc = PyImport_Import(__pyx_kp_u_gc); - if (unlikely(!gc)) return -1; - py_status = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_isenabled); - if (unlikely(!py_status)) { - Py_DECREF(gc); - return -1; - } - gc_was_enabled = __Pyx_PyObject_IsTrue(py_status); - Py_DECREF(py_status); - if (gc_was_enabled > 0) { - ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_disable); - if (unlikely(!ret)) { - Py_DECREF(gc); - return -1; - } - Py_DECREF(ret); - } else if (unlikely(gc_was_enabled == -1)) { - Py_DECREF(gc); - return -1; - } - #endif - t->tp_flags |= Py_TPFLAGS_HEAPTYPE; -#if PY_VERSION_HEX >= 0x030A0000 - t->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE; -#endif -#else - (void)__Pyx_PyObject_CallMethod0; -#endif - r = PyType_Ready(t); -#if PY_VERSION_HEX >= 0x03050000 && !defined(PYSTON_MAJOR_VERSION) - t->tp_flags &= ~Py_TPFLAGS_HEAPTYPE; - #if PY_VERSION_HEX >= 0x030A00b1 - if (gc_was_enabled) - PyGC_Enable(); - #else - if (gc_was_enabled) { - PyObject *tp, *v, *tb; - PyErr_Fetch(&tp, &v, &tb); - ret = __Pyx_PyObject_CallMethod0(gc, __pyx_kp_u_enable); - if (likely(ret || r == -1)) { - Py_XDECREF(ret); - PyErr_Restore(tp, v, tb); - } else { - Py_XDECREF(tp); - Py_XDECREF(v); - Py_XDECREF(tb); - r = -1; - } - } - Py_DECREF(gc); - #endif - } -#endif - return r; -#endif -} - -/* PyObject_GenericGetAttrNoDict */ -#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 -static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { - __Pyx_TypeName type_name = __Pyx_PyType_GetName(tp); - PyErr_Format(PyExc_AttributeError, -#if PY_MAJOR_VERSION >= 3 - "'" __Pyx_FMT_TYPENAME "' object has no attribute '%U'", - type_name, attr_name); -#else - "'" __Pyx_FMT_TYPENAME "' object has no attribute '%.400s'", - type_name, PyString_AS_STRING(attr_name)); -#endif - __Pyx_DECREF_TypeName(type_name); - return NULL; -} -static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { - PyObject *descr; - PyTypeObject *tp = Py_TYPE(obj); - if (unlikely(!PyString_Check(attr_name))) { - return PyObject_GenericGetAttr(obj, attr_name); - } - assert(!tp->tp_dictoffset); - descr = _PyType_Lookup(tp, attr_name); - if (unlikely(!descr)) { - return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); - } - Py_INCREF(descr); - #if PY_MAJOR_VERSION < 3 - if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) - #endif - { - descrgetfunc f = Py_TYPE(descr)->tp_descr_get; - if (unlikely(f)) { - PyObject *res = f(descr, obj, (PyObject *)tp); - Py_DECREF(descr); - return res; - } - } - return descr; -} -#endif - -/* FastTypeChecks */ -#if CYTHON_COMPILING_IN_CPYTHON -static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { - while (a) { - a = __Pyx_PyType_GetSlot(a, tp_base, PyTypeObject*); - if (a == b) - return 1; - } - return b == &PyBaseObject_Type; -} -static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { - PyObject *mro; - if (a == b) return 1; - mro = a->tp_mro; - if (likely(mro)) { - Py_ssize_t i, n; - n = PyTuple_GET_SIZE(mro); - for (i = 0; i < n; i++) { - if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) - return 1; - } - return 0; - } - return __Pyx_InBases(a, b); -} -static CYTHON_INLINE int __Pyx_IsAnySubtype2(PyTypeObject *cls, PyTypeObject *a, PyTypeObject *b) { - PyObject *mro; - if (cls == a || cls == b) return 1; - mro = cls->tp_mro; - if (likely(mro)) { - Py_ssize_t i, n; - n = PyTuple_GET_SIZE(mro); - for (i = 0; i < n; i++) { - PyObject *base = PyTuple_GET_ITEM(mro, i); - if (base == (PyObject *)a || base == (PyObject *)b) - return 1; - } - return 0; - } - return __Pyx_InBases(cls, a) || __Pyx_InBases(cls, b); -} -#if PY_MAJOR_VERSION == 2 -static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { - PyObject *exception, *value, *tb; - int res; - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - __Pyx_ErrFetch(&exception, &value, &tb); - res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; - if (unlikely(res == -1)) { - PyErr_WriteUnraisable(err); - res = 0; - } - if (!res) { - res = PyObject_IsSubclass(err, exc_type2); - if (unlikely(res == -1)) { - PyErr_WriteUnraisable(err); - res = 0; - } - } - __Pyx_ErrRestore(exception, value, tb); - return res; -} -#else -static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { - if (exc_type1) { - return __Pyx_IsAnySubtype2((PyTypeObject*)err, (PyTypeObject*)exc_type1, (PyTypeObject*)exc_type2); - } else { - return __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); - } -} -#endif -static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { - Py_ssize_t i, n; - assert(PyExceptionClass_Check(exc_type)); - n = PyTuple_GET_SIZE(tuple); -#if PY_MAJOR_VERSION >= 3 - for (i=0; i= 3 - if (level == -1) { - if (strchr(__Pyx_MODULE_NAME, '.') != NULL) { - module = PyImport_ImportModuleLevelObject( - name, __pyx_d, empty_dict, from_list, 1); - if (unlikely(!module)) { - if (unlikely(!PyErr_ExceptionMatches(PyExc_ImportError))) - goto bad; - PyErr_Clear(); - } - } - level = 0; - } - #endif - if (!module) { - #if PY_MAJOR_VERSION < 3 - PyObject *py_level = PyInt_FromLong(level); - if (unlikely(!py_level)) - goto bad; - module = PyObject_CallFunctionObjArgs(py_import, - name, __pyx_d, empty_dict, from_list, py_level, (PyObject *)NULL); - Py_DECREF(py_level); - #else - module = PyImport_ImportModuleLevelObject( - name, __pyx_d, empty_dict, from_list, level); - #endif - } - } -bad: - Py_XDECREF(empty_dict); - Py_XDECREF(empty_list); - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(py_import); - #endif - return module; -} - -/* ImportFrom */ -static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { - PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); - if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { - const char* module_name_str = 0; - PyObject* module_name = 0; - PyObject* module_dot = 0; - PyObject* full_name = 0; - PyErr_Clear(); - module_name_str = PyModule_GetName(module); - if (unlikely(!module_name_str)) { goto modbad; } - module_name = PyUnicode_FromString(module_name_str); - if (unlikely(!module_name)) { goto modbad; } - module_dot = PyUnicode_Concat(module_name, __pyx_kp_u__2); - if (unlikely(!module_dot)) { goto modbad; } - full_name = PyUnicode_Concat(module_dot, name); - if (unlikely(!full_name)) { goto modbad; } - #if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) - { - PyObject *modules = PyImport_GetModuleDict(); - if (unlikely(!modules)) - goto modbad; - value = PyObject_GetItem(modules, full_name); - } - #else - value = PyImport_GetModule(full_name); - #endif - modbad: - Py_XDECREF(full_name); - Py_XDECREF(module_dot); - Py_XDECREF(module_name); - } - if (unlikely(!value)) { - PyErr_Format(PyExc_ImportError, - #if PY_MAJOR_VERSION < 3 - "cannot import name %.230s", PyString_AS_STRING(name)); - #else - "cannot import name %S", name); - #endif - } - return value; -} - -/* ImportDottedModule */ -#if PY_MAJOR_VERSION >= 3 -static PyObject *__Pyx__ImportDottedModule_Error(PyObject *name, PyObject *parts_tuple, Py_ssize_t count) { - PyObject *partial_name = NULL, *slice = NULL, *sep = NULL; - if (unlikely(PyErr_Occurred())) { - PyErr_Clear(); - } - if (likely(PyTuple_GET_SIZE(parts_tuple) == count)) { - partial_name = name; - } else { - slice = PySequence_GetSlice(parts_tuple, 0, count); - if (unlikely(!slice)) - goto bad; - sep = PyUnicode_FromStringAndSize(".", 1); - if (unlikely(!sep)) - goto bad; - partial_name = PyUnicode_Join(sep, slice); - } - PyErr_Format( -#if PY_MAJOR_VERSION < 3 - PyExc_ImportError, - "No module named '%s'", PyString_AS_STRING(partial_name)); -#else -#if PY_VERSION_HEX >= 0x030600B1 - PyExc_ModuleNotFoundError, -#else - PyExc_ImportError, -#endif - "No module named '%U'", partial_name); -#endif -bad: - Py_XDECREF(sep); - Py_XDECREF(slice); - Py_XDECREF(partial_name); - return NULL; -} -#endif -#if PY_MAJOR_VERSION >= 3 -static PyObject *__Pyx__ImportDottedModule_Lookup(PyObject *name) { - PyObject *imported_module; -#if PY_VERSION_HEX < 0x030700A1 || (CYTHON_COMPILING_IN_PYPY && PYPY_VERSION_NUM < 0x07030400) - PyObject *modules = PyImport_GetModuleDict(); - if (unlikely(!modules)) - return NULL; - imported_module = __Pyx_PyDict_GetItemStr(modules, name); - Py_XINCREF(imported_module); -#else - imported_module = PyImport_GetModule(name); -#endif - return imported_module; -} -#endif -#if PY_MAJOR_VERSION >= 3 -static PyObject *__Pyx_ImportDottedModule_WalkParts(PyObject *module, PyObject *name, PyObject *parts_tuple) { - Py_ssize_t i, nparts; - nparts = PyTuple_GET_SIZE(parts_tuple); - for (i=1; i < nparts && module; i++) { - PyObject *part, *submodule; -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - part = PyTuple_GET_ITEM(parts_tuple, i); -#else - part = PySequence_ITEM(parts_tuple, i); -#endif - submodule = __Pyx_PyObject_GetAttrStrNoError(module, part); -#if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) - Py_DECREF(part); -#endif - Py_DECREF(module); - module = submodule; - } - if (unlikely(!module)) { - return __Pyx__ImportDottedModule_Error(name, parts_tuple, i); - } - return module; -} -#endif -static PyObject *__Pyx__ImportDottedModule(PyObject *name, PyObject *parts_tuple) { -#if PY_MAJOR_VERSION < 3 - PyObject *module, *from_list, *star = __pyx_n_s__3; - CYTHON_UNUSED_VAR(parts_tuple); - from_list = PyList_New(1); - if (unlikely(!from_list)) - return NULL; - Py_INCREF(star); - PyList_SET_ITEM(from_list, 0, star); - module = __Pyx_Import(name, from_list, 0); - Py_DECREF(from_list); - return module; -#else - PyObject *imported_module; - PyObject *module = __Pyx_Import(name, NULL, 0); - if (!parts_tuple || unlikely(!module)) - return module; - imported_module = __Pyx__ImportDottedModule_Lookup(name); - if (likely(imported_module)) { - Py_DECREF(module); - return imported_module; - } - PyErr_Clear(); - return __Pyx_ImportDottedModule_WalkParts(module, name, parts_tuple); -#endif -} -static PyObject *__Pyx_ImportDottedModule(PyObject *name, PyObject *parts_tuple) { -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030400B1 - PyObject *module = __Pyx__ImportDottedModule_Lookup(name); - if (likely(module)) { - PyObject *spec = __Pyx_PyObject_GetAttrStrNoError(module, __pyx_n_s_spec); - if (likely(spec)) { - PyObject *unsafe = __Pyx_PyObject_GetAttrStrNoError(spec, __pyx_n_s_initializing); - if (likely(!unsafe || !__Pyx_PyObject_IsTrue(unsafe))) { - Py_DECREF(spec); - spec = NULL; - } - Py_XDECREF(unsafe); - } - if (likely(!spec)) { - PyErr_Clear(); - return module; - } - Py_DECREF(spec); - Py_DECREF(module); - } else if (PyErr_Occurred()) { - PyErr_Clear(); - } -#endif - return __Pyx__ImportDottedModule(name, parts_tuple); -} - -/* pybytes_as_double */ -static double __Pyx_SlowPyString_AsDouble(PyObject *obj) { - PyObject *float_value; -#if PY_MAJOR_VERSION >= 3 - float_value = PyFloat_FromString(obj); -#else - float_value = PyFloat_FromString(obj, 0); -#endif - if (likely(float_value)) { -#if CYTHON_ASSUME_SAFE_MACROS - double value = PyFloat_AS_DOUBLE(float_value); -#else - double value = PyFloat_AsDouble(float_value); -#endif - Py_DECREF(float_value); - return value; - } - return (double)-1; -} -static const char* __Pyx__PyBytes_AsDouble_Copy(const char* start, char* buffer, Py_ssize_t length) { - int last_was_punctuation = 1; - Py_ssize_t i; - for (i=0; i < length; i++) { - char chr = start[i]; - int is_punctuation = (chr == '_') | (chr == '.') | (chr == 'e') | (chr == 'E'); - *buffer = chr; - buffer += (chr != '_'); - if (unlikely(last_was_punctuation & is_punctuation)) goto parse_failure; - last_was_punctuation = is_punctuation; - } - if (unlikely(last_was_punctuation)) goto parse_failure; - *buffer = '\0'; - return buffer; -parse_failure: - return NULL; -} -static double __Pyx__PyBytes_AsDouble_inf_nan(const char* start, Py_ssize_t length) { - int matches = 1; - char sign = start[0]; - int is_signed = (sign == '+') | (sign == '-'); - start += is_signed; - length -= is_signed; - switch (start[0]) { - #ifdef Py_NAN - case 'n': - case 'N': - if (unlikely(length != 3)) goto parse_failure; - matches &= (start[1] == 'a' || start[1] == 'A'); - matches &= (start[2] == 'n' || start[2] == 'N'); - if (unlikely(!matches)) goto parse_failure; - return (sign == '-') ? -Py_NAN : Py_NAN; - #endif - case 'i': - case 'I': - if (unlikely(length < 3)) goto parse_failure; - matches &= (start[1] == 'n' || start[1] == 'N'); - matches &= (start[2] == 'f' || start[2] == 'F'); - if (likely(length == 3 && matches)) - return (sign == '-') ? -Py_HUGE_VAL : Py_HUGE_VAL; - if (unlikely(length != 8)) goto parse_failure; - matches &= (start[3] == 'i' || start[3] == 'I'); - matches &= (start[4] == 'n' || start[4] == 'N'); - matches &= (start[5] == 'i' || start[5] == 'I'); - matches &= (start[6] == 't' || start[6] == 'T'); - matches &= (start[7] == 'y' || start[7] == 'Y'); - if (unlikely(!matches)) goto parse_failure; - return (sign == '-') ? -Py_HUGE_VAL : Py_HUGE_VAL; - case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': - break; - default: - goto parse_failure; - } - return 0.0; -parse_failure: - return -1.0; -} -static CYTHON_INLINE int __Pyx__PyBytes_AsDouble_IsSpace(char ch) { - return (ch == 0x20) | !((ch < 0x9) | (ch > 0xd)); -} -CYTHON_UNUSED static double __Pyx__PyBytes_AsDouble(PyObject *obj, const char* start, Py_ssize_t length) { - double value; - Py_ssize_t i, digits; - const char *last = start + length; - char *end; - while (__Pyx__PyBytes_AsDouble_IsSpace(*start)) - start++; - while (start < last - 1 && __Pyx__PyBytes_AsDouble_IsSpace(last[-1])) - last--; - length = last - start; - if (unlikely(length <= 0)) goto fallback; - value = __Pyx__PyBytes_AsDouble_inf_nan(start, length); - if (unlikely(value == -1.0)) goto fallback; - if (value != 0.0) return value; - digits = 0; - for (i=0; i < length; digits += start[i++] != '_'); - if (likely(digits == length)) { - value = PyOS_string_to_double(start, &end, NULL); - } else if (digits < 40) { - char number[40]; - last = __Pyx__PyBytes_AsDouble_Copy(start, number, length); - if (unlikely(!last)) goto fallback; - value = PyOS_string_to_double(number, &end, NULL); - } else { - char *number = (char*) PyMem_Malloc((digits + 1) * sizeof(char)); - if (unlikely(!number)) goto fallback; - last = __Pyx__PyBytes_AsDouble_Copy(start, number, length); - if (unlikely(!last)) { - PyMem_Free(number); - goto fallback; - } - value = PyOS_string_to_double(number, &end, NULL); - PyMem_Free(number); - } - if (likely(end == last) || (value == (double)-1 && PyErr_Occurred())) { - return value; - } -fallback: - return __Pyx_SlowPyString_AsDouble(obj); -} - -/* FetchSharedCythonModule */ -static PyObject *__Pyx_FetchSharedCythonABIModule(void) { - return __Pyx_PyImport_AddModuleRef((char*) __PYX_ABI_MODULE_NAME); -} - -/* FetchCommonType */ -static int __Pyx_VerifyCachedType(PyObject *cached_type, - const char *name, - Py_ssize_t basicsize, - Py_ssize_t expected_basicsize) { - if (!PyType_Check(cached_type)) { - PyErr_Format(PyExc_TypeError, - "Shared Cython type %.200s is not a type object", name); - return -1; - } - if (basicsize != expected_basicsize) { - PyErr_Format(PyExc_TypeError, - "Shared Cython type %.200s has the wrong size, try recompiling", - name); - return -1; - } - return 0; -} -#if !CYTHON_USE_TYPE_SPECS -static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) { - PyObject* abi_module; - const char* object_name; - PyTypeObject *cached_type = NULL; - abi_module = __Pyx_FetchSharedCythonABIModule(); - if (!abi_module) return NULL; - object_name = strrchr(type->tp_name, '.'); - object_name = object_name ? object_name+1 : type->tp_name; - cached_type = (PyTypeObject*) PyObject_GetAttrString(abi_module, object_name); - if (cached_type) { - if (__Pyx_VerifyCachedType( - (PyObject *)cached_type, - object_name, - cached_type->tp_basicsize, - type->tp_basicsize) < 0) { - goto bad; - } - goto done; - } - if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; - PyErr_Clear(); - if (PyType_Ready(type) < 0) goto bad; - if (PyObject_SetAttrString(abi_module, object_name, (PyObject *)type) < 0) - goto bad; - Py_INCREF(type); - cached_type = type; -done: - Py_DECREF(abi_module); - return cached_type; -bad: - Py_XDECREF(cached_type); - cached_type = NULL; - goto done; -} -#else -static PyTypeObject *__Pyx_FetchCommonTypeFromSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) { - PyObject *abi_module, *cached_type = NULL; - const char* object_name = strrchr(spec->name, '.'); - object_name = object_name ? object_name+1 : spec->name; - abi_module = __Pyx_FetchSharedCythonABIModule(); - if (!abi_module) return NULL; - cached_type = PyObject_GetAttrString(abi_module, object_name); - if (cached_type) { - Py_ssize_t basicsize; -#if CYTHON_COMPILING_IN_LIMITED_API - PyObject *py_basicsize; - py_basicsize = PyObject_GetAttrString(cached_type, "__basicsize__"); - if (unlikely(!py_basicsize)) goto bad; - basicsize = PyLong_AsSsize_t(py_basicsize); - Py_DECREF(py_basicsize); - py_basicsize = 0; - if (unlikely(basicsize == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; -#else - basicsize = likely(PyType_Check(cached_type)) ? ((PyTypeObject*) cached_type)->tp_basicsize : -1; -#endif - if (__Pyx_VerifyCachedType( - cached_type, - object_name, - basicsize, - spec->basicsize) < 0) { - goto bad; - } - goto done; - } - if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; - PyErr_Clear(); - CYTHON_UNUSED_VAR(module); - cached_type = __Pyx_PyType_FromModuleAndSpec(abi_module, spec, bases); - if (unlikely(!cached_type)) goto bad; - if (unlikely(__Pyx_fix_up_extension_type_from_spec(spec, (PyTypeObject *) cached_type) < 0)) goto bad; - if (PyObject_SetAttrString(abi_module, object_name, cached_type) < 0) goto bad; -done: - Py_DECREF(abi_module); - assert(cached_type == NULL || PyType_Check(cached_type)); - return (PyTypeObject *) cached_type; -bad: - Py_XDECREF(cached_type); - cached_type = NULL; - goto done; -} -#endif - -/* PyVectorcallFastCallDict */ -#if CYTHON_METH_FASTCALL -static PyObject *__Pyx_PyVectorcall_FastCallDict_kw(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) -{ - PyObject *res = NULL; - PyObject *kwnames; - PyObject **newargs; - PyObject **kwvalues; - Py_ssize_t i, pos; - size_t j; - PyObject *key, *value; - unsigned long keys_are_strings; - Py_ssize_t nkw = PyDict_GET_SIZE(kw); - newargs = (PyObject **)PyMem_Malloc((nargs + (size_t)nkw) * sizeof(args[0])); - if (unlikely(newargs == NULL)) { - PyErr_NoMemory(); - return NULL; - } - for (j = 0; j < nargs; j++) newargs[j] = args[j]; - kwnames = PyTuple_New(nkw); - if (unlikely(kwnames == NULL)) { - PyMem_Free(newargs); - return NULL; - } - kwvalues = newargs + nargs; - pos = i = 0; - keys_are_strings = Py_TPFLAGS_UNICODE_SUBCLASS; - while (PyDict_Next(kw, &pos, &key, &value)) { - keys_are_strings &= Py_TYPE(key)->tp_flags; - Py_INCREF(key); - Py_INCREF(value); - PyTuple_SET_ITEM(kwnames, i, key); - kwvalues[i] = value; - i++; - } - if (unlikely(!keys_are_strings)) { - PyErr_SetString(PyExc_TypeError, "keywords must be strings"); - goto cleanup; - } - res = vc(func, newargs, nargs, kwnames); -cleanup: - Py_DECREF(kwnames); - for (i = 0; i < nkw; i++) - Py_DECREF(kwvalues[i]); - PyMem_Free(newargs); - return res; -} -static CYTHON_INLINE PyObject *__Pyx_PyVectorcall_FastCallDict(PyObject *func, __pyx_vectorcallfunc vc, PyObject *const *args, size_t nargs, PyObject *kw) -{ - if (likely(kw == NULL) || PyDict_GET_SIZE(kw) == 0) { - return vc(func, args, nargs, NULL); - } - return __Pyx_PyVectorcall_FastCallDict_kw(func, vc, args, nargs, kw); -} -#endif - -/* CythonFunctionShared */ -#if CYTHON_COMPILING_IN_LIMITED_API -static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { - if (__Pyx_CyFunction_Check(func)) { - return PyCFunction_GetFunction(((__pyx_CyFunctionObject*)func)->func) == (PyCFunction) cfunc; - } else if (PyCFunction_Check(func)) { - return PyCFunction_GetFunction(func) == (PyCFunction) cfunc; - } - return 0; -} -#else -static CYTHON_INLINE int __Pyx__IsSameCyOrCFunction(PyObject *func, void *cfunc) { - return __Pyx_CyOrPyCFunction_Check(func) && __Pyx_CyOrPyCFunction_GET_FUNCTION(func) == (PyCFunction) cfunc; -} -#endif -static CYTHON_INLINE void __Pyx__CyFunction_SetClassObj(__pyx_CyFunctionObject* f, PyObject* classobj) { -#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API - __Pyx_Py_XDECREF_SET( - __Pyx_CyFunction_GetClassObj(f), - ((classobj) ? __Pyx_NewRef(classobj) : NULL)); -#else - __Pyx_Py_XDECREF_SET( - ((PyCMethodObject *) (f))->mm_class, - (PyTypeObject*)((classobj) ? __Pyx_NewRef(classobj) : NULL)); -#endif -} -static PyObject * -__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, void *closure) -{ - CYTHON_UNUSED_VAR(closure); - if (unlikely(op->func_doc == NULL)) { -#if CYTHON_COMPILING_IN_LIMITED_API - op->func_doc = PyObject_GetAttrString(op->func, "__doc__"); - if (unlikely(!op->func_doc)) return NULL; -#else - if (((PyCFunctionObject*)op)->m_ml->ml_doc) { -#if PY_MAJOR_VERSION >= 3 - op->func_doc = PyUnicode_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); -#else - op->func_doc = PyString_FromString(((PyCFunctionObject*)op)->m_ml->ml_doc); -#endif - if (unlikely(op->func_doc == NULL)) - return NULL; - } else { - Py_INCREF(Py_None); - return Py_None; - } -#endif - } - Py_INCREF(op->func_doc); - return op->func_doc; -} -static int -__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value, void *context) -{ - CYTHON_UNUSED_VAR(context); - if (value == NULL) { - value = Py_None; - } - Py_INCREF(value); - __Pyx_Py_XDECREF_SET(op->func_doc, value); - return 0; -} -static PyObject * -__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op, void *context) -{ - CYTHON_UNUSED_VAR(context); - if (unlikely(op->func_name == NULL)) { -#if CYTHON_COMPILING_IN_LIMITED_API - op->func_name = PyObject_GetAttrString(op->func, "__name__"); -#elif PY_MAJOR_VERSION >= 3 - op->func_name = PyUnicode_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); -#else - op->func_name = PyString_InternFromString(((PyCFunctionObject*)op)->m_ml->ml_name); -#endif - if (unlikely(op->func_name == NULL)) - return NULL; - } - Py_INCREF(op->func_name); - return op->func_name; -} -static int -__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value, void *context) -{ - CYTHON_UNUSED_VAR(context); -#if PY_MAJOR_VERSION >= 3 - if (unlikely(value == NULL || !PyUnicode_Check(value))) -#else - if (unlikely(value == NULL || !PyString_Check(value))) -#endif - { - PyErr_SetString(PyExc_TypeError, - "__name__ must be set to a string object"); - return -1; - } - Py_INCREF(value); - __Pyx_Py_XDECREF_SET(op->func_name, value); - return 0; -} -static PyObject * -__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op, void *context) -{ - CYTHON_UNUSED_VAR(context); - Py_INCREF(op->func_qualname); - return op->func_qualname; -} -static int -__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value, void *context) -{ - CYTHON_UNUSED_VAR(context); -#if PY_MAJOR_VERSION >= 3 - if (unlikely(value == NULL || !PyUnicode_Check(value))) -#else - if (unlikely(value == NULL || !PyString_Check(value))) -#endif - { - PyErr_SetString(PyExc_TypeError, - "__qualname__ must be set to a string object"); - return -1; - } - Py_INCREF(value); - __Pyx_Py_XDECREF_SET(op->func_qualname, value); - return 0; -} -static PyObject * -__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op, void *context) -{ - CYTHON_UNUSED_VAR(context); - if (unlikely(op->func_dict == NULL)) { - op->func_dict = PyDict_New(); - if (unlikely(op->func_dict == NULL)) - return NULL; - } - Py_INCREF(op->func_dict); - return op->func_dict; -} -static int -__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value, void *context) -{ - CYTHON_UNUSED_VAR(context); - if (unlikely(value == NULL)) { - PyErr_SetString(PyExc_TypeError, - "function's dictionary may not be deleted"); - return -1; - } - if (unlikely(!PyDict_Check(value))) { - PyErr_SetString(PyExc_TypeError, - "setting function's dictionary to a non-dict"); - return -1; - } - Py_INCREF(value); - __Pyx_Py_XDECREF_SET(op->func_dict, value); - return 0; -} -static PyObject * -__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op, void *context) -{ - CYTHON_UNUSED_VAR(context); - Py_INCREF(op->func_globals); - return op->func_globals; -} -static PyObject * -__Pyx_CyFunction_get_closure(__pyx_CyFunctionObject *op, void *context) -{ - CYTHON_UNUSED_VAR(op); - CYTHON_UNUSED_VAR(context); - Py_INCREF(Py_None); - return Py_None; -} -static PyObject * -__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op, void *context) -{ - PyObject* result = (op->func_code) ? op->func_code : Py_None; - CYTHON_UNUSED_VAR(context); - Py_INCREF(result); - return result; -} -static int -__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { - int result = 0; - PyObject *res = op->defaults_getter((PyObject *) op); - if (unlikely(!res)) - return -1; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - op->defaults_tuple = PyTuple_GET_ITEM(res, 0); - Py_INCREF(op->defaults_tuple); - op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); - Py_INCREF(op->defaults_kwdict); - #else - op->defaults_tuple = __Pyx_PySequence_ITEM(res, 0); - if (unlikely(!op->defaults_tuple)) result = -1; - else { - op->defaults_kwdict = __Pyx_PySequence_ITEM(res, 1); - if (unlikely(!op->defaults_kwdict)) result = -1; - } - #endif - Py_DECREF(res); - return result; -} -static int -__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { - CYTHON_UNUSED_VAR(context); - if (!value) { - value = Py_None; - } else if (unlikely(value != Py_None && !PyTuple_Check(value))) { - PyErr_SetString(PyExc_TypeError, - "__defaults__ must be set to a tuple object"); - return -1; - } - PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__defaults__ will not " - "currently affect the values used in function calls", 1); - Py_INCREF(value); - __Pyx_Py_XDECREF_SET(op->defaults_tuple, value); - return 0; -} -static PyObject * -__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op, void *context) { - PyObject* result = op->defaults_tuple; - CYTHON_UNUSED_VAR(context); - if (unlikely(!result)) { - if (op->defaults_getter) { - if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; - result = op->defaults_tuple; - } else { - result = Py_None; - } - } - Py_INCREF(result); - return result; -} -static int -__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value, void *context) { - CYTHON_UNUSED_VAR(context); - if (!value) { - value = Py_None; - } else if (unlikely(value != Py_None && !PyDict_Check(value))) { - PyErr_SetString(PyExc_TypeError, - "__kwdefaults__ must be set to a dict object"); - return -1; - } - PyErr_WarnEx(PyExc_RuntimeWarning, "changes to cyfunction.__kwdefaults__ will not " - "currently affect the values used in function calls", 1); - Py_INCREF(value); - __Pyx_Py_XDECREF_SET(op->defaults_kwdict, value); - return 0; -} -static PyObject * -__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) { - PyObject* result = op->defaults_kwdict; - CYTHON_UNUSED_VAR(context); - if (unlikely(!result)) { - if (op->defaults_getter) { - if (unlikely(__Pyx_CyFunction_init_defaults(op) < 0)) return NULL; - result = op->defaults_kwdict; - } else { - result = Py_None; - } - } - Py_INCREF(result); - return result; -} -static int -__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) { - CYTHON_UNUSED_VAR(context); - if (!value || value == Py_None) { - value = NULL; - } else if (unlikely(!PyDict_Check(value))) { - PyErr_SetString(PyExc_TypeError, - "__annotations__ must be set to a dict object"); - return -1; - } - Py_XINCREF(value); - __Pyx_Py_XDECREF_SET(op->func_annotations, value); - return 0; -} -static PyObject * -__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) { - PyObject* result = op->func_annotations; - CYTHON_UNUSED_VAR(context); - if (unlikely(!result)) { - result = PyDict_New(); - if (unlikely(!result)) return NULL; - op->func_annotations = result; - } - Py_INCREF(result); - return result; -} -static PyObject * -__Pyx_CyFunction_get_is_coroutine(__pyx_CyFunctionObject *op, void *context) { - int is_coroutine; - CYTHON_UNUSED_VAR(context); - if (op->func_is_coroutine) { - return __Pyx_NewRef(op->func_is_coroutine); - } - is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE; -#if PY_VERSION_HEX >= 0x03050000 - if (is_coroutine) { - PyObject *module, *fromlist, *marker = __pyx_n_s_is_coroutine; - fromlist = PyList_New(1); - if (unlikely(!fromlist)) return NULL; - Py_INCREF(marker); -#if CYTHON_ASSUME_SAFE_MACROS - PyList_SET_ITEM(fromlist, 0, marker); -#else - if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) { - Py_DECREF(marker); - Py_DECREF(fromlist); - return NULL; - } -#endif - module = PyImport_ImportModuleLevelObject(__pyx_n_s_asyncio_coroutines, NULL, NULL, fromlist, 0); - Py_DECREF(fromlist); - if (unlikely(!module)) goto ignore; - op->func_is_coroutine = __Pyx_PyObject_GetAttrStr(module, marker); - Py_DECREF(module); - if (likely(op->func_is_coroutine)) { - return __Pyx_NewRef(op->func_is_coroutine); - } -ignore: - PyErr_Clear(); - } -#endif - op->func_is_coroutine = __Pyx_PyBool_FromLong(is_coroutine); - return __Pyx_NewRef(op->func_is_coroutine); -} -#if CYTHON_COMPILING_IN_LIMITED_API -static PyObject * -__Pyx_CyFunction_get_module(__pyx_CyFunctionObject *op, void *context) { - CYTHON_UNUSED_VAR(context); - return PyObject_GetAttrString(op->func, "__module__"); -} -static int -__Pyx_CyFunction_set_module(__pyx_CyFunctionObject *op, PyObject* value, void *context) { - CYTHON_UNUSED_VAR(context); - return PyObject_SetAttrString(op->func, "__module__", value); -} -#endif -static PyGetSetDef __pyx_CyFunction_getsets[] = { - {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, - {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, - {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, - {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, - {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, - {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, - {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, - {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, - {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, - {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, - {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, - {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, - {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, - {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, - {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, - {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, - {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, - {(char *) "_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0}, -#if CYTHON_COMPILING_IN_LIMITED_API - {"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0}, -#endif - {0, 0, 0, 0, 0} -}; -static PyMemberDef __pyx_CyFunction_members[] = { -#if !CYTHON_COMPILING_IN_LIMITED_API - {(char *) "__module__", T_OBJECT, offsetof(PyCFunctionObject, m_module), 0, 0}, -#endif -#if CYTHON_USE_TYPE_SPECS - {(char *) "__dictoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_dict), READONLY, 0}, -#if CYTHON_METH_FASTCALL -#if CYTHON_BACKPORT_VECTORCALL - {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_vectorcall), READONLY, 0}, -#else -#if !CYTHON_COMPILING_IN_LIMITED_API - {(char *) "__vectorcalloffset__", T_PYSSIZET, offsetof(PyCFunctionObject, vectorcall), READONLY, 0}, -#endif -#endif -#endif -#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API - {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CyFunctionObject, func_weakreflist), READONLY, 0}, -#else - {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(PyCFunctionObject, m_weakreflist), READONLY, 0}, -#endif -#endif - {0, 0, 0, 0, 0} -}; -static PyObject * -__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, PyObject *args) -{ - CYTHON_UNUSED_VAR(args); -#if PY_MAJOR_VERSION >= 3 - Py_INCREF(m->func_qualname); - return m->func_qualname; -#else - return PyString_FromString(((PyCFunctionObject*)m)->m_ml->ml_name); -#endif -} -static PyMethodDef __pyx_CyFunction_methods[] = { - {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, - {0, 0, 0, 0} -}; -#if PY_VERSION_HEX < 0x030500A0 || CYTHON_COMPILING_IN_LIMITED_API -#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist) -#else -#define __Pyx_CyFunction_weakreflist(cyfunc) (((PyCFunctionObject*)cyfunc)->m_weakreflist) -#endif -static PyObject *__Pyx_CyFunction_Init(__pyx_CyFunctionObject *op, PyMethodDef *ml, int flags, PyObject* qualname, - PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { -#if !CYTHON_COMPILING_IN_LIMITED_API - PyCFunctionObject *cf = (PyCFunctionObject*) op; -#endif - if (unlikely(op == NULL)) - return NULL; -#if CYTHON_COMPILING_IN_LIMITED_API - op->func = PyCFunction_NewEx(ml, (PyObject*)op, module); - if (unlikely(!op->func)) return NULL; -#endif - op->flags = flags; - __Pyx_CyFunction_weakreflist(op) = NULL; -#if !CYTHON_COMPILING_IN_LIMITED_API - cf->m_ml = ml; - cf->m_self = (PyObject *) op; -#endif - Py_XINCREF(closure); - op->func_closure = closure; -#if !CYTHON_COMPILING_IN_LIMITED_API - Py_XINCREF(module); - cf->m_module = module; -#endif - op->func_dict = NULL; - op->func_name = NULL; - Py_INCREF(qualname); - op->func_qualname = qualname; - op->func_doc = NULL; -#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API - op->func_classobj = NULL; -#else - ((PyCMethodObject*)op)->mm_class = NULL; -#endif - op->func_globals = globals; - Py_INCREF(op->func_globals); - Py_XINCREF(code); - op->func_code = code; - op->defaults_pyobjects = 0; - op->defaults_size = 0; - op->defaults = NULL; - op->defaults_tuple = NULL; - op->defaults_kwdict = NULL; - op->defaults_getter = NULL; - op->func_annotations = NULL; - op->func_is_coroutine = NULL; -#if CYTHON_METH_FASTCALL - switch (ml->ml_flags & (METH_VARARGS | METH_FASTCALL | METH_NOARGS | METH_O | METH_KEYWORDS | METH_METHOD)) { - case METH_NOARGS: - __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_NOARGS; - break; - case METH_O: - __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_O; - break; - case METH_METHOD | METH_FASTCALL | METH_KEYWORDS: - __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD; - break; - case METH_FASTCALL | METH_KEYWORDS: - __Pyx_CyFunction_func_vectorcall(op) = __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS; - break; - case METH_VARARGS | METH_KEYWORDS: - __Pyx_CyFunction_func_vectorcall(op) = NULL; - break; - default: - PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); - Py_DECREF(op); - return NULL; - } -#endif - return (PyObject *) op; -} -static int -__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) -{ - Py_CLEAR(m->func_closure); -#if CYTHON_COMPILING_IN_LIMITED_API - Py_CLEAR(m->func); -#else - Py_CLEAR(((PyCFunctionObject*)m)->m_module); -#endif - Py_CLEAR(m->func_dict); - Py_CLEAR(m->func_name); - Py_CLEAR(m->func_qualname); - Py_CLEAR(m->func_doc); - Py_CLEAR(m->func_globals); - Py_CLEAR(m->func_code); -#if !CYTHON_COMPILING_IN_LIMITED_API -#if PY_VERSION_HEX < 0x030900B1 - Py_CLEAR(__Pyx_CyFunction_GetClassObj(m)); -#else - { - PyObject *cls = (PyObject*) ((PyCMethodObject *) (m))->mm_class; - ((PyCMethodObject *) (m))->mm_class = NULL; - Py_XDECREF(cls); - } -#endif -#endif - Py_CLEAR(m->defaults_tuple); - Py_CLEAR(m->defaults_kwdict); - Py_CLEAR(m->func_annotations); - Py_CLEAR(m->func_is_coroutine); - if (m->defaults) { - PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); - int i; - for (i = 0; i < m->defaults_pyobjects; i++) - Py_XDECREF(pydefaults[i]); - PyObject_Free(m->defaults); - m->defaults = NULL; - } - return 0; -} -static void __Pyx__CyFunction_dealloc(__pyx_CyFunctionObject *m) -{ - if (__Pyx_CyFunction_weakreflist(m) != NULL) - PyObject_ClearWeakRefs((PyObject *) m); - __Pyx_CyFunction_clear(m); - __Pyx_PyHeapTypeObject_GC_Del(m); -} -static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) -{ - PyObject_GC_UnTrack(m); - __Pyx__CyFunction_dealloc(m); -} -static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) -{ - Py_VISIT(m->func_closure); -#if CYTHON_COMPILING_IN_LIMITED_API - Py_VISIT(m->func); -#else - Py_VISIT(((PyCFunctionObject*)m)->m_module); -#endif - Py_VISIT(m->func_dict); - Py_VISIT(m->func_name); - Py_VISIT(m->func_qualname); - Py_VISIT(m->func_doc); - Py_VISIT(m->func_globals); - Py_VISIT(m->func_code); -#if !CYTHON_COMPILING_IN_LIMITED_API - Py_VISIT(__Pyx_CyFunction_GetClassObj(m)); -#endif - Py_VISIT(m->defaults_tuple); - Py_VISIT(m->defaults_kwdict); - Py_VISIT(m->func_is_coroutine); - if (m->defaults) { - PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); - int i; - for (i = 0; i < m->defaults_pyobjects; i++) - Py_VISIT(pydefaults[i]); - } - return 0; -} -static PyObject* -__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) -{ -#if PY_MAJOR_VERSION >= 3 - return PyUnicode_FromFormat("", - op->func_qualname, (void *)op); -#else - return PyString_FromFormat("", - PyString_AsString(op->func_qualname), (void *)op); -#endif -} -static PyObject * __Pyx_CyFunction_CallMethod(PyObject *func, PyObject *self, PyObject *arg, PyObject *kw) { -#if CYTHON_COMPILING_IN_LIMITED_API - PyObject *f = ((__pyx_CyFunctionObject*)func)->func; - PyObject *py_name = NULL; - PyCFunction meth; - int flags; - meth = PyCFunction_GetFunction(f); - if (unlikely(!meth)) return NULL; - flags = PyCFunction_GetFlags(f); - if (unlikely(flags < 0)) return NULL; -#else - PyCFunctionObject* f = (PyCFunctionObject*)func; - PyCFunction meth = f->m_ml->ml_meth; - int flags = f->m_ml->ml_flags; -#endif - Py_ssize_t size; - switch (flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) { - case METH_VARARGS: - if (likely(kw == NULL || PyDict_Size(kw) == 0)) - return (*meth)(self, arg); - break; - case METH_VARARGS | METH_KEYWORDS: - return (*(PyCFunctionWithKeywords)(void*)meth)(self, arg, kw); - case METH_NOARGS: - if (likely(kw == NULL || PyDict_Size(kw) == 0)) { -#if CYTHON_ASSUME_SAFE_MACROS - size = PyTuple_GET_SIZE(arg); -#else - size = PyTuple_Size(arg); - if (unlikely(size < 0)) return NULL; -#endif - if (likely(size == 0)) - return (*meth)(self, NULL); -#if CYTHON_COMPILING_IN_LIMITED_API - py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); - if (!py_name) return NULL; - PyErr_Format(PyExc_TypeError, - "%.200S() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", - py_name, size); - Py_DECREF(py_name); -#else - PyErr_Format(PyExc_TypeError, - "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", - f->m_ml->ml_name, size); -#endif - return NULL; - } - break; - case METH_O: - if (likely(kw == NULL || PyDict_Size(kw) == 0)) { -#if CYTHON_ASSUME_SAFE_MACROS - size = PyTuple_GET_SIZE(arg); -#else - size = PyTuple_Size(arg); - if (unlikely(size < 0)) return NULL; -#endif - if (likely(size == 1)) { - PyObject *result, *arg0; - #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - arg0 = PyTuple_GET_ITEM(arg, 0); - #else - arg0 = __Pyx_PySequence_ITEM(arg, 0); if (unlikely(!arg0)) return NULL; - #endif - result = (*meth)(self, arg0); - #if !(CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS) - Py_DECREF(arg0); - #endif - return result; - } -#if CYTHON_COMPILING_IN_LIMITED_API - py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); - if (!py_name) return NULL; - PyErr_Format(PyExc_TypeError, - "%.200S() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", - py_name, size); - Py_DECREF(py_name); -#else - PyErr_Format(PyExc_TypeError, - "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", - f->m_ml->ml_name, size); -#endif - return NULL; - } - break; - default: - PyErr_SetString(PyExc_SystemError, "Bad call flags for CyFunction"); - return NULL; - } -#if CYTHON_COMPILING_IN_LIMITED_API - py_name = __Pyx_CyFunction_get_name((__pyx_CyFunctionObject*)func, NULL); - if (!py_name) return NULL; - PyErr_Format(PyExc_TypeError, "%.200S() takes no keyword arguments", - py_name); - Py_DECREF(py_name); -#else - PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", - f->m_ml->ml_name); -#endif - return NULL; -} -static CYTHON_INLINE PyObject *__Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { - PyObject *self, *result; -#if CYTHON_COMPILING_IN_LIMITED_API - self = PyCFunction_GetSelf(((__pyx_CyFunctionObject*)func)->func); - if (unlikely(!self) && PyErr_Occurred()) return NULL; -#else - self = ((PyCFunctionObject*)func)->m_self; -#endif - result = __Pyx_CyFunction_CallMethod(func, self, arg, kw); - return result; -} -static PyObject *__Pyx_CyFunction_CallAsMethod(PyObject *func, PyObject *args, PyObject *kw) { - PyObject *result; - __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; -#if CYTHON_METH_FASTCALL - __pyx_vectorcallfunc vc = __Pyx_CyFunction_func_vectorcall(cyfunc); - if (vc) { -#if CYTHON_ASSUME_SAFE_MACROS - return __Pyx_PyVectorcall_FastCallDict(func, vc, &PyTuple_GET_ITEM(args, 0), (size_t)PyTuple_GET_SIZE(args), kw); -#else - (void) &__Pyx_PyVectorcall_FastCallDict; - return PyVectorcall_Call(func, args, kw); -#endif - } -#endif - if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { - Py_ssize_t argc; - PyObject *new_args; - PyObject *self; -#if CYTHON_ASSUME_SAFE_MACROS - argc = PyTuple_GET_SIZE(args); -#else - argc = PyTuple_Size(args); - if (unlikely(!argc) < 0) return NULL; -#endif - new_args = PyTuple_GetSlice(args, 1, argc); - if (unlikely(!new_args)) - return NULL; - self = PyTuple_GetItem(args, 0); - if (unlikely(!self)) { - Py_DECREF(new_args); -#if PY_MAJOR_VERSION > 2 - PyErr_Format(PyExc_TypeError, - "unbound method %.200S() needs an argument", - cyfunc->func_qualname); -#else - PyErr_SetString(PyExc_TypeError, - "unbound method needs an argument"); -#endif - return NULL; - } - result = __Pyx_CyFunction_CallMethod(func, self, new_args, kw); - Py_DECREF(new_args); - } else { - result = __Pyx_CyFunction_Call(func, args, kw); - } - return result; -} -#if CYTHON_METH_FASTCALL -static CYTHON_INLINE int __Pyx_CyFunction_Vectorcall_CheckArgs(__pyx_CyFunctionObject *cyfunc, Py_ssize_t nargs, PyObject *kwnames) -{ - int ret = 0; - if ((cyfunc->flags & __Pyx_CYFUNCTION_CCLASS) && !(cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD)) { - if (unlikely(nargs < 1)) { - PyErr_Format(PyExc_TypeError, "%.200s() needs an argument", - ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); - return -1; - } - ret = 1; - } - if (unlikely(kwnames) && unlikely(PyTuple_GET_SIZE(kwnames))) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes no keyword arguments", ((PyCFunctionObject*)cyfunc)->m_ml->ml_name); - return -1; - } - return ret; -} -static PyObject * __Pyx_CyFunction_Vectorcall_NOARGS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) -{ - __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; - PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; -#if CYTHON_BACKPORT_VECTORCALL - Py_ssize_t nargs = (Py_ssize_t)nargsf; -#else - Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); -#endif - PyObject *self; - switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { - case 1: - self = args[0]; - args += 1; - nargs -= 1; - break; - case 0: - self = ((PyCFunctionObject*)cyfunc)->m_self; - break; - default: - return NULL; - } - if (unlikely(nargs != 0)) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)", - def->ml_name, nargs); - return NULL; - } - return def->ml_meth(self, NULL); -} -static PyObject * __Pyx_CyFunction_Vectorcall_O(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) -{ - __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; - PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; -#if CYTHON_BACKPORT_VECTORCALL - Py_ssize_t nargs = (Py_ssize_t)nargsf; -#else - Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); -#endif - PyObject *self; - switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, kwnames)) { - case 1: - self = args[0]; - args += 1; - nargs -= 1; - break; - case 0: - self = ((PyCFunctionObject*)cyfunc)->m_self; - break; - default: - return NULL; - } - if (unlikely(nargs != 1)) { - PyErr_Format(PyExc_TypeError, - "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)", - def->ml_name, nargs); - return NULL; - } - return def->ml_meth(self, args[0]); -} -static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) -{ - __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; - PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; -#if CYTHON_BACKPORT_VECTORCALL - Py_ssize_t nargs = (Py_ssize_t)nargsf; -#else - Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); -#endif - PyObject *self; - switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { - case 1: - self = args[0]; - args += 1; - nargs -= 1; - break; - case 0: - self = ((PyCFunctionObject*)cyfunc)->m_self; - break; - default: - return NULL; - } - return ((__Pyx_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); -} -static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) -{ - __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *)func; - PyMethodDef* def = ((PyCFunctionObject*)cyfunc)->m_ml; - PyTypeObject *cls = (PyTypeObject *) __Pyx_CyFunction_GetClassObj(cyfunc); -#if CYTHON_BACKPORT_VECTORCALL - Py_ssize_t nargs = (Py_ssize_t)nargsf; -#else - Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); -#endif - PyObject *self; - switch (__Pyx_CyFunction_Vectorcall_CheckArgs(cyfunc, nargs, NULL)) { - case 1: - self = args[0]; - args += 1; - nargs -= 1; - break; - case 0: - self = ((PyCFunctionObject*)cyfunc)->m_self; - break; - default: - return NULL; - } - return ((__Pyx_PyCMethod)(void(*)(void))def->ml_meth)(self, cls, args, (size_t)nargs, kwnames); -} -#endif -#if CYTHON_USE_TYPE_SPECS -static PyType_Slot __pyx_CyFunctionType_slots[] = { - {Py_tp_dealloc, (void *)__Pyx_CyFunction_dealloc}, - {Py_tp_repr, (void *)__Pyx_CyFunction_repr}, - {Py_tp_call, (void *)__Pyx_CyFunction_CallAsMethod}, - {Py_tp_traverse, (void *)__Pyx_CyFunction_traverse}, - {Py_tp_clear, (void *)__Pyx_CyFunction_clear}, - {Py_tp_methods, (void *)__pyx_CyFunction_methods}, - {Py_tp_members, (void *)__pyx_CyFunction_members}, - {Py_tp_getset, (void *)__pyx_CyFunction_getsets}, - {Py_tp_descr_get, (void *)__Pyx_PyMethod_New}, - {0, 0}, -}; -static PyType_Spec __pyx_CyFunctionType_spec = { - __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", - sizeof(__pyx_CyFunctionObject), - 0, -#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR - Py_TPFLAGS_METHOD_DESCRIPTOR | -#endif -#if (defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL) - _Py_TPFLAGS_HAVE_VECTORCALL | -#endif - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, - __pyx_CyFunctionType_slots -}; -#else -static PyTypeObject __pyx_CyFunctionType_type = { - PyVarObject_HEAD_INIT(0, 0) - __PYX_TYPE_MODULE_PREFIX "cython_function_or_method", - sizeof(__pyx_CyFunctionObject), - 0, - (destructor) __Pyx_CyFunction_dealloc, -#if !CYTHON_METH_FASTCALL - 0, -#elif CYTHON_BACKPORT_VECTORCALL - (printfunc)offsetof(__pyx_CyFunctionObject, func_vectorcall), -#else - offsetof(PyCFunctionObject, vectorcall), -#endif - 0, - 0, -#if PY_MAJOR_VERSION < 3 - 0, -#else - 0, -#endif - (reprfunc) __Pyx_CyFunction_repr, - 0, - 0, - 0, - 0, - __Pyx_CyFunction_CallAsMethod, - 0, - 0, - 0, - 0, -#ifdef Py_TPFLAGS_METHOD_DESCRIPTOR - Py_TPFLAGS_METHOD_DESCRIPTOR | -#endif -#if defined(_Py_TPFLAGS_HAVE_VECTORCALL) && CYTHON_METH_FASTCALL - _Py_TPFLAGS_HAVE_VECTORCALL | -#endif - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, - 0, - (traverseproc) __Pyx_CyFunction_traverse, - (inquiry) __Pyx_CyFunction_clear, - 0, -#if PY_VERSION_HEX < 0x030500A0 - offsetof(__pyx_CyFunctionObject, func_weakreflist), -#else - offsetof(PyCFunctionObject, m_weakreflist), -#endif - 0, - 0, - __pyx_CyFunction_methods, - __pyx_CyFunction_members, - __pyx_CyFunction_getsets, - 0, - 0, - __Pyx_PyMethod_New, - 0, - offsetof(__pyx_CyFunctionObject, func_dict), - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, -#if PY_VERSION_HEX >= 0x030400a1 - 0, -#endif -#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) - 0, -#endif -#if __PYX_NEED_TP_PRINT_SLOT - 0, -#endif -#if PY_VERSION_HEX >= 0x030C0000 - 0, -#endif -#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 - 0, -#endif -}; -#endif -static int __pyx_CyFunction_init(PyObject *module) { -#if CYTHON_USE_TYPE_SPECS - __pyx_CyFunctionType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_CyFunctionType_spec, NULL); -#else - CYTHON_UNUSED_VAR(module); - __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); -#endif - if (unlikely(__pyx_CyFunctionType == NULL)) { - return -1; - } - return 0; -} -static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { - __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; - m->defaults = PyObject_Malloc(size); - if (unlikely(!m->defaults)) - return PyErr_NoMemory(); - memset(m->defaults, 0, size); - m->defaults_pyobjects = pyobjects; - m->defaults_size = size; - return m->defaults; -} -static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { - __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; - m->defaults_tuple = tuple; - Py_INCREF(tuple); -} -static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { - __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; - m->defaults_kwdict = dict; - Py_INCREF(dict); -} -static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { - __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; - m->func_annotations = dict; - Py_INCREF(dict); -} - -/* CythonFunction */ -static PyObject *__Pyx_CyFunction_New(PyMethodDef *ml, int flags, PyObject* qualname, - PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { - PyObject *op = __Pyx_CyFunction_Init( - PyObject_GC_New(__pyx_CyFunctionObject, __pyx_CyFunctionType), - ml, flags, qualname, closure, module, globals, code - ); - if (likely(op)) { - PyObject_GC_Track(op); - } - return op; -} - -/* CLineInTraceback */ -#ifndef CYTHON_CLINE_IN_TRACEBACK -static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line) { - PyObject *use_cline; - PyObject *ptype, *pvalue, *ptraceback; -#if CYTHON_COMPILING_IN_CPYTHON - PyObject **cython_runtime_dict; -#endif - CYTHON_MAYBE_UNUSED_VAR(tstate); - if (unlikely(!__pyx_cython_runtime)) { - return c_line; - } - __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); -#if CYTHON_COMPILING_IN_CPYTHON - cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); - if (likely(cython_runtime_dict)) { - __PYX_PY_DICT_LOOKUP_IF_MODIFIED( - use_cline, *cython_runtime_dict, - __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) - } else -#endif - { - PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStrNoError(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); - if (use_cline_obj) { - use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; - Py_DECREF(use_cline_obj); - } else { - PyErr_Clear(); - use_cline = NULL; - } - } - if (!use_cline) { - c_line = 0; - (void) PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); - } - else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { - c_line = 0; - } - __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); - return c_line; -} -#endif - -/* CodeObjectCache */ -#if !CYTHON_COMPILING_IN_LIMITED_API -static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { - int start = 0, mid = 0, end = count - 1; - if (end >= 0 && code_line > entries[end].code_line) { - return count; - } - while (start < end) { - mid = start + (end - start) / 2; - if (code_line < entries[mid].code_line) { - end = mid; - } else if (code_line > entries[mid].code_line) { - start = mid + 1; - } else { - return mid; - } - } - if (code_line <= entries[mid].code_line) { - return mid; - } else { - return mid + 1; - } -} -static PyCodeObject *__pyx_find_code_object(int code_line) { - PyCodeObject* code_object; - int pos; - if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { - return NULL; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { - return NULL; - } - code_object = __pyx_code_cache.entries[pos].code_object; - Py_INCREF(code_object); - return code_object; -} -static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { - int pos, i; - __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; - if (unlikely(!code_line)) { - return; - } - if (unlikely(!entries)) { - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); - if (likely(entries)) { - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = 64; - __pyx_code_cache.count = 1; - entries[0].code_line = code_line; - entries[0].code_object = code_object; - Py_INCREF(code_object); - } - return; - } - pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); - if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { - PyCodeObject* tmp = entries[pos].code_object; - entries[pos].code_object = code_object; - Py_DECREF(tmp); - return; - } - if (__pyx_code_cache.count == __pyx_code_cache.max_count) { - int new_max = __pyx_code_cache.max_count + 64; - entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( - __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); - if (unlikely(!entries)) { - return; - } - __pyx_code_cache.entries = entries; - __pyx_code_cache.max_count = new_max; - } - for (i=__pyx_code_cache.count; i>pos; i--) { - entries[i] = entries[i-1]; - } - entries[pos].code_line = code_line; - entries[pos].code_object = code_object; - __pyx_code_cache.count++; - Py_INCREF(code_object); -} -#endif - -/* AddTraceback */ -#include "compile.h" -#include "frameobject.h" -#include "traceback.h" -#if PY_VERSION_HEX >= 0x030b00a6 && !CYTHON_COMPILING_IN_LIMITED_API - #ifndef Py_BUILD_CORE - #define Py_BUILD_CORE 1 - #endif - #include "internal/pycore_frame.h" -#endif -#if CYTHON_COMPILING_IN_LIMITED_API -static PyObject *__Pyx_PyCode_Replace_For_AddTraceback(PyObject *code, PyObject *scratch_dict, - PyObject *firstlineno, PyObject *name) { - PyObject *replace = NULL; - if (unlikely(PyDict_SetItemString(scratch_dict, "co_firstlineno", firstlineno))) return NULL; - if (unlikely(PyDict_SetItemString(scratch_dict, "co_name", name))) return NULL; - replace = PyObject_GetAttrString(code, "replace"); - if (likely(replace)) { - PyObject *result; - result = PyObject_Call(replace, __pyx_empty_tuple, scratch_dict); - Py_DECREF(replace); - return result; - } - PyErr_Clear(); - #if __PYX_LIMITED_VERSION_HEX < 0x030780000 - { - PyObject *compiled = NULL, *result = NULL; - if (unlikely(PyDict_SetItemString(scratch_dict, "code", code))) return NULL; - if (unlikely(PyDict_SetItemString(scratch_dict, "type", (PyObject*)(&PyType_Type)))) return NULL; - compiled = Py_CompileString( - "out = type(code)(\n" - " code.co_argcount, code.co_kwonlyargcount, code.co_nlocals, code.co_stacksize,\n" - " code.co_flags, code.co_code, code.co_consts, code.co_names,\n" - " code.co_varnames, code.co_filename, co_name, co_firstlineno,\n" - " code.co_lnotab)\n", "", Py_file_input); - if (!compiled) return NULL; - result = PyEval_EvalCode(compiled, scratch_dict, scratch_dict); - Py_DECREF(compiled); - if (!result) PyErr_Print(); - Py_DECREF(result); - result = PyDict_GetItemString(scratch_dict, "out"); - if (result) Py_INCREF(result); - return result; - } - #else - return NULL; - #endif -} -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename) { - PyObject *code_object = NULL, *py_py_line = NULL, *py_funcname = NULL, *dict = NULL; - PyObject *replace = NULL, *getframe = NULL, *frame = NULL; - PyObject *exc_type, *exc_value, *exc_traceback; - int success = 0; - if (c_line) { - (void) __pyx_cfilenm; - (void) __Pyx_CLineForTraceback(__Pyx_PyThreadState_Current, c_line); - } - PyErr_Fetch(&exc_type, &exc_value, &exc_traceback); - code_object = Py_CompileString("_getframe()", filename, Py_eval_input); - if (unlikely(!code_object)) goto bad; - py_py_line = PyLong_FromLong(py_line); - if (unlikely(!py_py_line)) goto bad; - py_funcname = PyUnicode_FromString(funcname); - if (unlikely(!py_funcname)) goto bad; - dict = PyDict_New(); - if (unlikely(!dict)) goto bad; - { - PyObject *old_code_object = code_object; - code_object = __Pyx_PyCode_Replace_For_AddTraceback(code_object, dict, py_py_line, py_funcname); - Py_DECREF(old_code_object); - } - if (unlikely(!code_object)) goto bad; - getframe = PySys_GetObject("_getframe"); - if (unlikely(!getframe)) goto bad; - if (unlikely(PyDict_SetItemString(dict, "_getframe", getframe))) goto bad; - frame = PyEval_EvalCode(code_object, dict, dict); - if (unlikely(!frame) || frame == Py_None) goto bad; - success = 1; - bad: - PyErr_Restore(exc_type, exc_value, exc_traceback); - Py_XDECREF(code_object); - Py_XDECREF(py_py_line); - Py_XDECREF(py_funcname); - Py_XDECREF(dict); - Py_XDECREF(replace); - if (success) { - PyTraceBack_Here( - (struct _frame*)frame); - } - Py_XDECREF(frame); -} -#else -static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( - const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = NULL; - PyObject *py_funcname = NULL; - #if PY_MAJOR_VERSION < 3 - PyObject *py_srcfile = NULL; - py_srcfile = PyString_FromString(filename); - if (!py_srcfile) goto bad; - #endif - if (c_line) { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - if (!py_funcname) goto bad; - #else - py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); - if (!py_funcname) goto bad; - funcname = PyUnicode_AsUTF8(py_funcname); - if (!funcname) goto bad; - #endif - } - else { - #if PY_MAJOR_VERSION < 3 - py_funcname = PyString_FromString(funcname); - if (!py_funcname) goto bad; - #endif - } - #if PY_MAJOR_VERSION < 3 - py_code = __Pyx_PyCode_New( - 0, - 0, - 0, - 0, - 0, - 0, - __pyx_empty_bytes, /*PyObject *code,*/ - __pyx_empty_tuple, /*PyObject *consts,*/ - __pyx_empty_tuple, /*PyObject *names,*/ - __pyx_empty_tuple, /*PyObject *varnames,*/ - __pyx_empty_tuple, /*PyObject *freevars,*/ - __pyx_empty_tuple, /*PyObject *cellvars,*/ - py_srcfile, /*PyObject *filename,*/ - py_funcname, /*PyObject *name,*/ - py_line, - __pyx_empty_bytes /*PyObject *lnotab*/ - ); - Py_DECREF(py_srcfile); - #else - py_code = PyCode_NewEmpty(filename, funcname, py_line); - #endif - Py_XDECREF(py_funcname); - return py_code; -bad: - Py_XDECREF(py_funcname); - #if PY_MAJOR_VERSION < 3 - Py_XDECREF(py_srcfile); - #endif - return NULL; -} -static void __Pyx_AddTraceback(const char *funcname, int c_line, - int py_line, const char *filename) { - PyCodeObject *py_code = 0; - PyFrameObject *py_frame = 0; - PyThreadState *tstate = __Pyx_PyThreadState_Current; - PyObject *ptype, *pvalue, *ptraceback; - if (c_line) { - c_line = __Pyx_CLineForTraceback(tstate, c_line); - } - py_code = __pyx_find_code_object(c_line ? -c_line : py_line); - if (!py_code) { - __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); - py_code = __Pyx_CreateCodeObjectForTraceback( - funcname, c_line, py_line, filename); - if (!py_code) { - /* If the code object creation fails, then we should clear the - fetched exception references and propagate the new exception */ - Py_XDECREF(ptype); - Py_XDECREF(pvalue); - Py_XDECREF(ptraceback); - goto bad; - } - __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); - __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); - } - py_frame = PyFrame_New( - tstate, /*PyThreadState *tstate,*/ - py_code, /*PyCodeObject *code,*/ - __pyx_d, /*PyObject *globals,*/ - 0 /*PyObject *locals*/ - ); - if (!py_frame) goto bad; - __Pyx_PyFrame_SetLineNumber(py_frame, py_line); - PyTraceBack_Here(py_frame); -bad: - Py_XDECREF(py_code); - Py_XDECREF(py_frame); -} -#endif - -/* Declarations */ -#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) - #ifdef __cplusplus - static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { - return ::std::complex< double >(x, y); - } - #else - static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { - return x + y*(__pyx_t_double_complex)_Complex_I; - } - #endif -#else - static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { - __pyx_t_double_complex z; - z.real = x; - z.imag = y; - return z; - } -#endif - -/* Arithmetic */ -#if CYTHON_CCOMPLEX && (1) && (!0 || __cplusplus) -#else - static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - return (a.real == b.real) && (a.imag == b.imag); - } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - __pyx_t_double_complex z; - z.real = a.real + b.real; - z.imag = a.imag + b.imag; - return z; - } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - __pyx_t_double_complex z; - z.real = a.real - b.real; - z.imag = a.imag - b.imag; - return z; - } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - __pyx_t_double_complex z; - z.real = a.real * b.real - a.imag * b.imag; - z.imag = a.real * b.imag + a.imag * b.real; - return z; - } - #if 1 - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - if (b.imag == 0) { - return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); - } else if (fabs(b.real) >= fabs(b.imag)) { - if (b.real == 0 && b.imag == 0) { - return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); - } else { - double r = b.imag / b.real; - double s = (double)(1.0) / (b.real + b.imag * r); - return __pyx_t_double_complex_from_parts( - (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); - } - } else { - double r = b.real / b.imag; - double s = (double)(1.0) / (b.imag + b.real * r); - return __pyx_t_double_complex_from_parts( - (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); - } - } - #else - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - if (b.imag == 0) { - return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); - } else { - double denom = b.real * b.real + b.imag * b.imag; - return __pyx_t_double_complex_from_parts( - (a.real * b.real + a.imag * b.imag) / denom, - (a.imag * b.real - a.real * b.imag) / denom); - } - } - #endif - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { - __pyx_t_double_complex z; - z.real = -a.real; - z.imag = -a.imag; - return z; - } - static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { - return (a.real == 0) && (a.imag == 0); - } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { - __pyx_t_double_complex z; - z.real = a.real; - z.imag = -a.imag; - return z; - } - #if 1 - static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { - #if !defined(HAVE_HYPOT) || defined(_MSC_VER) - return sqrt(z.real*z.real + z.imag*z.imag); - #else - return hypot(z.real, z.imag); - #endif - } - static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { - __pyx_t_double_complex z; - double r, lnr, theta, z_r, z_theta; - if (b.imag == 0 && b.real == (int)b.real) { - if (b.real < 0) { - double denom = a.real * a.real + a.imag * a.imag; - a.real = a.real / denom; - a.imag = -a.imag / denom; - b.real = -b.real; - } - switch ((int)b.real) { - case 0: - z.real = 1; - z.imag = 0; - return z; - case 1: - return a; - case 2: - return __Pyx_c_prod_double(a, a); - case 3: - z = __Pyx_c_prod_double(a, a); - return __Pyx_c_prod_double(z, a); - case 4: - z = __Pyx_c_prod_double(a, a); - return __Pyx_c_prod_double(z, z); - } - } - if (a.imag == 0) { - if (a.real == 0) { - return a; - } else if ((b.imag == 0) && (a.real >= 0)) { - z.real = pow(a.real, b.real); - z.imag = 0; - return z; - } else if (a.real > 0) { - r = a.real; - theta = 0; - } else { - r = -a.real; - theta = atan2(0.0, -1.0); - } - } else { - r = __Pyx_c_abs_double(a); - theta = atan2(a.imag, a.real); - } - lnr = log(r); - z_r = exp(lnr * b.real - theta * b.imag); - z_theta = theta * b.real + lnr * b.imag; - z.real = z_r * cos(z_theta); - z.imag = z_r * sin(z_theta); - return z; - } - #endif -#endif - -/* FromPy */ -static __pyx_t_double_complex __Pyx_PyComplex_As___pyx_t_double_complex(PyObject* o) { - Py_complex cval; -#if !CYTHON_COMPILING_IN_PYPY - if (PyComplex_CheckExact(o)) - cval = ((PyComplexObject *)o)->cval; - else -#endif - cval = PyComplex_AsCComplex(o); - return __pyx_t_double_complex_from_parts( - (double)cval.real, - (double)cval.imag); -} - -/* CIntFromPyVerify */ -#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) -#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ - __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) -#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ - {\ - func_type value = func_value;\ - if (sizeof(target_type) < sizeof(func_type)) {\ - if (unlikely(value != (func_type) (target_type) value)) {\ - func_type zero = 0;\ - if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ - return (target_type) -1;\ - if (is_unsigned && unlikely(value < zero))\ - goto raise_neg_overflow;\ - else\ - goto raise_overflow;\ - }\ - }\ - return (target_type) value;\ - } - -/* CIntFromPy */ -static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const int neg_one = (int) -1, const_zero = (int) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if ((sizeof(int) < sizeof(long))) { - __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (int) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - if (unlikely(__Pyx_PyLong_IsNeg(x))) { - goto raise_neg_overflow; - } else if (__Pyx_PyLong_IsCompact(x)) { - __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) - } else { - const digit* digits = __Pyx_PyLong_Digits(x); - assert(__Pyx_PyLong_DigitCount(x) > 1); - switch (__Pyx_PyLong_DigitCount(x)) { - case 2: - if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) >= 2 * PyLong_SHIFT)) { - return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 3: - if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) >= 3 * PyLong_SHIFT)) { - return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - case 4: - if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) >= 4 * PyLong_SHIFT)) { - return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); - } - } - break; - } - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (int) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if ((sizeof(int) <= sizeof(unsigned long))) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if ((sizeof(int) <= sizeof(unsigned PY_LONG_LONG))) { - __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - if (__Pyx_PyLong_IsCompact(x)) { - __PYX_VERIFY_RETURN_INT(int, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) - } else { - const digit* digits = __Pyx_PyLong_Digits(x); - assert(__Pyx_PyLong_DigitCount(x) > 1); - switch (__Pyx_PyLong_SignedDigitCount(x)) { - case -2: - if ((8 * sizeof(int) - 1 > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { - return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 2: - if ((8 * sizeof(int) > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { - return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -3: - if ((8 * sizeof(int) - 1 > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { - return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 3: - if ((8 * sizeof(int) > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { - return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case -4: - if ((8 * sizeof(int) - 1 > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { - return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - case 4: - if ((8 * sizeof(int) > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(int) - 1 > 4 * PyLong_SHIFT)) { - return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); - } - } - break; - } - } -#endif - if ((sizeof(int) <= sizeof(long))) { - __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if ((sizeof(int) <= sizeof(PY_LONG_LONG))) { - __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { - int val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); -#if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } -#endif - if (likely(v)) { - int ret = -1; -#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); -#else - PyObject *stepval = NULL, *mask = NULL, *shift = NULL; - int bits, remaining_bits, is_negative = 0; - long idigit; - int chunk_size = (sizeof(long) < 8) ? 30 : 62; - if (unlikely(!PyLong_CheckExact(v))) { - PyObject *tmp = v; - v = PyNumber_Long(v); - assert(PyLong_CheckExact(v)); - Py_DECREF(tmp); - if (unlikely(!v)) return (int) -1; - } -#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - if (Py_SIZE(x) == 0) - return (int) 0; - is_negative = Py_SIZE(x) < 0; -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (int) -1; - is_negative = result == 1; - } -#endif - if (is_unsigned && unlikely(is_negative)) { - goto raise_neg_overflow; - } else if (is_negative) { - stepval = PyNumber_Invert(v); - if (unlikely(!stepval)) - return (int) -1; - } else { - stepval = __Pyx_NewRef(v); - } - val = (int) 0; - mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; - shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; - for (bits = 0; bits < (int) sizeof(int) * 8 - chunk_size; bits += chunk_size) { - PyObject *tmp, *digit; - digit = PyNumber_And(stepval, mask); - if (unlikely(!digit)) goto done; - idigit = PyLong_AsLong(digit); - Py_DECREF(digit); - if (unlikely(idigit < 0)) goto done; - tmp = PyNumber_Rshift(stepval, shift); - if (unlikely(!tmp)) goto done; - Py_DECREF(stepval); stepval = tmp; - val |= ((int) idigit) << bits; - #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - if (Py_SIZE(stepval) == 0) - goto unpacking_done; - #endif - } - idigit = PyLong_AsLong(stepval); - if (unlikely(idigit < 0)) goto done; - remaining_bits = ((int) sizeof(int) * 8) - bits - (is_unsigned ? 0 : 1); - if (unlikely(idigit >= (1L << remaining_bits))) - goto raise_overflow; - val |= ((int) idigit) << bits; - #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - unpacking_done: - #endif - if (!is_unsigned) { - if (unlikely(val & (((int) 1) << (sizeof(int) * 8 - 1)))) - goto raise_overflow; - if (is_negative) - val = ~val; - } - ret = 0; - done: - Py_XDECREF(shift); - Py_XDECREF(mask); - Py_XDECREF(stepval); -#endif - Py_DECREF(v); - if (likely(!ret)) - return val; - } - return (int) -1; - } - } else { - int val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (int) -1; - val = __Pyx_PyInt_As_int(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to int"); - return (int) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to int"); - return (int) -1; -} - -/* CIntToPy */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const long neg_one = (long) -1, const_zero = (long) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(long) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(long) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(long) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; -#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 - return _PyLong_FromByteArray(bytes, sizeof(long), - little, !is_unsigned); -#else - PyObject *from_bytes, *result = NULL; - PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; - from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); - if (!from_bytes) return NULL; - py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(long)); - if (!py_bytes) goto limited_bad; - order_str = PyUnicode_FromString(little ? "little" : "big"); - if (!order_str) goto limited_bad; - arg_tuple = PyTuple_Pack(2, py_bytes, order_str); - if (!arg_tuple) goto limited_bad; - if (!is_unsigned) { - kwds = PyDict_New(); - if (!kwds) goto limited_bad; - if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; - } - result = PyObject_Call(from_bytes, arg_tuple, kwds); - limited_bad: - Py_XDECREF(kwds); - Py_XDECREF(arg_tuple); - Py_XDECREF(order_str); - Py_XDECREF(py_bytes); - Py_XDECREF(from_bytes); - return result; -#endif - } -} - -/* CIntToPy */ -static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const int neg_one = (int) -1, const_zero = (int) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; - if (is_unsigned) { - if (sizeof(int) < sizeof(long)) { - return PyInt_FromLong((long) value); - } else if (sizeof(int) <= sizeof(unsigned long)) { - return PyLong_FromUnsignedLong((unsigned long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { - return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); -#endif - } - } else { - if (sizeof(int) <= sizeof(long)) { - return PyInt_FromLong((long) value); -#ifdef HAVE_LONG_LONG - } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { - return PyLong_FromLongLong((PY_LONG_LONG) value); -#endif - } - } - { - int one = 1; int little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&value; -#if !CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030d0000 - return _PyLong_FromByteArray(bytes, sizeof(int), - little, !is_unsigned); -#else - PyObject *from_bytes, *result = NULL; - PyObject *py_bytes = NULL, *arg_tuple = NULL, *kwds = NULL, *order_str = NULL; - from_bytes = PyObject_GetAttrString((PyObject*)&PyLong_Type, "from_bytes"); - if (!from_bytes) return NULL; - py_bytes = PyBytes_FromStringAndSize((char*)bytes, sizeof(int)); - if (!py_bytes) goto limited_bad; - order_str = PyUnicode_FromString(little ? "little" : "big"); - if (!order_str) goto limited_bad; - arg_tuple = PyTuple_Pack(2, py_bytes, order_str); - if (!arg_tuple) goto limited_bad; - if (!is_unsigned) { - kwds = PyDict_New(); - if (!kwds) goto limited_bad; - if (PyDict_SetItemString(kwds, "signed", __Pyx_NewRef(Py_True))) goto limited_bad; - } - result = PyObject_Call(from_bytes, arg_tuple, kwds); - limited_bad: - Py_XDECREF(kwds); - Py_XDECREF(arg_tuple); - Py_XDECREF(order_str); - Py_XDECREF(py_bytes); - Py_XDECREF(from_bytes); - return result; -#endif - } -} - -/* CIntFromPy */ -static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - const long neg_one = (long) -1, const_zero = (long) 0; -#ifdef __Pyx_HAS_GCC_DIAGNOSTIC -#pragma GCC diagnostic pop -#endif - const int is_unsigned = neg_one > const_zero; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x))) { - if ((sizeof(long) < sizeof(long))) { - __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) - } else { - long val = PyInt_AS_LONG(x); - if (is_unsigned && unlikely(val < 0)) { - goto raise_neg_overflow; - } - return (long) val; - } - } else -#endif - if (likely(PyLong_Check(x))) { - if (is_unsigned) { -#if CYTHON_USE_PYLONG_INTERNALS - if (unlikely(__Pyx_PyLong_IsNeg(x))) { - goto raise_neg_overflow; - } else if (__Pyx_PyLong_IsCompact(x)) { - __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_upylong, __Pyx_PyLong_CompactValueUnsigned(x)) - } else { - const digit* digits = __Pyx_PyLong_Digits(x); - assert(__Pyx_PyLong_DigitCount(x) > 1); - switch (__Pyx_PyLong_DigitCount(x)) { - case 2: - if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) >= 2 * PyLong_SHIFT)) { - return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 3: - if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) >= 3 * PyLong_SHIFT)) { - return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - case 4: - if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) >= 4 * PyLong_SHIFT)) { - return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); - } - } - break; - } - } -#endif -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030C00A7 - if (unlikely(Py_SIZE(x) < 0)) { - goto raise_neg_overflow; - } -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (long) -1; - if (unlikely(result == 1)) - goto raise_neg_overflow; - } -#endif - if ((sizeof(long) <= sizeof(unsigned long))) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) -#ifdef HAVE_LONG_LONG - } else if ((sizeof(long) <= sizeof(unsigned PY_LONG_LONG))) { - __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) -#endif - } - } else { -#if CYTHON_USE_PYLONG_INTERNALS - if (__Pyx_PyLong_IsCompact(x)) { - __PYX_VERIFY_RETURN_INT(long, __Pyx_compact_pylong, __Pyx_PyLong_CompactValue(x)) - } else { - const digit* digits = __Pyx_PyLong_Digits(x); - assert(__Pyx_PyLong_DigitCount(x) > 1); - switch (__Pyx_PyLong_SignedDigitCount(x)) { - case -2: - if ((8 * sizeof(long) - 1 > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { - return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 2: - if ((8 * sizeof(long) > 1 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 2 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { - return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -3: - if ((8 * sizeof(long) - 1 > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { - return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 3: - if ((8 * sizeof(long) > 2 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 3 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { - return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case -4: - if ((8 * sizeof(long) - 1 > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { - return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - case 4: - if ((8 * sizeof(long) > 3 * PyLong_SHIFT)) { - if ((8 * sizeof(unsigned long) > 4 * PyLong_SHIFT)) { - __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) - } else if ((8 * sizeof(long) - 1 > 4 * PyLong_SHIFT)) { - return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); - } - } - break; - } - } -#endif - if ((sizeof(long) <= sizeof(long))) { - __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) -#ifdef HAVE_LONG_LONG - } else if ((sizeof(long) <= sizeof(PY_LONG_LONG))) { - __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) -#endif - } - } - { - long val; - PyObject *v = __Pyx_PyNumber_IntOrLong(x); -#if PY_MAJOR_VERSION < 3 - if (likely(v) && !PyLong_Check(v)) { - PyObject *tmp = v; - v = PyNumber_Long(tmp); - Py_DECREF(tmp); - } -#endif - if (likely(v)) { - int ret = -1; -#if PY_VERSION_HEX < 0x030d0000 && !(CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_LIMITED_API) || defined(_PyLong_AsByteArray) - int one = 1; int is_little = (int)*(unsigned char *)&one; - unsigned char *bytes = (unsigned char *)&val; - ret = _PyLong_AsByteArray((PyLongObject *)v, - bytes, sizeof(val), - is_little, !is_unsigned); -#else - PyObject *stepval = NULL, *mask = NULL, *shift = NULL; - int bits, remaining_bits, is_negative = 0; - long idigit; - int chunk_size = (sizeof(long) < 8) ? 30 : 62; - if (unlikely(!PyLong_CheckExact(v))) { - PyObject *tmp = v; - v = PyNumber_Long(v); - assert(PyLong_CheckExact(v)); - Py_DECREF(tmp); - if (unlikely(!v)) return (long) -1; - } -#if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - if (Py_SIZE(x) == 0) - return (long) 0; - is_negative = Py_SIZE(x) < 0; -#else - { - int result = PyObject_RichCompareBool(x, Py_False, Py_LT); - if (unlikely(result < 0)) - return (long) -1; - is_negative = result == 1; - } -#endif - if (is_unsigned && unlikely(is_negative)) { - goto raise_neg_overflow; - } else if (is_negative) { - stepval = PyNumber_Invert(v); - if (unlikely(!stepval)) - return (long) -1; - } else { - stepval = __Pyx_NewRef(v); - } - val = (long) 0; - mask = PyLong_FromLong((1L << chunk_size) - 1); if (unlikely(!mask)) goto done; - shift = PyLong_FromLong(chunk_size); if (unlikely(!shift)) goto done; - for (bits = 0; bits < (int) sizeof(long) * 8 - chunk_size; bits += chunk_size) { - PyObject *tmp, *digit; - digit = PyNumber_And(stepval, mask); - if (unlikely(!digit)) goto done; - idigit = PyLong_AsLong(digit); - Py_DECREF(digit); - if (unlikely(idigit < 0)) goto done; - tmp = PyNumber_Rshift(stepval, shift); - if (unlikely(!tmp)) goto done; - Py_DECREF(stepval); stepval = tmp; - val |= ((long) idigit) << bits; - #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - if (Py_SIZE(stepval) == 0) - goto unpacking_done; - #endif - } - idigit = PyLong_AsLong(stepval); - if (unlikely(idigit < 0)) goto done; - remaining_bits = ((int) sizeof(long) * 8) - bits - (is_unsigned ? 0 : 1); - if (unlikely(idigit >= (1L << remaining_bits))) - goto raise_overflow; - val |= ((long) idigit) << bits; - #if CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x030B0000 - unpacking_done: - #endif - if (!is_unsigned) { - if (unlikely(val & (((long) 1) << (sizeof(long) * 8 - 1)))) - goto raise_overflow; - if (is_negative) - val = ~val; - } - ret = 0; - done: - Py_XDECREF(shift); - Py_XDECREF(mask); - Py_XDECREF(stepval); -#endif - Py_DECREF(v); - if (likely(!ret)) - return val; - } - return (long) -1; - } - } else { - long val; - PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); - if (!tmp) return (long) -1; - val = __Pyx_PyInt_As_long(tmp); - Py_DECREF(tmp); - return val; - } -raise_overflow: - PyErr_SetString(PyExc_OverflowError, - "value too large to convert to long"); - return (long) -1; -raise_neg_overflow: - PyErr_SetString(PyExc_OverflowError, - "can't convert negative value to long"); - return (long) -1; -} - -/* FormatTypeName */ -#if CYTHON_COMPILING_IN_LIMITED_API -static __Pyx_TypeName -__Pyx_PyType_GetName(PyTypeObject* tp) -{ - PyObject *name = __Pyx_PyObject_GetAttrStr((PyObject *)tp, - __pyx_n_s_name); - if (unlikely(name == NULL) || unlikely(!PyUnicode_Check(name))) { - PyErr_Clear(); - Py_XDECREF(name); - name = __Pyx_NewRef(__pyx_n_s__9); - } - return name; -} -#endif - -/* SwapException */ -#if CYTHON_FAST_THREAD_STATE -static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - #if CYTHON_USE_EXC_INFO_STACK && PY_VERSION_HEX >= 0x030B00a4 - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_value = exc_info->exc_value; - exc_info->exc_value = *value; - if (tmp_value == NULL || tmp_value == Py_None) { - Py_XDECREF(tmp_value); - tmp_value = NULL; - tmp_type = NULL; - tmp_tb = NULL; - } else { - tmp_type = (PyObject*) Py_TYPE(tmp_value); - Py_INCREF(tmp_type); - #if CYTHON_COMPILING_IN_CPYTHON - tmp_tb = ((PyBaseExceptionObject*) tmp_value)->traceback; - Py_XINCREF(tmp_tb); - #else - tmp_tb = PyException_GetTraceback(tmp_value); - #endif - } - #elif CYTHON_USE_EXC_INFO_STACK - _PyErr_StackItem *exc_info = tstate->exc_info; - tmp_type = exc_info->exc_type; - tmp_value = exc_info->exc_value; - tmp_tb = exc_info->exc_traceback; - exc_info->exc_type = *type; - exc_info->exc_value = *value; - exc_info->exc_traceback = *tb; - #else - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = *type; - tstate->exc_value = *value; - tstate->exc_traceback = *tb; - #endif - *type = tmp_type; - *value = tmp_value; - *tb = tmp_tb; -} -#else -static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { - PyObject *tmp_type, *tmp_value, *tmp_tb; - PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); - PyErr_SetExcInfo(*type, *value, *tb); - *type = tmp_type; - *value = tmp_value; - *tb = tmp_tb; -} -#endif - -/* PyObjectCall2Args */ -static CYTHON_INLINE PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) { - PyObject *args[3] = {NULL, arg1, arg2}; - return __Pyx_PyObject_FastCall(function, args+1, 2 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); -} - -/* PyObjectCallMethod1 */ -#if !(CYTHON_VECTORCALL && __PYX_LIMITED_VERSION_HEX >= 0x030C00A2) -static PyObject* __Pyx__PyObject_CallMethod1(PyObject* method, PyObject* arg) { - PyObject *result = __Pyx_PyObject_CallOneArg(method, arg); - Py_DECREF(method); - return result; -} -#endif -static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg) { -#if CYTHON_VECTORCALL && __PYX_LIMITED_VERSION_HEX >= 0x030C00A2 - PyObject *args[2] = {obj, arg}; - (void) __Pyx_PyObject_GetMethod; - (void) __Pyx_PyObject_CallOneArg; - (void) __Pyx_PyObject_Call2Args; - return PyObject_VectorcallMethod(method_name, args, 2 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); -#else - PyObject *method = NULL, *result; - int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); - if (likely(is_method)) { - result = __Pyx_PyObject_Call2Args(method, obj, arg); - Py_DECREF(method); - return result; - } - if (unlikely(!method)) return NULL; - return __Pyx__PyObject_CallMethod1(method, arg); -#endif -} - -/* CoroutineBase */ -#include -#if PY_VERSION_HEX >= 0x030b00a6 - #ifndef Py_BUILD_CORE - #define Py_BUILD_CORE 1 - #endif - #include "internal/pycore_frame.h" -#endif -#define __Pyx_Coroutine_Undelegate(gen) Py_CLEAR((gen)->yieldfrom) -static int __Pyx_PyGen__FetchStopIterationValue(PyThreadState *__pyx_tstate, PyObject **pvalue) { - PyObject *et, *ev, *tb; - PyObject *value = NULL; - CYTHON_UNUSED_VAR(__pyx_tstate); - __Pyx_ErrFetch(&et, &ev, &tb); - if (!et) { - Py_XDECREF(tb); - Py_XDECREF(ev); - Py_INCREF(Py_None); - *pvalue = Py_None; - return 0; - } - if (likely(et == PyExc_StopIteration)) { - if (!ev) { - Py_INCREF(Py_None); - value = Py_None; - } -#if PY_VERSION_HEX >= 0x030300A0 - else if (likely(__Pyx_IS_TYPE(ev, (PyTypeObject*)PyExc_StopIteration))) { - value = ((PyStopIterationObject *)ev)->value; - Py_INCREF(value); - Py_DECREF(ev); - } -#endif - else if (unlikely(PyTuple_Check(ev))) { - if (PyTuple_GET_SIZE(ev) >= 1) { -#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS - value = PyTuple_GET_ITEM(ev, 0); - Py_INCREF(value); -#else - value = PySequence_ITEM(ev, 0); -#endif - } else { - Py_INCREF(Py_None); - value = Py_None; - } - Py_DECREF(ev); - } - else if (!__Pyx_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration)) { - value = ev; - } - if (likely(value)) { - Py_XDECREF(tb); - Py_DECREF(et); - *pvalue = value; - return 0; - } - } else if (!__Pyx_PyErr_GivenExceptionMatches(et, PyExc_StopIteration)) { - __Pyx_ErrRestore(et, ev, tb); - return -1; - } - PyErr_NormalizeException(&et, &ev, &tb); - if (unlikely(!PyObject_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration))) { - __Pyx_ErrRestore(et, ev, tb); - return -1; - } - Py_XDECREF(tb); - Py_DECREF(et); -#if PY_VERSION_HEX >= 0x030300A0 - value = ((PyStopIterationObject *)ev)->value; - Py_INCREF(value); - Py_DECREF(ev); -#else - { - PyObject* args = __Pyx_PyObject_GetAttrStr(ev, __pyx_n_s_args); - Py_DECREF(ev); - if (likely(args)) { - value = PySequence_GetItem(args, 0); - Py_DECREF(args); - } - if (unlikely(!value)) { - __Pyx_ErrRestore(NULL, NULL, NULL); - Py_INCREF(Py_None); - value = Py_None; - } - } -#endif - *pvalue = value; - return 0; -} -static CYTHON_INLINE -void __Pyx_Coroutine_ExceptionClear(__Pyx_ExcInfoStruct *exc_state) { -#if PY_VERSION_HEX >= 0x030B00a4 - Py_CLEAR(exc_state->exc_value); -#else - PyObject *t, *v, *tb; - t = exc_state->exc_type; - v = exc_state->exc_value; - tb = exc_state->exc_traceback; - exc_state->exc_type = NULL; - exc_state->exc_value = NULL; - exc_state->exc_traceback = NULL; - Py_XDECREF(t); - Py_XDECREF(v); - Py_XDECREF(tb); -#endif -} -#define __Pyx_Coroutine_AlreadyRunningError(gen) (__Pyx__Coroutine_AlreadyRunningError(gen), (PyObject*)NULL) -static void __Pyx__Coroutine_AlreadyRunningError(__pyx_CoroutineObject *gen) { - const char *msg; - CYTHON_MAYBE_UNUSED_VAR(gen); - if ((0)) { - #ifdef __Pyx_Coroutine_USED - } else if (__Pyx_Coroutine_Check((PyObject*)gen)) { - msg = "coroutine already executing"; - #endif - #ifdef __Pyx_AsyncGen_USED - } else if (__Pyx_AsyncGen_CheckExact((PyObject*)gen)) { - msg = "async generator already executing"; - #endif - } else { - msg = "generator already executing"; - } - PyErr_SetString(PyExc_ValueError, msg); -} -#define __Pyx_Coroutine_NotStartedError(gen) (__Pyx__Coroutine_NotStartedError(gen), (PyObject*)NULL) -static void __Pyx__Coroutine_NotStartedError(PyObject *gen) { - const char *msg; - CYTHON_MAYBE_UNUSED_VAR(gen); - if ((0)) { - #ifdef __Pyx_Coroutine_USED - } else if (__Pyx_Coroutine_Check(gen)) { - msg = "can't send non-None value to a just-started coroutine"; - #endif - #ifdef __Pyx_AsyncGen_USED - } else if (__Pyx_AsyncGen_CheckExact(gen)) { - msg = "can't send non-None value to a just-started async generator"; - #endif - } else { - msg = "can't send non-None value to a just-started generator"; - } - PyErr_SetString(PyExc_TypeError, msg); -} -#define __Pyx_Coroutine_AlreadyTerminatedError(gen, value, closing) (__Pyx__Coroutine_AlreadyTerminatedError(gen, value, closing), (PyObject*)NULL) -static void __Pyx__Coroutine_AlreadyTerminatedError(PyObject *gen, PyObject *value, int closing) { - CYTHON_MAYBE_UNUSED_VAR(gen); - CYTHON_MAYBE_UNUSED_VAR(closing); - #ifdef __Pyx_Coroutine_USED - if (!closing && __Pyx_Coroutine_Check(gen)) { - PyErr_SetString(PyExc_RuntimeError, "cannot reuse already awaited coroutine"); - } else - #endif - if (value) { - #ifdef __Pyx_AsyncGen_USED - if (__Pyx_AsyncGen_CheckExact(gen)) - PyErr_SetNone(__Pyx_PyExc_StopAsyncIteration); - else - #endif - PyErr_SetNone(PyExc_StopIteration); - } -} -static -PyObject *__Pyx_Coroutine_SendEx(__pyx_CoroutineObject *self, PyObject *value, int closing) { - __Pyx_PyThreadState_declare - PyThreadState *tstate; - __Pyx_ExcInfoStruct *exc_state; - PyObject *retval; - assert(!self->is_running); - if (unlikely(self->resume_label == 0)) { - if (unlikely(value && value != Py_None)) { - return __Pyx_Coroutine_NotStartedError((PyObject*)self); - } - } - if (unlikely(self->resume_label == -1)) { - return __Pyx_Coroutine_AlreadyTerminatedError((PyObject*)self, value, closing); - } -#if CYTHON_FAST_THREAD_STATE - __Pyx_PyThreadState_assign - tstate = __pyx_tstate; -#else - tstate = __Pyx_PyThreadState_Current; -#endif - exc_state = &self->gi_exc_state; - if (exc_state->exc_value) { - #if CYTHON_COMPILING_IN_PYPY - #else - PyObject *exc_tb; - #if PY_VERSION_HEX >= 0x030B00a4 && !CYTHON_COMPILING_IN_CPYTHON - exc_tb = PyException_GetTraceback(exc_state->exc_value); - #elif PY_VERSION_HEX >= 0x030B00a4 - exc_tb = ((PyBaseExceptionObject*) exc_state->exc_value)->traceback; - #else - exc_tb = exc_state->exc_traceback; - #endif - if (exc_tb) { - PyTracebackObject *tb = (PyTracebackObject *) exc_tb; - PyFrameObject *f = tb->tb_frame; - assert(f->f_back == NULL); - #if PY_VERSION_HEX >= 0x030B00A1 - f->f_back = PyThreadState_GetFrame(tstate); - #else - Py_XINCREF(tstate->frame); - f->f_back = tstate->frame; - #endif - #if PY_VERSION_HEX >= 0x030B00a4 && !CYTHON_COMPILING_IN_CPYTHON - Py_DECREF(exc_tb); - #endif - } - #endif - } -#if CYTHON_USE_EXC_INFO_STACK - exc_state->previous_item = tstate->exc_info; - tstate->exc_info = exc_state; -#else - if (exc_state->exc_type) { - __Pyx_ExceptionSwap(&exc_state->exc_type, &exc_state->exc_value, &exc_state->exc_traceback); - } else { - __Pyx_Coroutine_ExceptionClear(exc_state); - __Pyx_ExceptionSave(&exc_state->exc_type, &exc_state->exc_value, &exc_state->exc_traceback); - } -#endif - self->is_running = 1; - retval = self->body(self, tstate, value); - self->is_running = 0; -#if CYTHON_USE_EXC_INFO_STACK - exc_state = &self->gi_exc_state; - tstate->exc_info = exc_state->previous_item; - exc_state->previous_item = NULL; - __Pyx_Coroutine_ResetFrameBackpointer(exc_state); -#endif - return retval; -} -static CYTHON_INLINE void __Pyx_Coroutine_ResetFrameBackpointer(__Pyx_ExcInfoStruct *exc_state) { -#if CYTHON_COMPILING_IN_PYPY - CYTHON_UNUSED_VAR(exc_state); -#else - PyObject *exc_tb; - #if PY_VERSION_HEX >= 0x030B00a4 - if (!exc_state->exc_value) return; - exc_tb = PyException_GetTraceback(exc_state->exc_value); - #else - exc_tb = exc_state->exc_traceback; - #endif - if (likely(exc_tb)) { - PyTracebackObject *tb = (PyTracebackObject *) exc_tb; - PyFrameObject *f = tb->tb_frame; - Py_CLEAR(f->f_back); - #if PY_VERSION_HEX >= 0x030B00a4 - Py_DECREF(exc_tb); - #endif - } -#endif -} -static CYTHON_INLINE -PyObject *__Pyx_Coroutine_MethodReturn(PyObject* gen, PyObject *retval) { - CYTHON_MAYBE_UNUSED_VAR(gen); - if (unlikely(!retval)) { - __Pyx_PyThreadState_declare - __Pyx_PyThreadState_assign - if (!__Pyx_PyErr_Occurred()) { - PyObject *exc = PyExc_StopIteration; - #ifdef __Pyx_AsyncGen_USED - if (__Pyx_AsyncGen_CheckExact(gen)) - exc = __Pyx_PyExc_StopAsyncIteration; - #endif - __Pyx_PyErr_SetNone(exc); - } - } - return retval; -} -#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) -static CYTHON_INLINE -PyObject *__Pyx_PyGen_Send(PyGenObject *gen, PyObject *arg) { -#if PY_VERSION_HEX <= 0x030A00A1 - return _PyGen_Send(gen, arg); -#else - PyObject *result; - if (PyIter_Send((PyObject*)gen, arg ? arg : Py_None, &result) == PYGEN_RETURN) { - if (PyAsyncGen_CheckExact(gen)) { - assert(result == Py_None); - PyErr_SetNone(PyExc_StopAsyncIteration); - } - else if (result == Py_None) { - PyErr_SetNone(PyExc_StopIteration); - } - else { -#if PY_VERSION_HEX < 0x030d00A1 - _PyGen_SetStopIterationValue(result); -#else - if (!PyTuple_Check(result) && !PyExceptionInstance_Check(result)) { - PyErr_SetObject(PyExc_StopIteration, result); - } else { - PyObject *exc = __Pyx_PyObject_CallOneArg(PyExc_StopIteration, result); - if (likely(exc != NULL)) { - PyErr_SetObject(PyExc_StopIteration, exc); - Py_DECREF(exc); - } - } -#endif - } - Py_DECREF(result); - result = NULL; - } - return result; -#endif -} -#endif -static CYTHON_INLINE -PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) { - PyObject *ret; - PyObject *val = NULL; - __Pyx_Coroutine_Undelegate(gen); - __Pyx_PyGen__FetchStopIterationValue(__Pyx_PyThreadState_Current, &val); - ret = __Pyx_Coroutine_SendEx(gen, val, 0); - Py_XDECREF(val); - return ret; -} -static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) { - PyObject *retval; - __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self; - PyObject *yf = gen->yieldfrom; - if (unlikely(gen->is_running)) - return __Pyx_Coroutine_AlreadyRunningError(gen); - if (yf) { - PyObject *ret; - gen->is_running = 1; - #ifdef __Pyx_Generator_USED - if (__Pyx_Generator_CheckExact(yf)) { - ret = __Pyx_Coroutine_Send(yf, value); - } else - #endif - #ifdef __Pyx_Coroutine_USED - if (__Pyx_Coroutine_Check(yf)) { - ret = __Pyx_Coroutine_Send(yf, value); - } else - #endif - #ifdef __Pyx_AsyncGen_USED - if (__pyx_PyAsyncGenASend_CheckExact(yf)) { - ret = __Pyx_async_gen_asend_send(yf, value); - } else - #endif - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) - if (PyGen_CheckExact(yf)) { - ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); - } else - #endif - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03050000 && defined(PyCoro_CheckExact) && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) - if (PyCoro_CheckExact(yf)) { - ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); - } else - #endif - { - if (value == Py_None) - ret = __Pyx_PyObject_GetIterNextFunc(yf)(yf); - else - ret = __Pyx_PyObject_CallMethod1(yf, __pyx_n_s_send, value); - } - gen->is_running = 0; - if (likely(ret)) { - return ret; - } - retval = __Pyx_Coroutine_FinishDelegation(gen); - } else { - retval = __Pyx_Coroutine_SendEx(gen, value, 0); - } - return __Pyx_Coroutine_MethodReturn(self, retval); -} -static int __Pyx_Coroutine_CloseIter(__pyx_CoroutineObject *gen, PyObject *yf) { - PyObject *retval = NULL; - int err = 0; - #ifdef __Pyx_Generator_USED - if (__Pyx_Generator_CheckExact(yf)) { - retval = __Pyx_Coroutine_Close(yf); - if (!retval) - return -1; - } else - #endif - #ifdef __Pyx_Coroutine_USED - if (__Pyx_Coroutine_Check(yf)) { - retval = __Pyx_Coroutine_Close(yf); - if (!retval) - return -1; - } else - if (__Pyx_CoroutineAwait_CheckExact(yf)) { - retval = __Pyx_CoroutineAwait_Close((__pyx_CoroutineAwaitObject*)yf, NULL); - if (!retval) - return -1; - } else - #endif - #ifdef __Pyx_AsyncGen_USED - if (__pyx_PyAsyncGenASend_CheckExact(yf)) { - retval = __Pyx_async_gen_asend_close(yf, NULL); - } else - if (__pyx_PyAsyncGenAThrow_CheckExact(yf)) { - retval = __Pyx_async_gen_athrow_close(yf, NULL); - } else - #endif - { - PyObject *meth; - gen->is_running = 1; - meth = __Pyx_PyObject_GetAttrStrNoError(yf, __pyx_n_s_close); - if (unlikely(!meth)) { - if (unlikely(PyErr_Occurred())) { - PyErr_WriteUnraisable(yf); - } - } else { - retval = __Pyx_PyObject_CallNoArg(meth); - Py_DECREF(meth); - if (unlikely(!retval)) - err = -1; - } - gen->is_running = 0; - } - Py_XDECREF(retval); - return err; -} -static PyObject *__Pyx_Generator_Next(PyObject *self) { - __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self; - PyObject *yf = gen->yieldfrom; - if (unlikely(gen->is_running)) - return __Pyx_Coroutine_AlreadyRunningError(gen); - if (yf) { - PyObject *ret; - gen->is_running = 1; - #ifdef __Pyx_Generator_USED - if (__Pyx_Generator_CheckExact(yf)) { - ret = __Pyx_Generator_Next(yf); - } else - #endif - #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) - if (PyGen_CheckExact(yf)) { - ret = __Pyx_PyGen_Send((PyGenObject*)yf, NULL); - } else - #endif - #ifdef __Pyx_Coroutine_USED - if (__Pyx_Coroutine_Check(yf)) { - ret = __Pyx_Coroutine_Send(yf, Py_None); - } else - #endif - ret = __Pyx_PyObject_GetIterNextFunc(yf)(yf); - gen->is_running = 0; - if (likely(ret)) { - return ret; - } - return __Pyx_Coroutine_FinishDelegation(gen); - } - return __Pyx_Coroutine_SendEx(gen, Py_None, 0); -} -static PyObject *__Pyx_Coroutine_Close_Method(PyObject *self, PyObject *arg) { - CYTHON_UNUSED_VAR(arg); - return __Pyx_Coroutine_Close(self); -} -static PyObject *__Pyx_Coroutine_Close(PyObject *self) { - __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; - PyObject *retval, *raised_exception; - PyObject *yf = gen->yieldfrom; - int err = 0; - if (unlikely(gen->is_running)) - return __Pyx_Coroutine_AlreadyRunningError(gen); - if (yf) { - Py_INCREF(yf); - err = __Pyx_Coroutine_CloseIter(gen, yf); - __Pyx_Coroutine_Undelegate(gen); - Py_DECREF(yf); - } - if (err == 0) - PyErr_SetNone(PyExc_GeneratorExit); - retval = __Pyx_Coroutine_SendEx(gen, NULL, 1); - if (unlikely(retval)) { - const char *msg; - Py_DECREF(retval); - if ((0)) { - #ifdef __Pyx_Coroutine_USED - } else if (__Pyx_Coroutine_Check(self)) { - msg = "coroutine ignored GeneratorExit"; - #endif - #ifdef __Pyx_AsyncGen_USED - } else if (__Pyx_AsyncGen_CheckExact(self)) { -#if PY_VERSION_HEX < 0x03060000 - msg = "async generator ignored GeneratorExit - might require Python 3.6+ finalisation (PEP 525)"; -#else - msg = "async generator ignored GeneratorExit"; -#endif - #endif - } else { - msg = "generator ignored GeneratorExit"; - } - PyErr_SetString(PyExc_RuntimeError, msg); - return NULL; - } - raised_exception = PyErr_Occurred(); - if (likely(!raised_exception || __Pyx_PyErr_GivenExceptionMatches2(raised_exception, PyExc_GeneratorExit, PyExc_StopIteration))) { - if (raised_exception) PyErr_Clear(); - Py_INCREF(Py_None); - return Py_None; - } - return NULL; -} -static PyObject *__Pyx__Coroutine_Throw(PyObject *self, PyObject *typ, PyObject *val, PyObject *tb, - PyObject *args, int close_on_genexit) { - __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; - PyObject *yf = gen->yieldfrom; - if (unlikely(gen->is_running)) - return __Pyx_Coroutine_AlreadyRunningError(gen); - if (yf) { - PyObject *ret; - Py_INCREF(yf); - if (__Pyx_PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit) && close_on_genexit) { - int err = __Pyx_Coroutine_CloseIter(gen, yf); - Py_DECREF(yf); - __Pyx_Coroutine_Undelegate(gen); - if (err < 0) - return __Pyx_Coroutine_MethodReturn(self, __Pyx_Coroutine_SendEx(gen, NULL, 0)); - goto throw_here; - } - gen->is_running = 1; - if (0 - #ifdef __Pyx_Generator_USED - || __Pyx_Generator_CheckExact(yf) - #endif - #ifdef __Pyx_Coroutine_USED - || __Pyx_Coroutine_Check(yf) - #endif - ) { - ret = __Pyx__Coroutine_Throw(yf, typ, val, tb, args, close_on_genexit); - #ifdef __Pyx_Coroutine_USED - } else if (__Pyx_CoroutineAwait_CheckExact(yf)) { - ret = __Pyx__Coroutine_Throw(((__pyx_CoroutineAwaitObject*)yf)->coroutine, typ, val, tb, args, close_on_genexit); - #endif - } else { - PyObject *meth = __Pyx_PyObject_GetAttrStrNoError(yf, __pyx_n_s_throw); - if (unlikely(!meth)) { - Py_DECREF(yf); - if (unlikely(PyErr_Occurred())) { - gen->is_running = 0; - return NULL; - } - __Pyx_Coroutine_Undelegate(gen); - gen->is_running = 0; - goto throw_here; - } - if (likely(args)) { - ret = __Pyx_PyObject_Call(meth, args, NULL); - } else { - PyObject *cargs[4] = {NULL, typ, val, tb}; - ret = __Pyx_PyObject_FastCall(meth, cargs+1, 3 | __Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET); - } - Py_DECREF(meth); - } - gen->is_running = 0; - Py_DECREF(yf); - if (!ret) { - ret = __Pyx_Coroutine_FinishDelegation(gen); - } - return __Pyx_Coroutine_MethodReturn(self, ret); - } -throw_here: - __Pyx_Raise(typ, val, tb, NULL); - return __Pyx_Coroutine_MethodReturn(self, __Pyx_Coroutine_SendEx(gen, NULL, 0)); -} -static PyObject *__Pyx_Coroutine_Throw(PyObject *self, PyObject *args) { - PyObject *typ; - PyObject *val = NULL; - PyObject *tb = NULL; - if (unlikely(!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb))) - return NULL; - return __Pyx__Coroutine_Throw(self, typ, val, tb, args, 1); -} -static CYTHON_INLINE int __Pyx_Coroutine_traverse_excstate(__Pyx_ExcInfoStruct *exc_state, visitproc visit, void *arg) { -#if PY_VERSION_HEX >= 0x030B00a4 - Py_VISIT(exc_state->exc_value); -#else - Py_VISIT(exc_state->exc_type); - Py_VISIT(exc_state->exc_value); - Py_VISIT(exc_state->exc_traceback); -#endif - return 0; -} -static int __Pyx_Coroutine_traverse(__pyx_CoroutineObject *gen, visitproc visit, void *arg) { - Py_VISIT(gen->closure); - Py_VISIT(gen->classobj); - Py_VISIT(gen->yieldfrom); - return __Pyx_Coroutine_traverse_excstate(&gen->gi_exc_state, visit, arg); -} -static int __Pyx_Coroutine_clear(PyObject *self) { - __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; - Py_CLEAR(gen->closure); - Py_CLEAR(gen->classobj); - Py_CLEAR(gen->yieldfrom); - __Pyx_Coroutine_ExceptionClear(&gen->gi_exc_state); -#ifdef __Pyx_AsyncGen_USED - if (__Pyx_AsyncGen_CheckExact(self)) { - Py_CLEAR(((__pyx_PyAsyncGenObject*)gen)->ag_finalizer); - } -#endif - Py_CLEAR(gen->gi_code); - Py_CLEAR(gen->gi_frame); - Py_CLEAR(gen->gi_name); - Py_CLEAR(gen->gi_qualname); - Py_CLEAR(gen->gi_modulename); - return 0; -} -static void __Pyx_Coroutine_dealloc(PyObject *self) { - __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; - PyObject_GC_UnTrack(gen); - if (gen->gi_weakreflist != NULL) - PyObject_ClearWeakRefs(self); - if (gen->resume_label >= 0) { - PyObject_GC_Track(self); -#if PY_VERSION_HEX >= 0x030400a1 && CYTHON_USE_TP_FINALIZE - if (unlikely(PyObject_CallFinalizerFromDealloc(self))) -#else - Py_TYPE(gen)->tp_del(self); - if (unlikely(Py_REFCNT(self) > 0)) -#endif - { - return; - } - PyObject_GC_UnTrack(self); - } -#ifdef __Pyx_AsyncGen_USED - if (__Pyx_AsyncGen_CheckExact(self)) { - /* We have to handle this case for asynchronous generators - right here, because this code has to be between UNTRACK - and GC_Del. */ - Py_CLEAR(((__pyx_PyAsyncGenObject*)self)->ag_finalizer); - } -#endif - __Pyx_Coroutine_clear(self); - __Pyx_PyHeapTypeObject_GC_Del(gen); -} -static void __Pyx_Coroutine_del(PyObject *self) { - PyObject *error_type, *error_value, *error_traceback; - __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; - __Pyx_PyThreadState_declare - if (gen->resume_label < 0) { - return; - } -#if !CYTHON_USE_TP_FINALIZE - assert(self->ob_refcnt == 0); - __Pyx_SET_REFCNT(self, 1); -#endif - __Pyx_PyThreadState_assign - __Pyx_ErrFetch(&error_type, &error_value, &error_traceback); -#ifdef __Pyx_AsyncGen_USED - if (__Pyx_AsyncGen_CheckExact(self)) { - __pyx_PyAsyncGenObject *agen = (__pyx_PyAsyncGenObject*)self; - PyObject *finalizer = agen->ag_finalizer; - if (finalizer && !agen->ag_closed) { - PyObject *res = __Pyx_PyObject_CallOneArg(finalizer, self); - if (unlikely(!res)) { - PyErr_WriteUnraisable(self); - } else { - Py_DECREF(res); - } - __Pyx_ErrRestore(error_type, error_value, error_traceback); - return; - } - } -#endif - if (unlikely(gen->resume_label == 0 && !error_value)) { -#ifdef __Pyx_Coroutine_USED -#ifdef __Pyx_Generator_USED - if (!__Pyx_Generator_CheckExact(self)) -#endif - { - PyObject_GC_UnTrack(self); -#if PY_MAJOR_VERSION >= 3 || defined(PyErr_WarnFormat) - if (unlikely(PyErr_WarnFormat(PyExc_RuntimeWarning, 1, "coroutine '%.50S' was never awaited", gen->gi_qualname) < 0)) - PyErr_WriteUnraisable(self); -#else - {PyObject *msg; - char *cmsg; - #if CYTHON_COMPILING_IN_PYPY - msg = NULL; - cmsg = (char*) "coroutine was never awaited"; - #else - char *cname; - PyObject *qualname; - qualname = gen->gi_qualname; - cname = PyString_AS_STRING(qualname); - msg = PyString_FromFormat("coroutine '%.50s' was never awaited", cname); - if (unlikely(!msg)) { - PyErr_Clear(); - cmsg = (char*) "coroutine was never awaited"; - } else { - cmsg = PyString_AS_STRING(msg); - } - #endif - if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, cmsg, 1) < 0)) - PyErr_WriteUnraisable(self); - Py_XDECREF(msg);} -#endif - PyObject_GC_Track(self); - } -#endif - } else { - PyObject *res = __Pyx_Coroutine_Close(self); - if (unlikely(!res)) { - if (PyErr_Occurred()) - PyErr_WriteUnraisable(self); - } else { - Py_DECREF(res); - } - } - __Pyx_ErrRestore(error_type, error_value, error_traceback); -#if !CYTHON_USE_TP_FINALIZE - assert(Py_REFCNT(self) > 0); - if (likely(--self->ob_refcnt == 0)) { - return; - } - { - Py_ssize_t refcnt = Py_REFCNT(self); - _Py_NewReference(self); - __Pyx_SET_REFCNT(self, refcnt); - } -#if CYTHON_COMPILING_IN_CPYTHON - assert(PyType_IS_GC(Py_TYPE(self)) && - _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED); - _Py_DEC_REFTOTAL; -#endif -#ifdef COUNT_ALLOCS - --Py_TYPE(self)->tp_frees; - --Py_TYPE(self)->tp_allocs; -#endif -#endif -} -static PyObject * -__Pyx_Coroutine_get_name(__pyx_CoroutineObject *self, void *context) -{ - PyObject *name = self->gi_name; - CYTHON_UNUSED_VAR(context); - if (unlikely(!name)) name = Py_None; - Py_INCREF(name); - return name; -} -static int -__Pyx_Coroutine_set_name(__pyx_CoroutineObject *self, PyObject *value, void *context) -{ - CYTHON_UNUSED_VAR(context); -#if PY_MAJOR_VERSION >= 3 - if (unlikely(value == NULL || !PyUnicode_Check(value))) -#else - if (unlikely(value == NULL || !PyString_Check(value))) -#endif - { - PyErr_SetString(PyExc_TypeError, - "__name__ must be set to a string object"); - return -1; - } - Py_INCREF(value); - __Pyx_Py_XDECREF_SET(self->gi_name, value); - return 0; -} -static PyObject * -__Pyx_Coroutine_get_qualname(__pyx_CoroutineObject *self, void *context) -{ - PyObject *name = self->gi_qualname; - CYTHON_UNUSED_VAR(context); - if (unlikely(!name)) name = Py_None; - Py_INCREF(name); - return name; -} -static int -__Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value, void *context) -{ - CYTHON_UNUSED_VAR(context); -#if PY_MAJOR_VERSION >= 3 - if (unlikely(value == NULL || !PyUnicode_Check(value))) -#else - if (unlikely(value == NULL || !PyString_Check(value))) -#endif - { - PyErr_SetString(PyExc_TypeError, - "__qualname__ must be set to a string object"); - return -1; - } - Py_INCREF(value); - __Pyx_Py_XDECREF_SET(self->gi_qualname, value); - return 0; -} -static PyObject * -__Pyx_Coroutine_get_frame(__pyx_CoroutineObject *self, void *context) -{ - PyObject *frame = self->gi_frame; - CYTHON_UNUSED_VAR(context); - if (!frame) { - if (unlikely(!self->gi_code)) { - Py_RETURN_NONE; - } - frame = (PyObject *) PyFrame_New( - PyThreadState_Get(), /*PyThreadState *tstate,*/ - (PyCodeObject*) self->gi_code, /*PyCodeObject *code,*/ - __pyx_d, /*PyObject *globals,*/ - 0 /*PyObject *locals*/ - ); - if (unlikely(!frame)) - return NULL; - self->gi_frame = frame; - } - Py_INCREF(frame); - return frame; -} -static __pyx_CoroutineObject *__Pyx__Coroutine_New( - PyTypeObject* type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, - PyObject *name, PyObject *qualname, PyObject *module_name) { - __pyx_CoroutineObject *gen = PyObject_GC_New(__pyx_CoroutineObject, type); - if (unlikely(!gen)) - return NULL; - return __Pyx__Coroutine_NewInit(gen, body, code, closure, name, qualname, module_name); -} -static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit( - __pyx_CoroutineObject *gen, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, - PyObject *name, PyObject *qualname, PyObject *module_name) { - gen->body = body; - gen->closure = closure; - Py_XINCREF(closure); - gen->is_running = 0; - gen->resume_label = 0; - gen->classobj = NULL; - gen->yieldfrom = NULL; - #if PY_VERSION_HEX >= 0x030B00a4 - gen->gi_exc_state.exc_value = NULL; - #else - gen->gi_exc_state.exc_type = NULL; - gen->gi_exc_state.exc_value = NULL; - gen->gi_exc_state.exc_traceback = NULL; - #endif -#if CYTHON_USE_EXC_INFO_STACK - gen->gi_exc_state.previous_item = NULL; -#endif - gen->gi_weakreflist = NULL; - Py_XINCREF(qualname); - gen->gi_qualname = qualname; - Py_XINCREF(name); - gen->gi_name = name; - Py_XINCREF(module_name); - gen->gi_modulename = module_name; - Py_XINCREF(code); - gen->gi_code = code; - gen->gi_frame = NULL; - PyObject_GC_Track(gen); - return gen; -} - -/* PatchModuleWithCoroutine */ -static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code) { -#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) - int result; - PyObject *globals, *result_obj; - globals = PyDict_New(); if (unlikely(!globals)) goto ignore; - result = PyDict_SetItemString(globals, "_cython_coroutine_type", - #ifdef __Pyx_Coroutine_USED - (PyObject*)__pyx_CoroutineType); - #else - Py_None); - #endif - if (unlikely(result < 0)) goto ignore; - result = PyDict_SetItemString(globals, "_cython_generator_type", - #ifdef __Pyx_Generator_USED - (PyObject*)__pyx_GeneratorType); - #else - Py_None); - #endif - if (unlikely(result < 0)) goto ignore; - if (unlikely(PyDict_SetItemString(globals, "_module", module) < 0)) goto ignore; - if (unlikely(PyDict_SetItemString(globals, "__builtins__", __pyx_b) < 0)) goto ignore; - result_obj = PyRun_String(py_code, Py_file_input, globals, globals); - if (unlikely(!result_obj)) goto ignore; - Py_DECREF(result_obj); - Py_DECREF(globals); - return module; -ignore: - Py_XDECREF(globals); - PyErr_WriteUnraisable(module); - if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, "Cython module failed to patch module with custom type", 1) < 0)) { - Py_DECREF(module); - module = NULL; - } -#else - py_code++; -#endif - return module; -} - -/* PatchGeneratorABC */ -#ifndef CYTHON_REGISTER_ABCS -#define CYTHON_REGISTER_ABCS 1 -#endif -#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) -static PyObject* __Pyx_patch_abc_module(PyObject *module); -static PyObject* __Pyx_patch_abc_module(PyObject *module) { - module = __Pyx_Coroutine_patch_module( - module, "" -"if _cython_generator_type is not None:\n" -" try: Generator = _module.Generator\n" -" except AttributeError: pass\n" -" else: Generator.register(_cython_generator_type)\n" -"if _cython_coroutine_type is not None:\n" -" try: Coroutine = _module.Coroutine\n" -" except AttributeError: pass\n" -" else: Coroutine.register(_cython_coroutine_type)\n" - ); - return module; -} -#endif -static int __Pyx_patch_abc(void) { -#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) - static int abc_patched = 0; - if (CYTHON_REGISTER_ABCS && !abc_patched) { - PyObject *module; - module = PyImport_ImportModule((PY_MAJOR_VERSION >= 3) ? "collections.abc" : "collections"); - if (unlikely(!module)) { - PyErr_WriteUnraisable(NULL); - if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, - ((PY_MAJOR_VERSION >= 3) ? - "Cython module failed to register with collections.abc module" : - "Cython module failed to register with collections module"), 1) < 0)) { - return -1; - } - } else { - module = __Pyx_patch_abc_module(module); - abc_patched = 1; - if (unlikely(!module)) - return -1; - Py_DECREF(module); - } - module = PyImport_ImportModule("backports_abc"); - if (module) { - module = __Pyx_patch_abc_module(module); - Py_XDECREF(module); - } - if (!module) { - PyErr_Clear(); - } - } -#else - if ((0)) __Pyx_Coroutine_patch_module(NULL, NULL); -#endif - return 0; -} - -/* Generator */ -static PyMethodDef __pyx_Generator_methods[] = { - {"send", (PyCFunction) __Pyx_Coroutine_Send, METH_O, - (char*) PyDoc_STR("send(arg) -> send 'arg' into generator,\nreturn next yielded value or raise StopIteration.")}, - {"throw", (PyCFunction) __Pyx_Coroutine_Throw, METH_VARARGS, - (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in generator,\nreturn next yielded value or raise StopIteration.")}, - {"close", (PyCFunction) __Pyx_Coroutine_Close_Method, METH_NOARGS, - (char*) PyDoc_STR("close() -> raise GeneratorExit inside generator.")}, - {0, 0, 0, 0} -}; -static PyMemberDef __pyx_Generator_memberlist[] = { - {(char *) "gi_running", T_BOOL, offsetof(__pyx_CoroutineObject, is_running), READONLY, NULL}, - {(char*) "gi_yieldfrom", T_OBJECT, offsetof(__pyx_CoroutineObject, yieldfrom), READONLY, - (char*) PyDoc_STR("object being iterated by 'yield from', or None")}, - {(char*) "gi_code", T_OBJECT, offsetof(__pyx_CoroutineObject, gi_code), READONLY, NULL}, - {(char *) "__module__", T_OBJECT, offsetof(__pyx_CoroutineObject, gi_modulename), 0, 0}, -#if CYTHON_USE_TYPE_SPECS - {(char *) "__weaklistoffset__", T_PYSSIZET, offsetof(__pyx_CoroutineObject, gi_weakreflist), READONLY, 0}, -#endif - {0, 0, 0, 0, 0} -}; -static PyGetSetDef __pyx_Generator_getsets[] = { - {(char *) "__name__", (getter)__Pyx_Coroutine_get_name, (setter)__Pyx_Coroutine_set_name, - (char*) PyDoc_STR("name of the generator"), 0}, - {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname, - (char*) PyDoc_STR("qualified name of the generator"), 0}, - {(char *) "gi_frame", (getter)__Pyx_Coroutine_get_frame, NULL, - (char*) PyDoc_STR("Frame of the generator"), 0}, - {0, 0, 0, 0, 0} -}; -#if CYTHON_USE_TYPE_SPECS -static PyType_Slot __pyx_GeneratorType_slots[] = { - {Py_tp_dealloc, (void *)__Pyx_Coroutine_dealloc}, - {Py_tp_traverse, (void *)__Pyx_Coroutine_traverse}, - {Py_tp_iter, (void *)PyObject_SelfIter}, - {Py_tp_iternext, (void *)__Pyx_Generator_Next}, - {Py_tp_methods, (void *)__pyx_Generator_methods}, - {Py_tp_members, (void *)__pyx_Generator_memberlist}, - {Py_tp_getset, (void *)__pyx_Generator_getsets}, - {Py_tp_getattro, (void *) __Pyx_PyObject_GenericGetAttrNoDict}, -#if CYTHON_USE_TP_FINALIZE - {Py_tp_finalize, (void *)__Pyx_Coroutine_del}, -#endif - {0, 0}, -}; -static PyType_Spec __pyx_GeneratorType_spec = { - __PYX_TYPE_MODULE_PREFIX "generator", - sizeof(__pyx_CoroutineObject), - 0, - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, - __pyx_GeneratorType_slots -}; -#else -static PyTypeObject __pyx_GeneratorType_type = { - PyVarObject_HEAD_INIT(0, 0) - __PYX_TYPE_MODULE_PREFIX "generator", - sizeof(__pyx_CoroutineObject), - 0, - (destructor) __Pyx_Coroutine_dealloc, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, - 0, - (traverseproc) __Pyx_Coroutine_traverse, - 0, - 0, - offsetof(__pyx_CoroutineObject, gi_weakreflist), - 0, - (iternextfunc) __Pyx_Generator_Next, - __pyx_Generator_methods, - __pyx_Generator_memberlist, - __pyx_Generator_getsets, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, -#if CYTHON_USE_TP_FINALIZE - 0, -#else - __Pyx_Coroutine_del, -#endif - 0, -#if CYTHON_USE_TP_FINALIZE - __Pyx_Coroutine_del, -#elif PY_VERSION_HEX >= 0x030400a1 - 0, -#endif -#if PY_VERSION_HEX >= 0x030800b1 && (!CYTHON_COMPILING_IN_PYPY || PYPY_VERSION_NUM >= 0x07030800) - 0, -#endif -#if __PYX_NEED_TP_PRINT_SLOT - 0, -#endif -#if PY_VERSION_HEX >= 0x030C0000 - 0, -#endif -#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX >= 0x03090000 && PY_VERSION_HEX < 0x030a0000 - 0, -#endif -}; -#endif -static int __pyx_Generator_init(PyObject *module) { -#if CYTHON_USE_TYPE_SPECS - __pyx_GeneratorType = __Pyx_FetchCommonTypeFromSpec(module, &__pyx_GeneratorType_spec, NULL); -#else - CYTHON_UNUSED_VAR(module); - __pyx_GeneratorType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; - __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter; - __pyx_GeneratorType = __Pyx_FetchCommonType(&__pyx_GeneratorType_type); -#endif - if (unlikely(!__pyx_GeneratorType)) { - return -1; - } - return 0; -} - -/* CheckBinaryVersion */ -static unsigned long __Pyx_get_runtime_version(void) { -#if __PYX_LIMITED_VERSION_HEX >= 0x030B00A4 - return Py_Version & ~0xFFUL; -#else - const char* rt_version = Py_GetVersion(); - unsigned long version = 0; - unsigned long factor = 0x01000000UL; - unsigned int digit = 0; - int i = 0; - while (factor) { - while ('0' <= rt_version[i] && rt_version[i] <= '9') { - digit = digit * 10 + (unsigned int) (rt_version[i] - '0'); - ++i; - } - version += factor * digit; - if (rt_version[i] != '.') - break; - digit = 0; - factor >>= 8; - ++i; - } - return version; -#endif -} -static int __Pyx_check_binary_version(unsigned long ct_version, unsigned long rt_version, int allow_newer) { - const unsigned long MAJOR_MINOR = 0xFFFF0000UL; - if ((rt_version & MAJOR_MINOR) == (ct_version & MAJOR_MINOR)) - return 0; - if (likely(allow_newer && (rt_version & MAJOR_MINOR) > (ct_version & MAJOR_MINOR))) - return 1; - { - char message[200]; - PyOS_snprintf(message, sizeof(message), - "compile time Python version %d.%d " - "of module '%.100s' " - "%s " - "runtime version %d.%d", - (int) (ct_version >> 24), (int) ((ct_version >> 16) & 0xFF), - __Pyx_MODULE_NAME, - (allow_newer) ? "was newer than" : "does not match", - (int) (rt_version >> 24), (int) ((rt_version >> 16) & 0xFF) - ); - return PyErr_WarnEx(NULL, message, 1); - } -} - -/* InitStrings */ -#if PY_MAJOR_VERSION >= 3 -static int __Pyx_InitString(__Pyx_StringTabEntry t, PyObject **str) { - if (t.is_unicode | t.is_str) { - if (t.intern) { - *str = PyUnicode_InternFromString(t.s); - } else if (t.encoding) { - *str = PyUnicode_Decode(t.s, t.n - 1, t.encoding, NULL); - } else { - *str = PyUnicode_FromStringAndSize(t.s, t.n - 1); - } - } else { - *str = PyBytes_FromStringAndSize(t.s, t.n - 1); - } - if (!*str) - return -1; - if (PyObject_Hash(*str) == -1) - return -1; - return 0; -} -#endif -static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { - while (t->p) { - #if PY_MAJOR_VERSION >= 3 - __Pyx_InitString(*t, t->p); - #else - if (t->is_unicode) { - *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); - } else if (t->intern) { - *t->p = PyString_InternFromString(t->s); - } else { - *t->p = PyString_FromStringAndSize(t->s, t->n - 1); - } - if (!*t->p) - return -1; - if (PyObject_Hash(*t->p) == -1) - return -1; - #endif - ++t; - } - return 0; -} - -#include -static CYTHON_INLINE Py_ssize_t __Pyx_ssize_strlen(const char *s) { - size_t len = strlen(s); - if (unlikely(len > (size_t) PY_SSIZE_T_MAX)) { - PyErr_SetString(PyExc_OverflowError, "byte string is too long"); - return -1; - } - return (Py_ssize_t) len; -} -static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { - Py_ssize_t len = __Pyx_ssize_strlen(c_str); - if (unlikely(len < 0)) return NULL; - return __Pyx_PyUnicode_FromStringAndSize(c_str, len); -} -static CYTHON_INLINE PyObject* __Pyx_PyByteArray_FromString(const char* c_str) { - Py_ssize_t len = __Pyx_ssize_strlen(c_str); - if (unlikely(len < 0)) return NULL; - return PyByteArray_FromStringAndSize(c_str, len); -} -static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { - Py_ssize_t ignore; - return __Pyx_PyObject_AsStringAndSize(o, &ignore); -} -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -#if !CYTHON_PEP393_ENABLED -static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { - char* defenc_c; - PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); - if (!defenc) return NULL; - defenc_c = PyBytes_AS_STRING(defenc); -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - { - char* end = defenc_c + PyBytes_GET_SIZE(defenc); - char* c; - for (c = defenc_c; c < end; c++) { - if ((unsigned char) (*c) >= 128) { - PyUnicode_AsASCIIString(o); - return NULL; - } - } - } -#endif - *length = PyBytes_GET_SIZE(defenc); - return defenc_c; -} -#else -static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { - if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - if (likely(PyUnicode_IS_ASCII(o))) { - *length = PyUnicode_GET_LENGTH(o); - return PyUnicode_AsUTF8(o); - } else { - PyUnicode_AsASCIIString(o); - return NULL; - } -#else - return PyUnicode_AsUTF8AndSize(o, length); -#endif -} -#endif -#endif -static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { -#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT - if ( -#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII - __Pyx_sys_getdefaultencoding_not_ascii && -#endif - PyUnicode_Check(o)) { - return __Pyx_PyUnicode_AsStringAndSize(o, length); - } else -#endif -#if (!CYTHON_COMPILING_IN_PYPY && !CYTHON_COMPILING_IN_LIMITED_API) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) - if (PyByteArray_Check(o)) { - *length = PyByteArray_GET_SIZE(o); - return PyByteArray_AS_STRING(o); - } else -#endif - { - char* result; - int r = PyBytes_AsStringAndSize(o, &result, length); - if (unlikely(r < 0)) { - return NULL; - } else { - return result; - } - } -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { - int is_true = x == Py_True; - if (is_true | (x == Py_False) | (x == Py_None)) return is_true; - else return PyObject_IsTrue(x); -} -static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { - int retval; - if (unlikely(!x)) return -1; - retval = __Pyx_PyObject_IsTrue(x); - Py_DECREF(x); - return retval; -} -static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { - __Pyx_TypeName result_type_name = __Pyx_PyType_GetName(Py_TYPE(result)); -#if PY_MAJOR_VERSION >= 3 - if (PyLong_Check(result)) { - if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, - "__int__ returned non-int (type " __Pyx_FMT_TYPENAME "). " - "The ability to return an instance of a strict subclass of int is deprecated, " - "and may be removed in a future version of Python.", - result_type_name)) { - __Pyx_DECREF_TypeName(result_type_name); - Py_DECREF(result); - return NULL; - } - __Pyx_DECREF_TypeName(result_type_name); - return result; - } -#endif - PyErr_Format(PyExc_TypeError, - "__%.4s__ returned non-%.4s (type " __Pyx_FMT_TYPENAME ")", - type_name, type_name, result_type_name); - __Pyx_DECREF_TypeName(result_type_name); - Py_DECREF(result); - return NULL; -} -static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { -#if CYTHON_USE_TYPE_SLOTS - PyNumberMethods *m; -#endif - const char *name = NULL; - PyObject *res = NULL; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_Check(x) || PyLong_Check(x))) -#else - if (likely(PyLong_Check(x))) -#endif - return __Pyx_NewRef(x); -#if CYTHON_USE_TYPE_SLOTS - m = Py_TYPE(x)->tp_as_number; - #if PY_MAJOR_VERSION < 3 - if (m && m->nb_int) { - name = "int"; - res = m->nb_int(x); - } - else if (m && m->nb_long) { - name = "long"; - res = m->nb_long(x); - } - #else - if (likely(m && m->nb_int)) { - name = "int"; - res = m->nb_int(x); - } - #endif -#else - if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { - res = PyNumber_Int(x); - } -#endif - if (likely(res)) { -#if PY_MAJOR_VERSION < 3 - if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { -#else - if (unlikely(!PyLong_CheckExact(res))) { -#endif - return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); - } - } - else if (!PyErr_Occurred()) { - PyErr_SetString(PyExc_TypeError, - "an integer is required"); - } - return res; -} -static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { - Py_ssize_t ival; - PyObject *x; -#if PY_MAJOR_VERSION < 3 - if (likely(PyInt_CheckExact(b))) { - if (sizeof(Py_ssize_t) >= sizeof(long)) - return PyInt_AS_LONG(b); - else - return PyInt_AsSsize_t(b); - } -#endif - if (likely(PyLong_CheckExact(b))) { - #if CYTHON_USE_PYLONG_INTERNALS - if (likely(__Pyx_PyLong_IsCompact(b))) { - return __Pyx_PyLong_CompactValue(b); - } else { - const digit* digits = __Pyx_PyLong_Digits(b); - const Py_ssize_t size = __Pyx_PyLong_SignedDigitCount(b); - switch (size) { - case 2: - if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { - return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -2: - if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case 3: - if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { - return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -3: - if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case 4: - if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { - return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - case -4: - if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { - return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); - } - break; - } - } - #endif - return PyLong_AsSsize_t(b); - } - x = PyNumber_Index(b); - if (!x) return -1; - ival = PyInt_AsSsize_t(x); - Py_DECREF(x); - return ival; -} -static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject* o) { - if (sizeof(Py_hash_t) == sizeof(Py_ssize_t)) { - return (Py_hash_t) __Pyx_PyIndex_AsSsize_t(o); -#if PY_MAJOR_VERSION < 3 - } else if (likely(PyInt_CheckExact(o))) { - return PyInt_AS_LONG(o); -#endif - } else { - Py_ssize_t ival; - PyObject *x; - x = PyNumber_Index(o); - if (!x) return -1; - ival = PyInt_AsLong(x); - Py_DECREF(x); - return ival; - } -} -static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { - return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); -} -static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { - return PyInt_FromSize_t(ival); -} - - -/* #### Code section: utility_code_pragmas_end ### */ -#ifdef _MSC_VER -#pragma warning( pop ) -#endif - - - -/* #### Code section: end ### */ -#endif /* Py_PYTHON_H */ diff --git a/.venv/Lib/site-packages/fontTools/cu2qu/cu2qu.cp311-win_amd64.pyd b/.venv/Lib/site-packages/fontTools/cu2qu/cu2qu.cp311-win_amd64.pyd deleted file mode 100644 index 6f53875c66f5b9fd663d3aa296fdf038bb1cb2dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104448 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 bM`NSAM+Zg+M-PsUjgF5_j8ee=qrd+KM#7iT diff --git a/.venv/Lib/site-packages/fontTools/cu2qu/cu2qu.py b/.venv/Lib/site-packages/fontTools/cu2qu/cu2qu.py deleted file mode 100644 index e620b48..0000000 --- a/.venv/Lib/site-packages/fontTools/cu2qu/cu2qu.py +++ /dev/null @@ -1,534 +0,0 @@ -# cython: language_level=3 -# distutils: define_macros=CYTHON_TRACE_NOGIL=1 - -# Copyright 2015 Google Inc. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -try: - import cython - - COMPILED = cython.compiled -except (AttributeError, ImportError): - # if cython not installed, use mock module with no-op decorators and types - from fontTools.misc import cython - - COMPILED = False - -import math - -from .errors import Error as Cu2QuError, ApproxNotFoundError - - -__all__ = ["curve_to_quadratic", "curves_to_quadratic"] - -MAX_N = 100 - -NAN = float("NaN") - - -@cython.cfunc -@cython.inline -@cython.returns(cython.double) -@cython.locals(v1=cython.complex, v2=cython.complex) -def dot(v1, v2): - """Return the dot product of two vectors. - - Args: - v1 (complex): First vector. - v2 (complex): Second vector. - - Returns: - double: Dot product. - """ - return (v1 * v2.conjugate()).real - - -@cython.cfunc -@cython.inline -@cython.locals(a=cython.complex, b=cython.complex, c=cython.complex, d=cython.complex) -@cython.locals( - _1=cython.complex, _2=cython.complex, _3=cython.complex, _4=cython.complex -) -def calc_cubic_points(a, b, c, d): - _1 = d - _2 = (c / 3.0) + d - _3 = (b + c) / 3.0 + _2 - _4 = a + d + c + b - return _1, _2, _3, _4 - - -@cython.cfunc -@cython.inline -@cython.locals( - p0=cython.complex, p1=cython.complex, p2=cython.complex, p3=cython.complex -) -@cython.locals(a=cython.complex, b=cython.complex, c=cython.complex, d=cython.complex) -def calc_cubic_parameters(p0, p1, p2, p3): - c = (p1 - p0) * 3.0 - b = (p2 - p1) * 3.0 - c - d = p0 - a = p3 - d - c - b - return a, b, c, d - - -@cython.cfunc -@cython.inline -@cython.locals( - p0=cython.complex, p1=cython.complex, p2=cython.complex, p3=cython.complex -) -def split_cubic_into_n_iter(p0, p1, p2, p3, n): - """Split a cubic Bezier into n equal parts. - - Splits the curve into `n` equal parts by curve time. - (t=0..1/n, t=1/n..2/n, ...) - - Args: - p0 (complex): Start point of curve. - p1 (complex): First handle of curve. - p2 (complex): Second handle of curve. - p3 (complex): End point of curve. - - Returns: - An iterator yielding the control points (four complex values) of the - subcurves. - """ - # Hand-coded special-cases - if n == 2: - return iter(split_cubic_into_two(p0, p1, p2, p3)) - if n == 3: - return iter(split_cubic_into_three(p0, p1, p2, p3)) - if n == 4: - a, b = split_cubic_into_two(p0, p1, p2, p3) - return iter( - split_cubic_into_two(a[0], a[1], a[2], a[3]) - + split_cubic_into_two(b[0], b[1], b[2], b[3]) - ) - if n == 6: - a, b = split_cubic_into_two(p0, p1, p2, p3) - return iter( - split_cubic_into_three(a[0], a[1], a[2], a[3]) - + split_cubic_into_three(b[0], b[1], b[2], b[3]) - ) - - return _split_cubic_into_n_gen(p0, p1, p2, p3, n) - - -@cython.locals( - p0=cython.complex, - p1=cython.complex, - p2=cython.complex, - p3=cython.complex, - n=cython.int, -) -@cython.locals(a=cython.complex, b=cython.complex, c=cython.complex, d=cython.complex) -@cython.locals( - dt=cython.double, delta_2=cython.double, delta_3=cython.double, i=cython.int -) -@cython.locals( - a1=cython.complex, b1=cython.complex, c1=cython.complex, d1=cython.complex -) -def _split_cubic_into_n_gen(p0, p1, p2, p3, n): - a, b, c, d = calc_cubic_parameters(p0, p1, p2, p3) - dt = 1 / n - delta_2 = dt * dt - delta_3 = dt * delta_2 - for i in range(n): - t1 = i * dt - t1_2 = t1 * t1 - # calc new a, b, c and d - a1 = a * delta_3 - b1 = (3 * a * t1 + b) * delta_2 - c1 = (2 * b * t1 + c + 3 * a * t1_2) * dt - d1 = a * t1 * t1_2 + b * t1_2 + c * t1 + d - yield calc_cubic_points(a1, b1, c1, d1) - - -@cython.cfunc -@cython.inline -@cython.locals( - p0=cython.complex, p1=cython.complex, p2=cython.complex, p3=cython.complex -) -@cython.locals(mid=cython.complex, deriv3=cython.complex) -def split_cubic_into_two(p0, p1, p2, p3): - """Split a cubic Bezier into two equal parts. - - Splits the curve into two equal parts at t = 0.5 - - Args: - p0 (complex): Start point of curve. - p1 (complex): First handle of curve. - p2 (complex): Second handle of curve. - p3 (complex): End point of curve. - - Returns: - tuple: Two cubic Beziers (each expressed as a tuple of four complex - values). - """ - mid = (p0 + 3 * (p1 + p2) + p3) * 0.125 - deriv3 = (p3 + p2 - p1 - p0) * 0.125 - return ( - (p0, (p0 + p1) * 0.5, mid - deriv3, mid), - (mid, mid + deriv3, (p2 + p3) * 0.5, p3), - ) - - -@cython.cfunc -@cython.inline -@cython.locals( - p0=cython.complex, - p1=cython.complex, - p2=cython.complex, - p3=cython.complex, -) -@cython.locals( - mid1=cython.complex, - deriv1=cython.complex, - mid2=cython.complex, - deriv2=cython.complex, -) -def split_cubic_into_three(p0, p1, p2, p3): - """Split a cubic Bezier into three equal parts. - - Splits the curve into three equal parts at t = 1/3 and t = 2/3 - - Args: - p0 (complex): Start point of curve. - p1 (complex): First handle of curve. - p2 (complex): Second handle of curve. - p3 (complex): End point of curve. - - Returns: - tuple: Three cubic Beziers (each expressed as a tuple of four complex - values). - """ - mid1 = (8 * p0 + 12 * p1 + 6 * p2 + p3) * (1 / 27) - deriv1 = (p3 + 3 * p2 - 4 * p0) * (1 / 27) - mid2 = (p0 + 6 * p1 + 12 * p2 + 8 * p3) * (1 / 27) - deriv2 = (4 * p3 - 3 * p1 - p0) * (1 / 27) - return ( - (p0, (2 * p0 + p1) / 3.0, mid1 - deriv1, mid1), - (mid1, mid1 + deriv1, mid2 - deriv2, mid2), - (mid2, mid2 + deriv2, (p2 + 2 * p3) / 3.0, p3), - ) - - -@cython.cfunc -@cython.inline -@cython.returns(cython.complex) -@cython.locals( - t=cython.double, - p0=cython.complex, - p1=cython.complex, - p2=cython.complex, - p3=cython.complex, -) -@cython.locals(_p1=cython.complex, _p2=cython.complex) -def cubic_approx_control(t, p0, p1, p2, p3): - """Approximate a cubic Bezier using a quadratic one. - - Args: - t (double): Position of control point. - p0 (complex): Start point of curve. - p1 (complex): First handle of curve. - p2 (complex): Second handle of curve. - p3 (complex): End point of curve. - - Returns: - complex: Location of candidate control point on quadratic curve. - """ - _p1 = p0 + (p1 - p0) * 1.5 - _p2 = p3 + (p2 - p3) * 1.5 - return _p1 + (_p2 - _p1) * t - - -@cython.cfunc -@cython.inline -@cython.returns(cython.complex) -@cython.locals(a=cython.complex, b=cython.complex, c=cython.complex, d=cython.complex) -@cython.locals(ab=cython.complex, cd=cython.complex, p=cython.complex, h=cython.double) -def calc_intersect(a, b, c, d): - """Calculate the intersection of two lines. - - Args: - a (complex): Start point of first line. - b (complex): End point of first line. - c (complex): Start point of second line. - d (complex): End point of second line. - - Returns: - complex: Location of intersection if one present, ``complex(NaN,NaN)`` - if no intersection was found. - """ - ab = b - a - cd = d - c - p = ab * 1j - try: - h = dot(p, a - c) / dot(p, cd) - except ZeroDivisionError: - return complex(NAN, NAN) - return c + cd * h - - -@cython.cfunc -@cython.returns(cython.int) -@cython.locals( - tolerance=cython.double, - p0=cython.complex, - p1=cython.complex, - p2=cython.complex, - p3=cython.complex, -) -@cython.locals(mid=cython.complex, deriv3=cython.complex) -def cubic_farthest_fit_inside(p0, p1, p2, p3, tolerance): - """Check if a cubic Bezier lies within a given distance of the origin. - - "Origin" means *the* origin (0,0), not the start of the curve. Note that no - checks are made on the start and end positions of the curve; this function - only checks the inside of the curve. - - Args: - p0 (complex): Start point of curve. - p1 (complex): First handle of curve. - p2 (complex): Second handle of curve. - p3 (complex): End point of curve. - tolerance (double): Distance from origin. - - Returns: - bool: True if the cubic Bezier ``p`` entirely lies within a distance - ``tolerance`` of the origin, False otherwise. - """ - # First check p2 then p1, as p2 has higher error early on. - if abs(p2) <= tolerance and abs(p1) <= tolerance: - return True - - # Split. - mid = (p0 + 3 * (p1 + p2) + p3) * 0.125 - if abs(mid) > tolerance: - return False - deriv3 = (p3 + p2 - p1 - p0) * 0.125 - return cubic_farthest_fit_inside( - p0, (p0 + p1) * 0.5, mid - deriv3, mid, tolerance - ) and cubic_farthest_fit_inside(mid, mid + deriv3, (p2 + p3) * 0.5, p3, tolerance) - - -@cython.cfunc -@cython.inline -@cython.locals(tolerance=cython.double) -@cython.locals( - q1=cython.complex, - c0=cython.complex, - c1=cython.complex, - c2=cython.complex, - c3=cython.complex, -) -def cubic_approx_quadratic(cubic, tolerance): - """Approximate a cubic Bezier with a single quadratic within a given tolerance. - - Args: - cubic (sequence): Four complex numbers representing control points of - the cubic Bezier curve. - tolerance (double): Permitted deviation from the original curve. - - Returns: - Three complex numbers representing control points of the quadratic - curve if it fits within the given tolerance, or ``None`` if no suitable - curve could be calculated. - """ - - q1 = calc_intersect(cubic[0], cubic[1], cubic[2], cubic[3]) - if math.isnan(q1.imag): - return None - c0 = cubic[0] - c3 = cubic[3] - c1 = c0 + (q1 - c0) * (2 / 3) - c2 = c3 + (q1 - c3) * (2 / 3) - if not cubic_farthest_fit_inside(0, c1 - cubic[1], c2 - cubic[2], 0, tolerance): - return None - return c0, q1, c3 - - -@cython.cfunc -@cython.locals(n=cython.int, tolerance=cython.double) -@cython.locals(i=cython.int) -@cython.locals(all_quadratic=cython.int) -@cython.locals( - c0=cython.complex, c1=cython.complex, c2=cython.complex, c3=cython.complex -) -@cython.locals( - q0=cython.complex, - q1=cython.complex, - next_q1=cython.complex, - q2=cython.complex, - d1=cython.complex, -) -def cubic_approx_spline(cubic, n, tolerance, all_quadratic): - """Approximate a cubic Bezier curve with a spline of n quadratics. - - Args: - cubic (sequence): Four complex numbers representing control points of - the cubic Bezier curve. - n (int): Number of quadratic Bezier curves in the spline. - tolerance (double): Permitted deviation from the original curve. - - Returns: - A list of ``n+2`` complex numbers, representing control points of the - quadratic spline if it fits within the given tolerance, or ``None`` if - no suitable spline could be calculated. - """ - - if n == 1: - return cubic_approx_quadratic(cubic, tolerance) - if n == 2 and all_quadratic == False: - return cubic - - cubics = split_cubic_into_n_iter(cubic[0], cubic[1], cubic[2], cubic[3], n) - - # calculate the spline of quadratics and check errors at the same time. - next_cubic = next(cubics) - next_q1 = cubic_approx_control( - 0, next_cubic[0], next_cubic[1], next_cubic[2], next_cubic[3] - ) - q2 = cubic[0] - d1 = 0j - spline = [cubic[0], next_q1] - for i in range(1, n + 1): - # Current cubic to convert - c0, c1, c2, c3 = next_cubic - - # Current quadratic approximation of current cubic - q0 = q2 - q1 = next_q1 - if i < n: - next_cubic = next(cubics) - next_q1 = cubic_approx_control( - i / (n - 1), next_cubic[0], next_cubic[1], next_cubic[2], next_cubic[3] - ) - spline.append(next_q1) - q2 = (q1 + next_q1) * 0.5 - else: - q2 = c3 - - # End-point deltas - d0 = d1 - d1 = q2 - c3 - - if abs(d1) > tolerance or not cubic_farthest_fit_inside( - d0, - q0 + (q1 - q0) * (2 / 3) - c1, - q2 + (q1 - q2) * (2 / 3) - c2, - d1, - tolerance, - ): - return None - spline.append(cubic[3]) - - return spline - - -@cython.locals(max_err=cython.double) -@cython.locals(n=cython.int) -@cython.locals(all_quadratic=cython.int) -def curve_to_quadratic(curve, max_err, all_quadratic=True): - """Approximate a cubic Bezier curve with a spline of n quadratics. - - Args: - cubic (sequence): Four 2D tuples representing control points of - the cubic Bezier curve. - max_err (double): Permitted deviation from the original curve. - all_quadratic (bool): If True (default) returned value is a - quadratic spline. If False, it's either a single quadratic - curve or a single cubic curve. - - Returns: - If all_quadratic is True: A list of 2D tuples, representing - control points of the quadratic spline if it fits within the - given tolerance, or ``None`` if no suitable spline could be - calculated. - - If all_quadratic is False: Either a quadratic curve (if length - of output is 3), or a cubic curve (if length of output is 4). - """ - - curve = [complex(*p) for p in curve] - - for n in range(1, MAX_N + 1): - spline = cubic_approx_spline(curve, n, max_err, all_quadratic) - if spline is not None: - # done. go home - return [(s.real, s.imag) for s in spline] - - raise ApproxNotFoundError(curve) - - -@cython.locals(l=cython.int, last_i=cython.int, i=cython.int) -@cython.locals(all_quadratic=cython.int) -def curves_to_quadratic(curves, max_errors, all_quadratic=True): - """Return quadratic Bezier splines approximating the input cubic Beziers. - - Args: - curves: A sequence of *n* curves, each curve being a sequence of four - 2D tuples. - max_errors: A sequence of *n* floats representing the maximum permissible - deviation from each of the cubic Bezier curves. - all_quadratic (bool): If True (default) returned values are a - quadratic spline. If False, they are either a single quadratic - curve or a single cubic curve. - - Example:: - - >>> curves_to_quadratic( [ - ... [ (50,50), (100,100), (150,100), (200,50) ], - ... [ (75,50), (120,100), (150,75), (200,60) ] - ... ], [1,1] ) - [[(50.0, 50.0), (75.0, 75.0), (125.0, 91.66666666666666), (175.0, 75.0), (200.0, 50.0)], [(75.0, 50.0), (97.5, 75.0), (135.41666666666666, 82.08333333333333), (175.0, 67.5), (200.0, 60.0)]] - - The returned splines have "implied oncurve points" suitable for use in - TrueType ``glif`` outlines - i.e. in the first spline returned above, - the first quadratic segment runs from (50,50) to - ( (75 + 125)/2 , (120 + 91.666..)/2 ) = (100, 83.333...). - - Returns: - If all_quadratic is True, a list of splines, each spline being a list - of 2D tuples. - - If all_quadratic is False, a list of curves, each curve being a quadratic - (length 3), or cubic (length 4). - - Raises: - fontTools.cu2qu.Errors.ApproxNotFoundError: if no suitable approximation - can be found for all curves with the given parameters. - """ - - curves = [[complex(*p) for p in curve] for curve in curves] - assert len(max_errors) == len(curves) - - l = len(curves) - splines = [None] * l - last_i = i = 0 - n = 1 - while True: - spline = cubic_approx_spline(curves[i], n, max_errors[i], all_quadratic) - if spline is None: - if n == MAX_N: - break - n += 1 - last_i = i - continue - splines[i] = spline - i = (i + 1) % l - if i == last_i: - # done. go home - return [[(s.real, s.imag) for s in spline] for spline in splines] - - raise ApproxNotFoundError(curves) diff --git a/.venv/Lib/site-packages/fontTools/cu2qu/errors.py b/.venv/Lib/site-packages/fontTools/cu2qu/errors.py deleted file mode 100644 index fa3dc42..0000000 --- a/.venv/Lib/site-packages/fontTools/cu2qu/errors.py +++ /dev/null @@ -1,77 +0,0 @@ -# Copyright 2016 Google Inc. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -class Error(Exception): - """Base Cu2Qu exception class for all other errors.""" - - -class ApproxNotFoundError(Error): - def __init__(self, curve): - message = "no approximation found: %s" % curve - super().__init__(message) - self.curve = curve - - -class UnequalZipLengthsError(Error): - pass - - -class IncompatibleGlyphsError(Error): - def __init__(self, glyphs): - assert len(glyphs) > 1 - self.glyphs = glyphs - names = set(repr(g.name) for g in glyphs) - if len(names) > 1: - self.combined_name = "{%s}" % ", ".join(sorted(names)) - else: - self.combined_name = names.pop() - - def __repr__(self): - return "<%s %s>" % (type(self).__name__, self.combined_name) - - -class IncompatibleSegmentNumberError(IncompatibleGlyphsError): - def __str__(self): - return "Glyphs named %s have different number of segments" % ( - self.combined_name - ) - - -class IncompatibleSegmentTypesError(IncompatibleGlyphsError): - def __init__(self, glyphs, segments): - IncompatibleGlyphsError.__init__(self, glyphs) - self.segments = segments - - def __str__(self): - lines = [] - ndigits = len(str(max(self.segments))) - for i, tags in sorted(self.segments.items()): - lines.append( - "%s: (%s)" % (str(i).rjust(ndigits), ", ".join(repr(t) for t in tags)) - ) - return "Glyphs named %s have incompatible segment types:\n %s" % ( - self.combined_name, - "\n ".join(lines), - ) - - -class IncompatibleFontsError(Error): - def __init__(self, glyph_errors): - self.glyph_errors = glyph_errors - - def __str__(self): - return "fonts contains incompatible glyphs: %s" % ( - ", ".join(repr(g) for g in sorted(self.glyph_errors.keys())) - ) diff --git a/.venv/Lib/site-packages/fontTools/cu2qu/ufo.py b/.venv/Lib/site-packages/fontTools/cu2qu/ufo.py deleted file mode 100644 index 7a6dbc6..0000000 --- a/.venv/Lib/site-packages/fontTools/cu2qu/ufo.py +++ /dev/null @@ -1,349 +0,0 @@ -# Copyright 2015 Google Inc. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -"""Converts cubic bezier curves to quadratic splines. - -Conversion is performed such that the quadratic splines keep the same end-curve -tangents as the original cubics. The approach is iterative, increasing the -number of segments for a spline until the error gets below a bound. - -Respective curves from multiple fonts will be converted at once to ensure that -the resulting splines are interpolation-compatible. -""" - -import logging -from fontTools.pens.basePen import AbstractPen -from fontTools.pens.pointPen import PointToSegmentPen -from fontTools.pens.reverseContourPen import ReverseContourPen - -from . import curves_to_quadratic -from .errors import ( - UnequalZipLengthsError, - IncompatibleSegmentNumberError, - IncompatibleSegmentTypesError, - IncompatibleGlyphsError, - IncompatibleFontsError, -) - - -__all__ = ["fonts_to_quadratic", "font_to_quadratic"] - -# The default approximation error below is a relative value (1/1000 of the EM square). -# Later on, we convert it to absolute font units by multiplying it by a font's UPEM -# (see fonts_to_quadratic). -DEFAULT_MAX_ERR = 0.001 -CURVE_TYPE_LIB_KEY = "com.github.googlei18n.cu2qu.curve_type" - -logger = logging.getLogger(__name__) - - -_zip = zip - - -def zip(*args): - """Ensure each argument to zip has the same length. Also make sure a list is - returned for python 2/3 compatibility. - """ - - if len(set(len(a) for a in args)) != 1: - raise UnequalZipLengthsError(*args) - return list(_zip(*args)) - - -class GetSegmentsPen(AbstractPen): - """Pen to collect segments into lists of points for conversion. - - Curves always include their initial on-curve point, so some points are - duplicated between segments. - """ - - def __init__(self): - self._last_pt = None - self.segments = [] - - def _add_segment(self, tag, *args): - if tag in ["move", "line", "qcurve", "curve"]: - self._last_pt = args[-1] - self.segments.append((tag, args)) - - def moveTo(self, pt): - self._add_segment("move", pt) - - def lineTo(self, pt): - self._add_segment("line", pt) - - def qCurveTo(self, *points): - self._add_segment("qcurve", self._last_pt, *points) - - def curveTo(self, *points): - self._add_segment("curve", self._last_pt, *points) - - def closePath(self): - self._add_segment("close") - - def endPath(self): - self._add_segment("end") - - def addComponent(self, glyphName, transformation): - pass - - -def _get_segments(glyph): - """Get a glyph's segments as extracted by GetSegmentsPen.""" - - pen = GetSegmentsPen() - # glyph.draw(pen) - # We can't simply draw the glyph with the pen, but we must initialize the - # PointToSegmentPen explicitly with outputImpliedClosingLine=True. - # By default PointToSegmentPen does not outputImpliedClosingLine -- unless - # last and first point on closed contour are duplicated. Because we are - # converting multiple glyphs at the same time, we want to make sure - # this function returns the same number of segments, whether or not - # the last and first point overlap. - # https://github.com/googlefonts/fontmake/issues/572 - # https://github.com/fonttools/fonttools/pull/1720 - pointPen = PointToSegmentPen(pen, outputImpliedClosingLine=True) - glyph.drawPoints(pointPen) - return pen.segments - - -def _set_segments(glyph, segments, reverse_direction): - """Draw segments as extracted by GetSegmentsPen back to a glyph.""" - - glyph.clearContours() - pen = glyph.getPen() - if reverse_direction: - pen = ReverseContourPen(pen) - for tag, args in segments: - if tag == "move": - pen.moveTo(*args) - elif tag == "line": - pen.lineTo(*args) - elif tag == "curve": - pen.curveTo(*args[1:]) - elif tag == "qcurve": - pen.qCurveTo(*args[1:]) - elif tag == "close": - pen.closePath() - elif tag == "end": - pen.endPath() - else: - raise AssertionError('Unhandled segment type "%s"' % tag) - - -def _segments_to_quadratic(segments, max_err, stats, all_quadratic=True): - """Return quadratic approximations of cubic segments.""" - - assert all(s[0] == "curve" for s in segments), "Non-cubic given to convert" - - new_points = curves_to_quadratic([s[1] for s in segments], max_err, all_quadratic) - n = len(new_points[0]) - assert all(len(s) == n for s in new_points[1:]), "Converted incompatibly" - - spline_length = str(n - 2) - stats[spline_length] = stats.get(spline_length, 0) + 1 - - if all_quadratic or n == 3: - return [("qcurve", p) for p in new_points] - else: - return [("curve", p) for p in new_points] - - -def _glyphs_to_quadratic(glyphs, max_err, reverse_direction, stats, all_quadratic=True): - """Do the actual conversion of a set of compatible glyphs, after arguments - have been set up. - - Return True if the glyphs were modified, else return False. - """ - - try: - segments_by_location = zip(*[_get_segments(g) for g in glyphs]) - except UnequalZipLengthsError: - raise IncompatibleSegmentNumberError(glyphs) - if not any(segments_by_location): - return False - - # always modify input glyphs if reverse_direction is True - glyphs_modified = reverse_direction - - new_segments_by_location = [] - incompatible = {} - for i, segments in enumerate(segments_by_location): - tag = segments[0][0] - if not all(s[0] == tag for s in segments[1:]): - incompatible[i] = [s[0] for s in segments] - elif tag == "curve": - new_segments = _segments_to_quadratic( - segments, max_err, stats, all_quadratic - ) - if all_quadratic or new_segments != segments: - glyphs_modified = True - segments = new_segments - new_segments_by_location.append(segments) - - if glyphs_modified: - new_segments_by_glyph = zip(*new_segments_by_location) - for glyph, new_segments in zip(glyphs, new_segments_by_glyph): - _set_segments(glyph, new_segments, reverse_direction) - - if incompatible: - raise IncompatibleSegmentTypesError(glyphs, segments=incompatible) - return glyphs_modified - - -def glyphs_to_quadratic( - glyphs, max_err=None, reverse_direction=False, stats=None, all_quadratic=True -): - """Convert the curves of a set of compatible of glyphs to quadratic. - - All curves will be converted to quadratic at once, ensuring interpolation - compatibility. If this is not required, calling glyphs_to_quadratic with one - glyph at a time may yield slightly more optimized results. - - Return True if glyphs were modified, else return False. - - Raises IncompatibleGlyphsError if glyphs have non-interpolatable outlines. - """ - if stats is None: - stats = {} - - if not max_err: - # assume 1000 is the default UPEM - max_err = DEFAULT_MAX_ERR * 1000 - - if isinstance(max_err, (list, tuple)): - max_errors = max_err - else: - max_errors = [max_err] * len(glyphs) - assert len(max_errors) == len(glyphs) - - return _glyphs_to_quadratic( - glyphs, max_errors, reverse_direction, stats, all_quadratic - ) - - -def fonts_to_quadratic( - fonts, - max_err_em=None, - max_err=None, - reverse_direction=False, - stats=None, - dump_stats=False, - remember_curve_type=True, - all_quadratic=True, -): - """Convert the curves of a collection of fonts to quadratic. - - All curves will be converted to quadratic at once, ensuring interpolation - compatibility. If this is not required, calling fonts_to_quadratic with one - font at a time may yield slightly more optimized results. - - Return the set of modified glyph names if any, else return an empty set. - - By default, cu2qu stores the curve type in the fonts' lib, under a private - key "com.github.googlei18n.cu2qu.curve_type", and will not try to convert - them again if the curve type is already set to "quadratic". - Setting 'remember_curve_type' to False disables this optimization. - - Raises IncompatibleFontsError if same-named glyphs from different fonts - have non-interpolatable outlines. - """ - - if remember_curve_type: - curve_types = {f.lib.get(CURVE_TYPE_LIB_KEY, "cubic") for f in fonts} - if len(curve_types) == 1: - curve_type = next(iter(curve_types)) - if curve_type in ("quadratic", "mixed"): - logger.info("Curves already converted to quadratic") - return False - elif curve_type == "cubic": - pass # keep converting - else: - raise NotImplementedError(curve_type) - elif len(curve_types) > 1: - # going to crash later if they do differ - logger.warning("fonts may contain different curve types") - - if stats is None: - stats = {} - - if max_err_em and max_err: - raise TypeError("Only one of max_err and max_err_em can be specified.") - if not (max_err_em or max_err): - max_err_em = DEFAULT_MAX_ERR - - if isinstance(max_err, (list, tuple)): - assert len(max_err) == len(fonts) - max_errors = max_err - elif max_err: - max_errors = [max_err] * len(fonts) - - if isinstance(max_err_em, (list, tuple)): - assert len(fonts) == len(max_err_em) - max_errors = [f.info.unitsPerEm * e for f, e in zip(fonts, max_err_em)] - elif max_err_em: - max_errors = [f.info.unitsPerEm * max_err_em for f in fonts] - - modified = set() - glyph_errors = {} - for name in set().union(*(f.keys() for f in fonts)): - glyphs = [] - cur_max_errors = [] - for font, error in zip(fonts, max_errors): - if name in font: - glyphs.append(font[name]) - cur_max_errors.append(error) - try: - if _glyphs_to_quadratic( - glyphs, cur_max_errors, reverse_direction, stats, all_quadratic - ): - modified.add(name) - except IncompatibleGlyphsError as exc: - logger.error(exc) - glyph_errors[name] = exc - - if glyph_errors: - raise IncompatibleFontsError(glyph_errors) - - if modified and dump_stats: - spline_lengths = sorted(stats.keys()) - logger.info( - "New spline lengths: %s" - % (", ".join("%s: %d" % (l, stats[l]) for l in spline_lengths)) - ) - - if remember_curve_type: - for font in fonts: - curve_type = font.lib.get(CURVE_TYPE_LIB_KEY, "cubic") - new_curve_type = "quadratic" if all_quadratic else "mixed" - if curve_type != new_curve_type: - font.lib[CURVE_TYPE_LIB_KEY] = new_curve_type - return modified - - -def glyph_to_quadratic(glyph, **kwargs): - """Convenience wrapper around glyphs_to_quadratic, for just one glyph. - Return True if the glyph was modified, else return False. - """ - - return glyphs_to_quadratic([glyph], **kwargs) - - -def font_to_quadratic(font, **kwargs): - """Convenience wrapper around fonts_to_quadratic, for just one font. - Return the set of modified glyph names if any, else return empty set. - """ - - return fonts_to_quadratic([font], **kwargs) diff --git a/.venv/Lib/site-packages/fontTools/designspaceLib/__init__.py b/.venv/Lib/site-packages/fontTools/designspaceLib/__init__.py deleted file mode 100644 index 342f1de..0000000 --- a/.venv/Lib/site-packages/fontTools/designspaceLib/__init__.py +++ /dev/null @@ -1,3337 +0,0 @@ -from __future__ import annotations - -import collections -import copy -import itertools -import math -import os -import posixpath -from io import BytesIO, StringIO -from textwrap import indent -from typing import Any, Dict, List, MutableMapping, Optional, Tuple, Union, cast - -from fontTools.misc import etree as ET -from fontTools.misc import plistlib -from fontTools.misc.loggingTools import LogMixin -from fontTools.misc.textTools import tobytes, tostr - -""" - designSpaceDocument - - - read and write designspace files -""" - -__all__ = [ - "AxisDescriptor", - "AxisLabelDescriptor", - "AxisMappingDescriptor", - "BaseDocReader", - "BaseDocWriter", - "DesignSpaceDocument", - "DesignSpaceDocumentError", - "DiscreteAxisDescriptor", - "InstanceDescriptor", - "LocationLabelDescriptor", - "RangeAxisSubsetDescriptor", - "RuleDescriptor", - "SourceDescriptor", - "ValueAxisSubsetDescriptor", - "VariableFontDescriptor", -] - -# ElementTree allows to find namespace-prefixed elements, but not attributes -# so we have to do it ourselves for 'xml:lang' -XML_NS = "{http://www.w3.org/XML/1998/namespace}" -XML_LANG = XML_NS + "lang" - - -def posix(path): - """Normalize paths using forward slash to work also on Windows.""" - new_path = posixpath.join(*path.split(os.path.sep)) - if path.startswith("/"): - # The above transformation loses absolute paths - new_path = "/" + new_path - elif path.startswith(r"\\"): - # The above transformation loses leading slashes of UNC path mounts - new_path = "//" + new_path - return new_path - - -def posixpath_property(private_name): - """Generate a propery that holds a path always using forward slashes.""" - - def getter(self): - # Normal getter - return getattr(self, private_name) - - def setter(self, value): - # The setter rewrites paths using forward slashes - if value is not None: - value = posix(value) - setattr(self, private_name, value) - - return property(getter, setter) - - -class DesignSpaceDocumentError(Exception): - def __init__(self, msg, obj=None): - self.msg = msg - self.obj = obj - - def __str__(self): - return str(self.msg) + (": %r" % self.obj if self.obj is not None else "") - - -class AsDictMixin(object): - def asdict(self): - d = {} - for attr, value in self.__dict__.items(): - if attr.startswith("_"): - continue - if hasattr(value, "asdict"): - value = value.asdict() - elif isinstance(value, list): - value = [v.asdict() if hasattr(v, "asdict") else v for v in value] - d[attr] = value - return d - - -class SimpleDescriptor(AsDictMixin): - """Containers for a bunch of attributes""" - - # XXX this is ugly. The 'print' is inappropriate here, and instead of - # assert, it should simply return True/False - def compare(self, other): - # test if this object contains the same data as the other - for attr in self._attrs: - try: - assert getattr(self, attr) == getattr(other, attr) - except AssertionError: - print( - "failed attribute", - attr, - getattr(self, attr), - "!=", - getattr(other, attr), - ) - - def __repr__(self): - attrs = [f"{a}={repr(getattr(self, a))}," for a in self._attrs] - attrs = indent("\n".join(attrs), " ") - return f"{self.__class__.__name__}(\n{attrs}\n)" - - -class SourceDescriptor(SimpleDescriptor): - """Simple container for data related to the source - - .. code:: python - - doc = DesignSpaceDocument() - s1 = SourceDescriptor() - s1.path = masterPath1 - s1.name = "master.ufo1" - s1.font = defcon.Font("master.ufo1") - s1.location = dict(weight=0) - s1.familyName = "MasterFamilyName" - s1.styleName = "MasterStyleNameOne" - s1.localisedFamilyName = dict(fr="Caractère") - s1.mutedGlyphNames.append("A") - s1.mutedGlyphNames.append("Z") - doc.addSource(s1) - - """ - - flavor = "source" - _attrs = [ - "filename", - "path", - "name", - "layerName", - "location", - "copyLib", - "copyGroups", - "copyFeatures", - "muteKerning", - "muteInfo", - "mutedGlyphNames", - "familyName", - "styleName", - "localisedFamilyName", - ] - - filename = posixpath_property("_filename") - path = posixpath_property("_path") - - def __init__( - self, - *, - filename=None, - path=None, - font=None, - name=None, - location=None, - designLocation=None, - layerName=None, - familyName=None, - styleName=None, - localisedFamilyName=None, - copyLib=False, - copyInfo=False, - copyGroups=False, - copyFeatures=False, - muteKerning=False, - muteInfo=False, - mutedGlyphNames=None, - ): - self.filename = filename - """string. A relative path to the source file, **as it is in the document**. - - MutatorMath + VarLib. - """ - self.path = path - """The absolute path, calculated from filename.""" - - self.font = font - """Any Python object. Optional. Points to a representation of this - source font that is loaded in memory, as a Python object (e.g. a - ``defcon.Font`` or a ``fontTools.ttFont.TTFont``). - - The default document reader will not fill-in this attribute, and the - default writer will not use this attribute. It is up to the user of - ``designspaceLib`` to either load the resource identified by - ``filename`` and store it in this field, or write the contents of - this field to the disk and make ```filename`` point to that. - """ - - self.name = name - """string. Optional. Unique identifier name for this source. - - MutatorMath + varLib. - """ - - self.designLocation = ( - designLocation if designLocation is not None else location or {} - ) - """dict. Axis values for this source, in design space coordinates. - - MutatorMath + varLib. - - This may be only part of the full design location. - See :meth:`getFullDesignLocation()` - - .. versionadded:: 5.0 - """ - - self.layerName = layerName - """string. The name of the layer in the source to look for - outline data. Default ``None`` which means ``foreground``. - """ - self.familyName = familyName - """string. Family name of this source. Though this data - can be extracted from the font, it can be efficient to have it right - here. - - varLib. - """ - self.styleName = styleName - """string. Style name of this source. Though this data - can be extracted from the font, it can be efficient to have it right - here. - - varLib. - """ - self.localisedFamilyName = localisedFamilyName or {} - """dict. A dictionary of localised family name strings, keyed by - language code. - - If present, will be used to build localized names for all instances. - - .. versionadded:: 5.0 - """ - - self.copyLib = copyLib - """bool. Indicates if the contents of the font.lib need to - be copied to the instances. - - MutatorMath. - - .. deprecated:: 5.0 - """ - self.copyInfo = copyInfo - """bool. Indicates if the non-interpolating font.info needs - to be copied to the instances. - - MutatorMath. - - .. deprecated:: 5.0 - """ - self.copyGroups = copyGroups - """bool. Indicates if the groups need to be copied to the - instances. - - MutatorMath. - - .. deprecated:: 5.0 - """ - self.copyFeatures = copyFeatures - """bool. Indicates if the feature text needs to be - copied to the instances. - - MutatorMath. - - .. deprecated:: 5.0 - """ - self.muteKerning = muteKerning - """bool. Indicates if the kerning data from this source - needs to be muted (i.e. not be part of the calculations). - - MutatorMath only. - """ - self.muteInfo = muteInfo - """bool. Indicated if the interpolating font.info data for - this source needs to be muted. - - MutatorMath only. - """ - self.mutedGlyphNames = mutedGlyphNames or [] - """list. Glyphnames that need to be muted in the - instances. - - MutatorMath only. - """ - - @property - def location(self): - """dict. Axis values for this source, in design space coordinates. - - MutatorMath + varLib. - - .. deprecated:: 5.0 - Use the more explicit alias for this property :attr:`designLocation`. - """ - return self.designLocation - - @location.setter - def location(self, location: Optional[SimpleLocationDict]): - self.designLocation = location or {} - - def setFamilyName(self, familyName, languageCode="en"): - """Setter for :attr:`localisedFamilyName` - - .. versionadded:: 5.0 - """ - self.localisedFamilyName[languageCode] = tostr(familyName) - - def getFamilyName(self, languageCode="en"): - """Getter for :attr:`localisedFamilyName` - - .. versionadded:: 5.0 - """ - return self.localisedFamilyName.get(languageCode) - - def getFullDesignLocation(self, doc: "DesignSpaceDocument") -> SimpleLocationDict: - """Get the complete design location of this source, from its - :attr:`designLocation` and the document's axis defaults. - - .. versionadded:: 5.0 - """ - result: SimpleLocationDict = {} - for axis in doc.axes: - if axis.name in self.designLocation: - result[axis.name] = self.designLocation[axis.name] - else: - result[axis.name] = axis.map_forward(axis.default) - return result - - -class RuleDescriptor(SimpleDescriptor): - """Represents the rule descriptor element: a set of glyph substitutions to - trigger conditionally in some parts of the designspace. - - .. code:: python - - r1 = RuleDescriptor() - r1.name = "unique.rule.name" - r1.conditionSets.append([dict(name="weight", minimum=-10, maximum=10), dict(...)]) - r1.conditionSets.append([dict(...), dict(...)]) - r1.subs.append(("a", "a.alt")) - - .. code:: xml - - - - - - - - - - - - - - """ - - _attrs = ["name", "conditionSets", "subs"] # what do we need here - - def __init__(self, *, name=None, conditionSets=None, subs=None): - self.name = name - """string. Unique name for this rule. Can be used to reference this rule data.""" - # list of lists of dict(name='aaaa', minimum=0, maximum=1000) - self.conditionSets = conditionSets or [] - """a list of conditionsets. - - - Each conditionset is a list of conditions. - - Each condition is a dict with ``name``, ``minimum`` and ``maximum`` keys. - """ - # list of substitutions stored as tuples of glyphnames ("a", "a.alt") - self.subs = subs or [] - """list of substitutions. - - - Each substitution is stored as tuples of glyphnames, e.g. ("a", "a.alt"). - - Note: By default, rules are applied first, before other text - shaping/OpenType layout, as they are part of the - `Required Variation Alternates OpenType feature `_. - See ref:`rules-element` § Attributes. - """ - - -def evaluateRule(rule, location): - """Return True if any of the rule's conditionsets matches the given location.""" - return any(evaluateConditions(c, location) for c in rule.conditionSets) - - -def evaluateConditions(conditions, location): - """Return True if all the conditions matches the given location. - - - If a condition has no minimum, check for < maximum. - - If a condition has no maximum, check for > minimum. - """ - for cd in conditions: - value = location[cd["name"]] - if cd.get("minimum") is None: - if value > cd["maximum"]: - return False - elif cd.get("maximum") is None: - if cd["minimum"] > value: - return False - elif not cd["minimum"] <= value <= cd["maximum"]: - return False - return True - - -def processRules(rules, location, glyphNames): - """Apply these rules at this location to these glyphnames. - - Return a new list of glyphNames with substitutions applied. - - - rule order matters - """ - newNames = [] - for rule in rules: - if evaluateRule(rule, location): - for name in glyphNames: - swap = False - for a, b in rule.subs: - if name == a: - swap = True - break - if swap: - newNames.append(b) - else: - newNames.append(name) - glyphNames = newNames - newNames = [] - return glyphNames - - -AnisotropicLocationDict = Dict[str, Union[float, Tuple[float, float]]] -SimpleLocationDict = Dict[str, float] - - -class AxisMappingDescriptor(SimpleDescriptor): - """Represents the axis mapping element: mapping an input location - to an output location in the designspace. - - .. code:: python - - m1 = AxisMappingDescriptor() - m1.inputLocation = {"weight": 900, "width": 150} - m1.outputLocation = {"weight": 870} - - .. code:: xml - - - - - - - - - - - - - """ - - _attrs = ["inputLocation", "outputLocation"] - - def __init__( - self, - *, - inputLocation=None, - outputLocation=None, - description=None, - groupDescription=None, - ): - self.inputLocation: SimpleLocationDict = inputLocation or {} - """dict. Axis values for the input of the mapping, in design space coordinates. - - varLib. - - .. versionadded:: 5.1 - """ - self.outputLocation: SimpleLocationDict = outputLocation or {} - """dict. Axis values for the output of the mapping, in design space coordinates. - - varLib. - - .. versionadded:: 5.1 - """ - self.description = description - """string. A description of the mapping. - - varLib. - - .. versionadded:: 5.2 - """ - self.groupDescription = groupDescription - """string. A description of the group of mappings. - - varLib. - - .. versionadded:: 5.2 - """ - - -class InstanceDescriptor(SimpleDescriptor): - """Simple container for data related to the instance - - - .. code:: python - - i2 = InstanceDescriptor() - i2.path = instancePath2 - i2.familyName = "InstanceFamilyName" - i2.styleName = "InstanceStyleName" - i2.name = "instance.ufo2" - # anisotropic location - i2.designLocation = dict(weight=500, width=(400,300)) - i2.postScriptFontName = "InstancePostscriptName" - i2.styleMapFamilyName = "InstanceStyleMapFamilyName" - i2.styleMapStyleName = "InstanceStyleMapStyleName" - i2.lib['com.coolDesignspaceApp.specimenText'] = 'Hamburgerwhatever' - doc.addInstance(i2) - """ - - flavor = "instance" - _defaultLanguageCode = "en" - _attrs = [ - "filename", - "path", - "name", - "locationLabel", - "designLocation", - "userLocation", - "familyName", - "styleName", - "postScriptFontName", - "styleMapFamilyName", - "styleMapStyleName", - "localisedFamilyName", - "localisedStyleName", - "localisedStyleMapFamilyName", - "localisedStyleMapStyleName", - "glyphs", - "kerning", - "info", - "lib", - ] - - filename = posixpath_property("_filename") - path = posixpath_property("_path") - - def __init__( - self, - *, - filename=None, - path=None, - font=None, - name=None, - location=None, - locationLabel=None, - designLocation=None, - userLocation=None, - familyName=None, - styleName=None, - postScriptFontName=None, - styleMapFamilyName=None, - styleMapStyleName=None, - localisedFamilyName=None, - localisedStyleName=None, - localisedStyleMapFamilyName=None, - localisedStyleMapStyleName=None, - glyphs=None, - kerning=True, - info=True, - lib=None, - ): - self.filename = filename - """string. Relative path to the instance file, **as it is - in the document**. The file may or may not exist. - - MutatorMath + VarLib. - """ - self.path = path - """string. Absolute path to the instance file, calculated from - the document path and the string in the filename attr. The file may - or may not exist. - - MutatorMath. - """ - self.font = font - """Same as :attr:`SourceDescriptor.font` - - .. seealso:: :attr:`SourceDescriptor.font` - """ - self.name = name - """string. Unique identifier name of the instance, used to - identify it if it needs to be referenced from elsewhere in the - document. - """ - self.locationLabel = locationLabel - """Name of a :class:`LocationLabelDescriptor`. If - provided, the instance should have the same location as the - LocationLabel. - - .. seealso:: - :meth:`getFullDesignLocation` - :meth:`getFullUserLocation` - - .. versionadded:: 5.0 - """ - self.designLocation: AnisotropicLocationDict = ( - designLocation if designLocation is not None else (location or {}) - ) - """dict. Axis values for this instance, in design space coordinates. - - MutatorMath + varLib. - - .. seealso:: This may be only part of the full location. See: - :meth:`getFullDesignLocation` - :meth:`getFullUserLocation` - - .. versionadded:: 5.0 - """ - self.userLocation: SimpleLocationDict = userLocation or {} - """dict. Axis values for this instance, in user space coordinates. - - MutatorMath + varLib. - - .. seealso:: This may be only part of the full location. See: - :meth:`getFullDesignLocation` - :meth:`getFullUserLocation` - - .. versionadded:: 5.0 - """ - self.familyName = familyName - """string. Family name of this instance. - - MutatorMath + varLib. - """ - self.styleName = styleName - """string. Style name of this instance. - - MutatorMath + varLib. - """ - self.postScriptFontName = postScriptFontName - """string. Postscript fontname for this instance. - - MutatorMath + varLib. - """ - self.styleMapFamilyName = styleMapFamilyName - """string. StyleMap familyname for this instance. - - MutatorMath + varLib. - """ - self.styleMapStyleName = styleMapStyleName - """string. StyleMap stylename for this instance. - - MutatorMath + varLib. - """ - self.localisedFamilyName = localisedFamilyName or {} - """dict. A dictionary of localised family name - strings, keyed by language code. - """ - self.localisedStyleName = localisedStyleName or {} - """dict. A dictionary of localised stylename - strings, keyed by language code. - """ - self.localisedStyleMapFamilyName = localisedStyleMapFamilyName or {} - """A dictionary of localised style map - familyname strings, keyed by language code. - """ - self.localisedStyleMapStyleName = localisedStyleMapStyleName or {} - """A dictionary of localised style map - stylename strings, keyed by language code. - """ - self.glyphs = glyphs or {} - """dict for special master definitions for glyphs. If glyphs - need special masters (to record the results of executed rules for - example). - - MutatorMath. - - .. deprecated:: 5.0 - Use rules or sparse sources instead. - """ - self.kerning = kerning - """ bool. Indicates if this instance needs its kerning - calculated. - - MutatorMath. - - .. deprecated:: 5.0 - """ - self.info = info - """bool. Indicated if this instance needs the interpolating - font.info calculated. - - .. deprecated:: 5.0 - """ - - self.lib = lib or {} - """Custom data associated with this instance.""" - - @property - def location(self): - """dict. Axis values for this instance. - - MutatorMath + varLib. - - .. deprecated:: 5.0 - Use the more explicit alias for this property :attr:`designLocation`. - """ - return self.designLocation - - @location.setter - def location(self, location: Optional[AnisotropicLocationDict]): - self.designLocation = location or {} - - def setStyleName(self, styleName, languageCode="en"): - """These methods give easier access to the localised names.""" - self.localisedStyleName[languageCode] = tostr(styleName) - - def getStyleName(self, languageCode="en"): - return self.localisedStyleName.get(languageCode) - - def setFamilyName(self, familyName, languageCode="en"): - self.localisedFamilyName[languageCode] = tostr(familyName) - - def getFamilyName(self, languageCode="en"): - return self.localisedFamilyName.get(languageCode) - - def setStyleMapStyleName(self, styleMapStyleName, languageCode="en"): - self.localisedStyleMapStyleName[languageCode] = tostr(styleMapStyleName) - - def getStyleMapStyleName(self, languageCode="en"): - return self.localisedStyleMapStyleName.get(languageCode) - - def setStyleMapFamilyName(self, styleMapFamilyName, languageCode="en"): - self.localisedStyleMapFamilyName[languageCode] = tostr(styleMapFamilyName) - - def getStyleMapFamilyName(self, languageCode="en"): - return self.localisedStyleMapFamilyName.get(languageCode) - - def clearLocation(self, axisName: Optional[str] = None): - """Clear all location-related fields. Ensures that - :attr:``designLocation`` and :attr:``userLocation`` are dictionaries - (possibly empty if clearing everything). - - In order to update the location of this instance wholesale, a user - should first clear all the fields, then change the field(s) for which - they have data. - - .. code:: python - - instance.clearLocation() - instance.designLocation = {'Weight': (34, 36.5), 'Width': 100} - instance.userLocation = {'Opsz': 16} - - In order to update a single axis location, the user should only clear - that axis, then edit the values: - - .. code:: python - - instance.clearLocation('Weight') - instance.designLocation['Weight'] = (34, 36.5) - - Args: - axisName: if provided, only clear the location for that axis. - - .. versionadded:: 5.0 - """ - self.locationLabel = None - if axisName is None: - self.designLocation = {} - self.userLocation = {} - else: - if self.designLocation is None: - self.designLocation = {} - if axisName in self.designLocation: - del self.designLocation[axisName] - if self.userLocation is None: - self.userLocation = {} - if axisName in self.userLocation: - del self.userLocation[axisName] - - def getLocationLabelDescriptor( - self, doc: "DesignSpaceDocument" - ) -> Optional[LocationLabelDescriptor]: - """Get the :class:`LocationLabelDescriptor` instance that matches - this instances's :attr:`locationLabel`. - - Raises if the named label can't be found. - - .. versionadded:: 5.0 - """ - if self.locationLabel is None: - return None - label = doc.getLocationLabel(self.locationLabel) - if label is None: - raise DesignSpaceDocumentError( - "InstanceDescriptor.getLocationLabelDescriptor(): " - f"unknown location label `{self.locationLabel}` in instance `{self.name}`." - ) - return label - - def getFullDesignLocation( - self, doc: "DesignSpaceDocument" - ) -> AnisotropicLocationDict: - """Get the complete design location of this instance, by combining data - from the various location fields, default axis values and mappings, and - top-level location labels. - - The source of truth for this instance's location is determined for each - axis independently by taking the first not-None field in this list: - - - ``locationLabel``: the location along this axis is the same as the - matching STAT format 4 label. No anisotropy. - - ``designLocation[axisName]``: the explicit design location along this - axis, possibly anisotropic. - - ``userLocation[axisName]``: the explicit user location along this - axis. No anisotropy. - - ``axis.default``: default axis value. No anisotropy. - - .. versionadded:: 5.0 - """ - label = self.getLocationLabelDescriptor(doc) - if label is not None: - return doc.map_forward(label.userLocation) # type: ignore - result: AnisotropicLocationDict = {} - for axis in doc.axes: - if axis.name in self.designLocation: - result[axis.name] = self.designLocation[axis.name] - elif axis.name in self.userLocation: - result[axis.name] = axis.map_forward(self.userLocation[axis.name]) - else: - result[axis.name] = axis.map_forward(axis.default) - return result - - def getFullUserLocation(self, doc: "DesignSpaceDocument") -> SimpleLocationDict: - """Get the complete user location for this instance. - - .. seealso:: :meth:`getFullDesignLocation` - - .. versionadded:: 5.0 - """ - return doc.map_backward(self.getFullDesignLocation(doc)) - - -def tagForAxisName(name): - # try to find or make a tag name for this axis name - names = { - "weight": ("wght", dict(en="Weight")), - "width": ("wdth", dict(en="Width")), - "optical": ("opsz", dict(en="Optical Size")), - "slant": ("slnt", dict(en="Slant")), - "italic": ("ital", dict(en="Italic")), - } - if name.lower() in names: - return names[name.lower()] - if len(name) < 4: - tag = name + "*" * (4 - len(name)) - else: - tag = name[:4] - return tag, dict(en=name) - - -class AbstractAxisDescriptor(SimpleDescriptor): - flavor = "axis" - - def __init__( - self, - *, - tag=None, - name=None, - labelNames=None, - hidden=False, - map=None, - axisOrdering=None, - axisLabels=None, - ): - # opentype tag for this axis - self.tag = tag - """string. Four letter tag for this axis. Some might be - registered at the `OpenType - specification `__. - Privately-defined axis tags must begin with an uppercase letter and - use only uppercase letters or digits. - """ - # name of the axis used in locations - self.name = name - """string. Name of the axis as it is used in the location dicts. - - MutatorMath + varLib. - """ - # names for UI purposes, if this is not a standard axis, - self.labelNames = labelNames or {} - """dict. When defining a non-registered axis, it will be - necessary to define user-facing readable names for the axis. Keyed by - xml:lang code. Values are required to be ``unicode`` strings, even if - they only contain ASCII characters. - """ - self.hidden = hidden - """bool. Whether this axis should be hidden in user interfaces. - """ - self.map = map or [] - """list of input / output values that can describe a warp of user space - to design space coordinates. If no map values are present, it is assumed - user space is the same as design space, as in [(minimum, minimum), - (maximum, maximum)]. - - varLib. - """ - self.axisOrdering = axisOrdering - """STAT table field ``axisOrdering``. - - See: `OTSpec STAT Axis Record `_ - - .. versionadded:: 5.0 - """ - self.axisLabels: List[AxisLabelDescriptor] = axisLabels or [] - """STAT table entries for Axis Value Tables format 1, 2, 3. - - See: `OTSpec STAT Axis Value Tables `_ - - .. versionadded:: 5.0 - """ - - -class AxisDescriptor(AbstractAxisDescriptor): - """Simple container for the axis data. - - Add more localisations? - - .. code:: python - - a1 = AxisDescriptor() - a1.minimum = 1 - a1.maximum = 1000 - a1.default = 400 - a1.name = "weight" - a1.tag = "wght" - a1.labelNames['fa-IR'] = "قطر" - a1.labelNames['en'] = "Wéíght" - a1.map = [(1.0, 10.0), (400.0, 66.0), (1000.0, 990.0)] - a1.axisOrdering = 1 - a1.axisLabels = [ - AxisLabelDescriptor(name="Regular", userValue=400, elidable=True) - ] - doc.addAxis(a1) - """ - - _attrs = [ - "tag", - "name", - "maximum", - "minimum", - "default", - "map", - "axisOrdering", - "axisLabels", - ] - - def __init__( - self, - *, - tag=None, - name=None, - labelNames=None, - minimum=None, - default=None, - maximum=None, - hidden=False, - map=None, - axisOrdering=None, - axisLabels=None, - ): - super().__init__( - tag=tag, - name=name, - labelNames=labelNames, - hidden=hidden, - map=map, - axisOrdering=axisOrdering, - axisLabels=axisLabels, - ) - self.minimum = minimum - """number. The minimum value for this axis in user space. - - MutatorMath + varLib. - """ - self.maximum = maximum - """number. The maximum value for this axis in user space. - - MutatorMath + varLib. - """ - self.default = default - """number. The default value for this axis, i.e. when a new location is - created, this is the value this axis will get in user space. - - MutatorMath + varLib. - """ - - def serialize(self): - # output to a dict, used in testing - return dict( - tag=self.tag, - name=self.name, - labelNames=self.labelNames, - maximum=self.maximum, - minimum=self.minimum, - default=self.default, - hidden=self.hidden, - map=self.map, - axisOrdering=self.axisOrdering, - axisLabels=self.axisLabels, - ) - - def map_forward(self, v): - """Maps value from axis mapping's input (user) to output (design).""" - from fontTools.varLib.models import piecewiseLinearMap - - if not self.map: - return v - return piecewiseLinearMap(v, {k: v for k, v in self.map}) - - def map_backward(self, v): - """Maps value from axis mapping's output (design) to input (user).""" - from fontTools.varLib.models import piecewiseLinearMap - - if isinstance(v, tuple): - v = v[0] - if not self.map: - return v - return piecewiseLinearMap(v, {v: k for k, v in self.map}) - - -class DiscreteAxisDescriptor(AbstractAxisDescriptor): - """Container for discrete axis data. - - Use this for axes that do not interpolate. The main difference from a - continuous axis is that a continuous axis has a ``minimum`` and ``maximum``, - while a discrete axis has a list of ``values``. - - Example: an Italic axis with 2 stops, Roman and Italic, that are not - compatible. The axis still allows to bind together the full font family, - which is useful for the STAT table, however it can't become a variation - axis in a VF. - - .. code:: python - - a2 = DiscreteAxisDescriptor() - a2.values = [0, 1] - a2.default = 0 - a2.name = "Italic" - a2.tag = "ITAL" - a2.labelNames['fr'] = "Italique" - a2.map = [(0, 0), (1, -11)] - a2.axisOrdering = 2 - a2.axisLabels = [ - AxisLabelDescriptor(name="Roman", userValue=0, elidable=True) - ] - doc.addAxis(a2) - - .. versionadded:: 5.0 - """ - - flavor = "axis" - _attrs = ("tag", "name", "values", "default", "map", "axisOrdering", "axisLabels") - - def __init__( - self, - *, - tag=None, - name=None, - labelNames=None, - values=None, - default=None, - hidden=False, - map=None, - axisOrdering=None, - axisLabels=None, - ): - super().__init__( - tag=tag, - name=name, - labelNames=labelNames, - hidden=hidden, - map=map, - axisOrdering=axisOrdering, - axisLabels=axisLabels, - ) - self.default: float = default - """The default value for this axis, i.e. when a new location is - created, this is the value this axis will get in user space. - - However, this default value is less important than in continuous axes: - - - it doesn't define the "neutral" version of outlines from which - deltas would apply, as this axis does not interpolate. - - it doesn't provide the reference glyph set for the designspace, as - fonts at each value can have different glyph sets. - """ - self.values: List[float] = values or [] - """List of possible values for this axis. Contrary to continuous axes, - only the values in this list can be taken by the axis, nothing in-between. - """ - - def map_forward(self, value): - """Maps value from axis mapping's input to output. - - Returns value unchanged if no mapping entry is found. - - Note: for discrete axes, each value must have its mapping entry, if - you intend that value to be mapped. - """ - return next((v for k, v in self.map if k == value), value) - - def map_backward(self, value): - """Maps value from axis mapping's output to input. - - Returns value unchanged if no mapping entry is found. - - Note: for discrete axes, each value must have its mapping entry, if - you intend that value to be mapped. - """ - if isinstance(value, tuple): - value = value[0] - return next((k for k, v in self.map if v == value), value) - - -class AxisLabelDescriptor(SimpleDescriptor): - """Container for axis label data. - - Analogue of OpenType's STAT data for a single axis (formats 1, 2 and 3). - All values are user values. - See: `OTSpec STAT Axis value table, format 1, 2, 3 `_ - - The STAT format of the Axis value depends on which field are filled-in, - see :meth:`getFormat` - - .. versionadded:: 5.0 - """ - - flavor = "label" - _attrs = ( - "userMinimum", - "userValue", - "userMaximum", - "name", - "elidable", - "olderSibling", - "linkedUserValue", - "labelNames", - ) - - def __init__( - self, - *, - name, - userValue, - userMinimum=None, - userMaximum=None, - elidable=False, - olderSibling=False, - linkedUserValue=None, - labelNames=None, - ): - self.userMinimum: Optional[float] = userMinimum - """STAT field ``rangeMinValue`` (format 2).""" - self.userValue: float = userValue - """STAT field ``value`` (format 1, 3) or ``nominalValue`` (format 2).""" - self.userMaximum: Optional[float] = userMaximum - """STAT field ``rangeMaxValue`` (format 2).""" - self.name: str = name - """Label for this axis location, STAT field ``valueNameID``.""" - self.elidable: bool = elidable - """STAT flag ``ELIDABLE_AXIS_VALUE_NAME``. - - See: `OTSpec STAT Flags `_ - """ - self.olderSibling: bool = olderSibling - """STAT flag ``OLDER_SIBLING_FONT_ATTRIBUTE``. - - See: `OTSpec STAT Flags `_ - """ - self.linkedUserValue: Optional[float] = linkedUserValue - """STAT field ``linkedValue`` (format 3).""" - self.labelNames: MutableMapping[str, str] = labelNames or {} - """User-facing translations of this location's label. Keyed by - ``xml:lang`` code. - """ - - def getFormat(self) -> int: - """Determine which format of STAT Axis value to use to encode this label. - - =========== ========= =========== =========== =============== - STAT Format userValue userMinimum userMaximum linkedUserValue - =========== ========= =========== =========== =============== - 1 ✅ ❌ ❌ ❌ - 2 ✅ ✅ ✅ ❌ - 3 ✅ ❌ ❌ ✅ - =========== ========= =========== =========== =============== - """ - if self.linkedUserValue is not None: - return 3 - if self.userMinimum is not None or self.userMaximum is not None: - return 2 - return 1 - - @property - def defaultName(self) -> str: - """Return the English name from :attr:`labelNames` or the :attr:`name`.""" - return self.labelNames.get("en") or self.name - - -class LocationLabelDescriptor(SimpleDescriptor): - """Container for location label data. - - Analogue of OpenType's STAT data for a free-floating location (format 4). - All values are user values. - - See: `OTSpec STAT Axis value table, format 4 `_ - - .. versionadded:: 5.0 - """ - - flavor = "label" - _attrs = ("name", "elidable", "olderSibling", "userLocation", "labelNames") - - def __init__( - self, - *, - name, - userLocation, - elidable=False, - olderSibling=False, - labelNames=None, - ): - self.name: str = name - """Label for this named location, STAT field ``valueNameID``.""" - self.userLocation: SimpleLocationDict = userLocation or {} - """Location in user coordinates along each axis. - - If an axis is not mentioned, it is assumed to be at its default location. - - .. seealso:: This may be only part of the full location. See: - :meth:`getFullUserLocation` - """ - self.elidable: bool = elidable - """STAT flag ``ELIDABLE_AXIS_VALUE_NAME``. - - See: `OTSpec STAT Flags `_ - """ - self.olderSibling: bool = olderSibling - """STAT flag ``OLDER_SIBLING_FONT_ATTRIBUTE``. - - See: `OTSpec STAT Flags `_ - """ - self.labelNames: Dict[str, str] = labelNames or {} - """User-facing translations of this location's label. Keyed by - xml:lang code. - """ - - @property - def defaultName(self) -> str: - """Return the English name from :attr:`labelNames` or the :attr:`name`.""" - return self.labelNames.get("en") or self.name - - def getFullUserLocation(self, doc: "DesignSpaceDocument") -> SimpleLocationDict: - """Get the complete user location of this label, by combining data - from the explicit user location and default axis values. - - .. versionadded:: 5.0 - """ - return { - axis.name: self.userLocation.get(axis.name, axis.default) - for axis in doc.axes - } - - -class VariableFontDescriptor(SimpleDescriptor): - """Container for variable fonts, sub-spaces of the Designspace. - - Use-cases: - - - From a single DesignSpace with discrete axes, define 1 variable font - per value on the discrete axes. Before version 5, you would have needed - 1 DesignSpace per such variable font, and a lot of data duplication. - - From a big variable font with many axes, define subsets of that variable - font that only include some axes and freeze other axes at a given location. - - .. versionadded:: 5.0 - """ - - flavor = "variable-font" - _attrs = ("filename", "axisSubsets", "lib") - - filename = posixpath_property("_filename") - - def __init__(self, *, name, filename=None, axisSubsets=None, lib=None): - self.name: str = name - """string, required. Name of this variable to identify it during the - build process and from other parts of the document, and also as a - filename in case the filename property is empty. - - VarLib. - """ - self.filename: str = filename - """string, optional. Relative path to the variable font file, **as it is - in the document**. The file may or may not exist. - - If not specified, the :attr:`name` will be used as a basename for the file. - """ - self.axisSubsets: List[ - Union[RangeAxisSubsetDescriptor, ValueAxisSubsetDescriptor] - ] = (axisSubsets or []) - """Axis subsets to include in this variable font. - - If an axis is not mentioned, assume that we only want the default - location of that axis (same as a :class:`ValueAxisSubsetDescriptor`). - """ - self.lib: MutableMapping[str, Any] = lib or {} - """Custom data associated with this variable font.""" - - -class RangeAxisSubsetDescriptor(SimpleDescriptor): - """Subset of a continuous axis to include in a variable font. - - .. versionadded:: 5.0 - """ - - flavor = "axis-subset" - _attrs = ("name", "userMinimum", "userDefault", "userMaximum") - - def __init__( - self, *, name, userMinimum=-math.inf, userDefault=None, userMaximum=math.inf - ): - self.name: str = name - """Name of the :class:`AxisDescriptor` to subset.""" - self.userMinimum: float = userMinimum - """New minimum value of the axis in the target variable font. - If not specified, assume the same minimum value as the full axis. - (default = ``-math.inf``) - """ - self.userDefault: Optional[float] = userDefault - """New default value of the axis in the target variable font. - If not specified, assume the same default value as the full axis. - (default = ``None``) - """ - self.userMaximum: float = userMaximum - """New maximum value of the axis in the target variable font. - If not specified, assume the same maximum value as the full axis. - (default = ``math.inf``) - """ - - -class ValueAxisSubsetDescriptor(SimpleDescriptor): - """Single value of a discrete or continuous axis to use in a variable font. - - .. versionadded:: 5.0 - """ - - flavor = "axis-subset" - _attrs = ("name", "userValue") - - def __init__(self, *, name, userValue): - self.name: str = name - """Name of the :class:`AxisDescriptor` or :class:`DiscreteAxisDescriptor` - to "snapshot" or "freeze". - """ - self.userValue: float = userValue - """Value in user coordinates at which to freeze the given axis.""" - - -class BaseDocWriter(object): - _whiteSpace = " " - axisDescriptorClass = AxisDescriptor - discreteAxisDescriptorClass = DiscreteAxisDescriptor - axisLabelDescriptorClass = AxisLabelDescriptor - axisMappingDescriptorClass = AxisMappingDescriptor - locationLabelDescriptorClass = LocationLabelDescriptor - ruleDescriptorClass = RuleDescriptor - sourceDescriptorClass = SourceDescriptor - variableFontDescriptorClass = VariableFontDescriptor - valueAxisSubsetDescriptorClass = ValueAxisSubsetDescriptor - rangeAxisSubsetDescriptorClass = RangeAxisSubsetDescriptor - instanceDescriptorClass = InstanceDescriptor - - @classmethod - def getAxisDecriptor(cls): - return cls.axisDescriptorClass() - - @classmethod - def getAxisMappingDescriptor(cls): - return cls.axisMappingDescriptorClass() - - @classmethod - def getSourceDescriptor(cls): - return cls.sourceDescriptorClass() - - @classmethod - def getInstanceDescriptor(cls): - return cls.instanceDescriptorClass() - - @classmethod - def getRuleDescriptor(cls): - return cls.ruleDescriptorClass() - - def __init__(self, documentPath, documentObject: DesignSpaceDocument): - self.path = documentPath - self.documentObject = documentObject - self.effectiveFormatTuple = self._getEffectiveFormatTuple() - self.root = ET.Element("designspace") - - def write(self, pretty=True, encoding="UTF-8", xml_declaration=True): - self.root.attrib["format"] = ".".join(str(i) for i in self.effectiveFormatTuple) - - if ( - self.documentObject.axes - or self.documentObject.axisMappings - or self.documentObject.elidedFallbackName is not None - ): - axesElement = ET.Element("axes") - if self.documentObject.elidedFallbackName is not None: - axesElement.attrib["elidedfallbackname"] = ( - self.documentObject.elidedFallbackName - ) - self.root.append(axesElement) - for axisObject in self.documentObject.axes: - self._addAxis(axisObject) - - if self.documentObject.axisMappings: - mappingsElement = None - lastGroup = object() - for mappingObject in self.documentObject.axisMappings: - if getattr(mappingObject, "groupDescription", None) != lastGroup: - if mappingsElement is not None: - self.root.findall(".axes")[0].append(mappingsElement) - lastGroup = getattr(mappingObject, "groupDescription", None) - mappingsElement = ET.Element("mappings") - if lastGroup is not None: - mappingsElement.attrib["description"] = lastGroup - self._addAxisMapping(mappingsElement, mappingObject) - if mappingsElement is not None: - self.root.findall(".axes")[0].append(mappingsElement) - - if self.documentObject.locationLabels: - labelsElement = ET.Element("labels") - for labelObject in self.documentObject.locationLabels: - self._addLocationLabel(labelsElement, labelObject) - self.root.append(labelsElement) - - if self.documentObject.rules: - if getattr(self.documentObject, "rulesProcessingLast", False): - attributes = {"processing": "last"} - else: - attributes = {} - self.root.append(ET.Element("rules", attributes)) - for ruleObject in self.documentObject.rules: - self._addRule(ruleObject) - - if self.documentObject.sources: - self.root.append(ET.Element("sources")) - for sourceObject in self.documentObject.sources: - self._addSource(sourceObject) - - if self.documentObject.variableFonts: - variableFontsElement = ET.Element("variable-fonts") - for variableFont in self.documentObject.variableFonts: - self._addVariableFont(variableFontsElement, variableFont) - self.root.append(variableFontsElement) - - if self.documentObject.instances: - self.root.append(ET.Element("instances")) - for instanceObject in self.documentObject.instances: - self._addInstance(instanceObject) - - if self.documentObject.lib: - self._addLib(self.root, self.documentObject.lib, 2) - - tree = ET.ElementTree(self.root) - tree.write( - self.path, - encoding=encoding, - method="xml", - xml_declaration=xml_declaration, - pretty_print=pretty, - ) - - def _getEffectiveFormatTuple(self): - """Try to use the version specified in the document, or a sufficiently - recent version to be able to encode what the document contains. - """ - minVersion = self.documentObject.formatTuple - if ( - any( - hasattr(axis, "values") - or axis.axisOrdering is not None - or axis.axisLabels - for axis in self.documentObject.axes - ) - or self.documentObject.locationLabels - or any(source.localisedFamilyName for source in self.documentObject.sources) - or self.documentObject.variableFonts - or any( - instance.locationLabel or instance.userLocation - for instance in self.documentObject.instances - ) - ): - if minVersion < (5, 0): - minVersion = (5, 0) - if self.documentObject.axisMappings: - if minVersion < (5, 1): - minVersion = (5, 1) - return minVersion - - def _makeLocationElement(self, locationObject, name=None): - """Convert Location dict to a locationElement.""" - locElement = ET.Element("location") - if name is not None: - locElement.attrib["name"] = name - validatedLocation = self.documentObject.newDefaultLocation() - for axisName, axisValue in locationObject.items(): - if axisName in validatedLocation: - # only accept values we know - validatedLocation[axisName] = axisValue - for dimensionName, dimensionValue in validatedLocation.items(): - dimElement = ET.Element("dimension") - dimElement.attrib["name"] = dimensionName - if type(dimensionValue) == tuple: - dimElement.attrib["xvalue"] = self.intOrFloat(dimensionValue[0]) - dimElement.attrib["yvalue"] = self.intOrFloat(dimensionValue[1]) - else: - dimElement.attrib["xvalue"] = self.intOrFloat(dimensionValue) - locElement.append(dimElement) - return locElement, validatedLocation - - def intOrFloat(self, num): - if int(num) == num: - return "%d" % num - return ("%f" % num).rstrip("0").rstrip(".") - - def _addRule(self, ruleObject): - # if none of the conditions have minimum or maximum values, do not add the rule. - ruleElement = ET.Element("rule") - if ruleObject.name is not None: - ruleElement.attrib["name"] = ruleObject.name - for conditions in ruleObject.conditionSets: - conditionsetElement = ET.Element("conditionset") - for cond in conditions: - if cond.get("minimum") is None and cond.get("maximum") is None: - # neither is defined, don't add this condition - continue - conditionElement = ET.Element("condition") - conditionElement.attrib["name"] = cond.get("name") - if cond.get("minimum") is not None: - conditionElement.attrib["minimum"] = self.intOrFloat( - cond.get("minimum") - ) - if cond.get("maximum") is not None: - conditionElement.attrib["maximum"] = self.intOrFloat( - cond.get("maximum") - ) - conditionsetElement.append(conditionElement) - if len(conditionsetElement): - ruleElement.append(conditionsetElement) - for sub in ruleObject.subs: - subElement = ET.Element("sub") - subElement.attrib["name"] = sub[0] - subElement.attrib["with"] = sub[1] - ruleElement.append(subElement) - if len(ruleElement): - self.root.findall(".rules")[0].append(ruleElement) - - def _addAxis(self, axisObject): - axisElement = ET.Element("axis") - axisElement.attrib["tag"] = axisObject.tag - axisElement.attrib["name"] = axisObject.name - self._addLabelNames(axisElement, axisObject.labelNames) - if axisObject.map: - for inputValue, outputValue in axisObject.map: - mapElement = ET.Element("map") - mapElement.attrib["input"] = self.intOrFloat(inputValue) - mapElement.attrib["output"] = self.intOrFloat(outputValue) - axisElement.append(mapElement) - if axisObject.axisOrdering or axisObject.axisLabels: - labelsElement = ET.Element("labels") - if axisObject.axisOrdering is not None: - labelsElement.attrib["ordering"] = str(axisObject.axisOrdering) - for label in axisObject.axisLabels: - self._addAxisLabel(labelsElement, label) - axisElement.append(labelsElement) - if hasattr(axisObject, "minimum"): - axisElement.attrib["minimum"] = self.intOrFloat(axisObject.minimum) - axisElement.attrib["maximum"] = self.intOrFloat(axisObject.maximum) - elif hasattr(axisObject, "values"): - axisElement.attrib["values"] = " ".join( - self.intOrFloat(v) for v in axisObject.values - ) - axisElement.attrib["default"] = self.intOrFloat(axisObject.default) - if axisObject.hidden: - axisElement.attrib["hidden"] = "1" - self.root.findall(".axes")[0].append(axisElement) - - def _addAxisMapping(self, mappingsElement, mappingObject): - mappingElement = ET.Element("mapping") - if getattr(mappingObject, "description", None) is not None: - mappingElement.attrib["description"] = mappingObject.description - for what in ("inputLocation", "outputLocation"): - whatObject = getattr(mappingObject, what, None) - if whatObject is None: - continue - whatElement = ET.Element(what[:-8]) - mappingElement.append(whatElement) - - for name, value in whatObject.items(): - dimensionElement = ET.Element("dimension") - dimensionElement.attrib["name"] = name - dimensionElement.attrib["xvalue"] = self.intOrFloat(value) - whatElement.append(dimensionElement) - - mappingsElement.append(mappingElement) - - def _addAxisLabel( - self, axisElement: ET.Element, label: AxisLabelDescriptor - ) -> None: - labelElement = ET.Element("label") - labelElement.attrib["uservalue"] = self.intOrFloat(label.userValue) - if label.userMinimum is not None: - labelElement.attrib["userminimum"] = self.intOrFloat(label.userMinimum) - if label.userMaximum is not None: - labelElement.attrib["usermaximum"] = self.intOrFloat(label.userMaximum) - labelElement.attrib["name"] = label.name - if label.elidable: - labelElement.attrib["elidable"] = "true" - if label.olderSibling: - labelElement.attrib["oldersibling"] = "true" - if label.linkedUserValue is not None: - labelElement.attrib["linkeduservalue"] = self.intOrFloat( - label.linkedUserValue - ) - self._addLabelNames(labelElement, label.labelNames) - axisElement.append(labelElement) - - def _addLabelNames(self, parentElement, labelNames): - for languageCode, labelName in sorted(labelNames.items()): - languageElement = ET.Element("labelname") - languageElement.attrib[XML_LANG] = languageCode - languageElement.text = labelName - parentElement.append(languageElement) - - def _addLocationLabel( - self, parentElement: ET.Element, label: LocationLabelDescriptor - ) -> None: - labelElement = ET.Element("label") - labelElement.attrib["name"] = label.name - if label.elidable: - labelElement.attrib["elidable"] = "true" - if label.olderSibling: - labelElement.attrib["oldersibling"] = "true" - self._addLabelNames(labelElement, label.labelNames) - self._addLocationElement(labelElement, userLocation=label.userLocation) - parentElement.append(labelElement) - - def _addLocationElement( - self, - parentElement, - *, - designLocation: AnisotropicLocationDict = None, - userLocation: SimpleLocationDict = None, - ): - locElement = ET.Element("location") - for axis in self.documentObject.axes: - if designLocation is not None and axis.name in designLocation: - dimElement = ET.Element("dimension") - dimElement.attrib["name"] = axis.name - value = designLocation[axis.name] - if isinstance(value, tuple): - dimElement.attrib["xvalue"] = self.intOrFloat(value[0]) - dimElement.attrib["yvalue"] = self.intOrFloat(value[1]) - else: - dimElement.attrib["xvalue"] = self.intOrFloat(value) - locElement.append(dimElement) - elif userLocation is not None and axis.name in userLocation: - dimElement = ET.Element("dimension") - dimElement.attrib["name"] = axis.name - value = userLocation[axis.name] - dimElement.attrib["uservalue"] = self.intOrFloat(value) - locElement.append(dimElement) - if len(locElement) > 0: - parentElement.append(locElement) - - def _addInstance(self, instanceObject): - instanceElement = ET.Element("instance") - if instanceObject.name is not None: - instanceElement.attrib["name"] = instanceObject.name - if instanceObject.locationLabel is not None: - instanceElement.attrib["location"] = instanceObject.locationLabel - if instanceObject.familyName is not None: - instanceElement.attrib["familyname"] = instanceObject.familyName - if instanceObject.styleName is not None: - instanceElement.attrib["stylename"] = instanceObject.styleName - # add localisations - if instanceObject.localisedStyleName: - languageCodes = list(instanceObject.localisedStyleName.keys()) - languageCodes.sort() - for code in languageCodes: - if code == "en": - continue # already stored in the element attribute - localisedStyleNameElement = ET.Element("stylename") - localisedStyleNameElement.attrib[XML_LANG] = code - localisedStyleNameElement.text = instanceObject.getStyleName(code) - instanceElement.append(localisedStyleNameElement) - if instanceObject.localisedFamilyName: - languageCodes = list(instanceObject.localisedFamilyName.keys()) - languageCodes.sort() - for code in languageCodes: - if code == "en": - continue # already stored in the element attribute - localisedFamilyNameElement = ET.Element("familyname") - localisedFamilyNameElement.attrib[XML_LANG] = code - localisedFamilyNameElement.text = instanceObject.getFamilyName(code) - instanceElement.append(localisedFamilyNameElement) - if instanceObject.localisedStyleMapStyleName: - languageCodes = list(instanceObject.localisedStyleMapStyleName.keys()) - languageCodes.sort() - for code in languageCodes: - if code == "en": - continue - localisedStyleMapStyleNameElement = ET.Element("stylemapstylename") - localisedStyleMapStyleNameElement.attrib[XML_LANG] = code - localisedStyleMapStyleNameElement.text = ( - instanceObject.getStyleMapStyleName(code) - ) - instanceElement.append(localisedStyleMapStyleNameElement) - if instanceObject.localisedStyleMapFamilyName: - languageCodes = list(instanceObject.localisedStyleMapFamilyName.keys()) - languageCodes.sort() - for code in languageCodes: - if code == "en": - continue - localisedStyleMapFamilyNameElement = ET.Element("stylemapfamilyname") - localisedStyleMapFamilyNameElement.attrib[XML_LANG] = code - localisedStyleMapFamilyNameElement.text = ( - instanceObject.getStyleMapFamilyName(code) - ) - instanceElement.append(localisedStyleMapFamilyNameElement) - - if self.effectiveFormatTuple >= (5, 0): - if instanceObject.locationLabel is None: - self._addLocationElement( - instanceElement, - designLocation=instanceObject.designLocation, - userLocation=instanceObject.userLocation, - ) - else: - # Pre-version 5.0 code was validating and filling in the location - # dict while writing it out, as preserved below. - if instanceObject.location is not None: - locationElement, instanceObject.location = self._makeLocationElement( - instanceObject.location - ) - instanceElement.append(locationElement) - if instanceObject.filename is not None: - instanceElement.attrib["filename"] = instanceObject.filename - if instanceObject.postScriptFontName is not None: - instanceElement.attrib["postscriptfontname"] = ( - instanceObject.postScriptFontName - ) - if instanceObject.styleMapFamilyName is not None: - instanceElement.attrib["stylemapfamilyname"] = ( - instanceObject.styleMapFamilyName - ) - if instanceObject.styleMapStyleName is not None: - instanceElement.attrib["stylemapstylename"] = ( - instanceObject.styleMapStyleName - ) - if self.effectiveFormatTuple < (5, 0): - # Deprecated members as of version 5.0 - if instanceObject.glyphs: - if instanceElement.findall(".glyphs") == []: - glyphsElement = ET.Element("glyphs") - instanceElement.append(glyphsElement) - glyphsElement = instanceElement.findall(".glyphs")[0] - for glyphName, data in sorted(instanceObject.glyphs.items()): - glyphElement = self._writeGlyphElement( - instanceElement, instanceObject, glyphName, data - ) - glyphsElement.append(glyphElement) - if instanceObject.kerning: - kerningElement = ET.Element("kerning") - instanceElement.append(kerningElement) - if instanceObject.info: - infoElement = ET.Element("info") - instanceElement.append(infoElement) - self._addLib(instanceElement, instanceObject.lib, 4) - self.root.findall(".instances")[0].append(instanceElement) - - def _addSource(self, sourceObject): - sourceElement = ET.Element("source") - if sourceObject.filename is not None: - sourceElement.attrib["filename"] = sourceObject.filename - if sourceObject.name is not None: - if sourceObject.name.find("temp_master") != 0: - # do not save temporary source names - sourceElement.attrib["name"] = sourceObject.name - if sourceObject.familyName is not None: - sourceElement.attrib["familyname"] = sourceObject.familyName - if sourceObject.styleName is not None: - sourceElement.attrib["stylename"] = sourceObject.styleName - if sourceObject.layerName is not None: - sourceElement.attrib["layer"] = sourceObject.layerName - if sourceObject.localisedFamilyName: - languageCodes = list(sourceObject.localisedFamilyName.keys()) - languageCodes.sort() - for code in languageCodes: - if code == "en": - continue # already stored in the element attribute - localisedFamilyNameElement = ET.Element("familyname") - localisedFamilyNameElement.attrib[XML_LANG] = code - localisedFamilyNameElement.text = sourceObject.getFamilyName(code) - sourceElement.append(localisedFamilyNameElement) - if sourceObject.copyLib: - libElement = ET.Element("lib") - libElement.attrib["copy"] = "1" - sourceElement.append(libElement) - if sourceObject.copyGroups: - groupsElement = ET.Element("groups") - groupsElement.attrib["copy"] = "1" - sourceElement.append(groupsElement) - if sourceObject.copyFeatures: - featuresElement = ET.Element("features") - featuresElement.attrib["copy"] = "1" - sourceElement.append(featuresElement) - if sourceObject.copyInfo or sourceObject.muteInfo: - infoElement = ET.Element("info") - if sourceObject.copyInfo: - infoElement.attrib["copy"] = "1" - if sourceObject.muteInfo: - infoElement.attrib["mute"] = "1" - sourceElement.append(infoElement) - if sourceObject.muteKerning: - kerningElement = ET.Element("kerning") - kerningElement.attrib["mute"] = "1" - sourceElement.append(kerningElement) - if sourceObject.mutedGlyphNames: - for name in sourceObject.mutedGlyphNames: - glyphElement = ET.Element("glyph") - glyphElement.attrib["name"] = name - glyphElement.attrib["mute"] = "1" - sourceElement.append(glyphElement) - if self.effectiveFormatTuple >= (5, 0): - self._addLocationElement( - sourceElement, designLocation=sourceObject.location - ) - else: - # Pre-version 5.0 code was validating and filling in the location - # dict while writing it out, as preserved below. - locationElement, sourceObject.location = self._makeLocationElement( - sourceObject.location - ) - sourceElement.append(locationElement) - self.root.findall(".sources")[0].append(sourceElement) - - def _addVariableFont( - self, parentElement: ET.Element, vf: VariableFontDescriptor - ) -> None: - vfElement = ET.Element("variable-font") - vfElement.attrib["name"] = vf.name - if vf.filename is not None: - vfElement.attrib["filename"] = vf.filename - if vf.axisSubsets: - subsetsElement = ET.Element("axis-subsets") - for subset in vf.axisSubsets: - subsetElement = ET.Element("axis-subset") - subsetElement.attrib["name"] = subset.name - # Mypy doesn't support narrowing union types via hasattr() - # https://mypy.readthedocs.io/en/stable/type_narrowing.html - # TODO(Python 3.10): use TypeGuard - if hasattr(subset, "userMinimum"): - subset = cast(RangeAxisSubsetDescriptor, subset) - if subset.userMinimum != -math.inf: - subsetElement.attrib["userminimum"] = self.intOrFloat( - subset.userMinimum - ) - if subset.userMaximum != math.inf: - subsetElement.attrib["usermaximum"] = self.intOrFloat( - subset.userMaximum - ) - if subset.userDefault is not None: - subsetElement.attrib["userdefault"] = self.intOrFloat( - subset.userDefault - ) - elif hasattr(subset, "userValue"): - subset = cast(ValueAxisSubsetDescriptor, subset) - subsetElement.attrib["uservalue"] = self.intOrFloat( - subset.userValue - ) - subsetsElement.append(subsetElement) - vfElement.append(subsetsElement) - self._addLib(vfElement, vf.lib, 4) - parentElement.append(vfElement) - - def _addLib(self, parentElement: ET.Element, data: Any, indent_level: int) -> None: - if not data: - return - libElement = ET.Element("lib") - libElement.append(plistlib.totree(data, indent_level=indent_level)) - parentElement.append(libElement) - - def _writeGlyphElement(self, instanceElement, instanceObject, glyphName, data): - glyphElement = ET.Element("glyph") - if data.get("mute"): - glyphElement.attrib["mute"] = "1" - if data.get("unicodes") is not None: - glyphElement.attrib["unicode"] = " ".join( - [hex(u) for u in data.get("unicodes")] - ) - if data.get("instanceLocation") is not None: - locationElement, data["instanceLocation"] = self._makeLocationElement( - data.get("instanceLocation") - ) - glyphElement.append(locationElement) - if glyphName is not None: - glyphElement.attrib["name"] = glyphName - if data.get("note") is not None: - noteElement = ET.Element("note") - noteElement.text = data.get("note") - glyphElement.append(noteElement) - if data.get("masters") is not None: - mastersElement = ET.Element("masters") - for m in data.get("masters"): - masterElement = ET.Element("master") - if m.get("glyphName") is not None: - masterElement.attrib["glyphname"] = m.get("glyphName") - if m.get("font") is not None: - masterElement.attrib["source"] = m.get("font") - if m.get("location") is not None: - locationElement, m["location"] = self._makeLocationElement( - m.get("location") - ) - masterElement.append(locationElement) - mastersElement.append(masterElement) - glyphElement.append(mastersElement) - return glyphElement - - -class BaseDocReader(LogMixin): - axisDescriptorClass = AxisDescriptor - discreteAxisDescriptorClass = DiscreteAxisDescriptor - axisLabelDescriptorClass = AxisLabelDescriptor - axisMappingDescriptorClass = AxisMappingDescriptor - locationLabelDescriptorClass = LocationLabelDescriptor - ruleDescriptorClass = RuleDescriptor - sourceDescriptorClass = SourceDescriptor - variableFontsDescriptorClass = VariableFontDescriptor - valueAxisSubsetDescriptorClass = ValueAxisSubsetDescriptor - rangeAxisSubsetDescriptorClass = RangeAxisSubsetDescriptor - instanceDescriptorClass = InstanceDescriptor - - def __init__(self, documentPath, documentObject): - self.path = documentPath - self.documentObject = documentObject - tree = ET.parse(self.path) - self.root = tree.getroot() - self.documentObject.formatVersion = self.root.attrib.get("format", "3.0") - self._axes = [] - self.rules = [] - self.sources = [] - self.instances = [] - self.axisDefaults = {} - self._strictAxisNames = True - - @classmethod - def fromstring(cls, string, documentObject): - f = BytesIO(tobytes(string, encoding="utf-8")) - self = cls(f, documentObject) - self.path = None - return self - - def read(self): - self.readAxes() - self.readLabels() - self.readRules() - self.readVariableFonts() - self.readSources() - self.readInstances() - self.readLib() - - def readRules(self): - # we also need to read any conditions that are outside of a condition set. - rules = [] - rulesElement = self.root.find(".rules") - if rulesElement is not None: - processingValue = rulesElement.attrib.get("processing", "first") - if processingValue not in {"first", "last"}: - raise DesignSpaceDocumentError( - " processing attribute value is not valid: %r, " - "expected 'first' or 'last'" % processingValue - ) - self.documentObject.rulesProcessingLast = processingValue == "last" - for ruleElement in self.root.findall(".rules/rule"): - ruleObject = self.ruleDescriptorClass() - ruleName = ruleObject.name = ruleElement.attrib.get("name") - # read any stray conditions outside a condition set - externalConditions = self._readConditionElements( - ruleElement, - ruleName, - ) - if externalConditions: - ruleObject.conditionSets.append(externalConditions) - self.log.info( - "Found stray rule conditions outside a conditionset. " - "Wrapped them in a new conditionset." - ) - # read the conditionsets - for conditionSetElement in ruleElement.findall(".conditionset"): - conditionSet = self._readConditionElements( - conditionSetElement, - ruleName, - ) - if conditionSet is not None: - ruleObject.conditionSets.append(conditionSet) - for subElement in ruleElement.findall(".sub"): - a = subElement.attrib["name"] - b = subElement.attrib["with"] - ruleObject.subs.append((a, b)) - rules.append(ruleObject) - self.documentObject.rules = rules - - def _readConditionElements(self, parentElement, ruleName=None): - cds = [] - for conditionElement in parentElement.findall(".condition"): - cd = {} - cdMin = conditionElement.attrib.get("minimum") - if cdMin is not None: - cd["minimum"] = float(cdMin) - else: - # will allow these to be None, assume axis.minimum - cd["minimum"] = None - cdMax = conditionElement.attrib.get("maximum") - if cdMax is not None: - cd["maximum"] = float(cdMax) - else: - # will allow these to be None, assume axis.maximum - cd["maximum"] = None - cd["name"] = conditionElement.attrib.get("name") - # # test for things - if cd.get("minimum") is None and cd.get("maximum") is None: - raise DesignSpaceDocumentError( - "condition missing required minimum or maximum in rule" - + (" '%s'" % ruleName if ruleName is not None else "") - ) - cds.append(cd) - return cds - - def readAxes(self): - # read the axes elements, including the warp map. - axesElement = self.root.find(".axes") - if axesElement is not None and "elidedfallbackname" in axesElement.attrib: - self.documentObject.elidedFallbackName = axesElement.attrib[ - "elidedfallbackname" - ] - axisElements = self.root.findall(".axes/axis") - if not axisElements: - return - for axisElement in axisElements: - if ( - self.documentObject.formatTuple >= (5, 0) - and "values" in axisElement.attrib - ): - axisObject = self.discreteAxisDescriptorClass() - axisObject.values = [ - float(s) for s in axisElement.attrib["values"].split(" ") - ] - else: - axisObject = self.axisDescriptorClass() - axisObject.minimum = float(axisElement.attrib.get("minimum")) - axisObject.maximum = float(axisElement.attrib.get("maximum")) - axisObject.default = float(axisElement.attrib.get("default")) - axisObject.name = axisElement.attrib.get("name") - if axisElement.attrib.get("hidden", False): - axisObject.hidden = True - axisObject.tag = axisElement.attrib.get("tag") - for mapElement in axisElement.findall("map"): - a = float(mapElement.attrib["input"]) - b = float(mapElement.attrib["output"]) - axisObject.map.append((a, b)) - for labelNameElement in axisElement.findall("labelname"): - # Note: elementtree reads the "xml:lang" attribute name as - # '{http://www.w3.org/XML/1998/namespace}lang' - for key, lang in labelNameElement.items(): - if key == XML_LANG: - axisObject.labelNames[lang] = tostr(labelNameElement.text) - labelElement = axisElement.find(".labels") - if labelElement is not None: - if "ordering" in labelElement.attrib: - axisObject.axisOrdering = int(labelElement.attrib["ordering"]) - for label in labelElement.findall(".label"): - axisObject.axisLabels.append(self.readAxisLabel(label)) - self.documentObject.axes.append(axisObject) - self.axisDefaults[axisObject.name] = axisObject.default - - self.documentObject.axisMappings = [] - for mappingsElement in self.root.findall(".axes/mappings"): - groupDescription = mappingsElement.attrib.get("description") - for mappingElement in mappingsElement.findall("mapping"): - description = mappingElement.attrib.get("description") - inputElement = mappingElement.find("input") - outputElement = mappingElement.find("output") - inputLoc = {} - outputLoc = {} - for dimElement in inputElement.findall(".dimension"): - name = dimElement.attrib["name"] - value = float(dimElement.attrib["xvalue"]) - inputLoc[name] = value - for dimElement in outputElement.findall(".dimension"): - name = dimElement.attrib["name"] - value = float(dimElement.attrib["xvalue"]) - outputLoc[name] = value - axisMappingObject = self.axisMappingDescriptorClass( - inputLocation=inputLoc, - outputLocation=outputLoc, - description=description, - groupDescription=groupDescription, - ) - self.documentObject.axisMappings.append(axisMappingObject) - - def readAxisLabel(self, element: ET.Element): - xml_attrs = { - "userminimum", - "uservalue", - "usermaximum", - "name", - "elidable", - "oldersibling", - "linkeduservalue", - } - unknown_attrs = set(element.attrib) - xml_attrs - if unknown_attrs: - raise DesignSpaceDocumentError( - f"label element contains unknown attributes: {', '.join(unknown_attrs)}" - ) - - name = element.get("name") - if name is None: - raise DesignSpaceDocumentError("label element must have a name attribute.") - valueStr = element.get("uservalue") - if valueStr is None: - raise DesignSpaceDocumentError( - "label element must have a uservalue attribute." - ) - value = float(valueStr) - minimumStr = element.get("userminimum") - minimum = float(minimumStr) if minimumStr is not None else None - maximumStr = element.get("usermaximum") - maximum = float(maximumStr) if maximumStr is not None else None - linkedValueStr = element.get("linkeduservalue") - linkedValue = float(linkedValueStr) if linkedValueStr is not None else None - elidable = True if element.get("elidable") == "true" else False - olderSibling = True if element.get("oldersibling") == "true" else False - labelNames = { - lang: label_name.text or "" - for label_name in element.findall("labelname") - for attr, lang in label_name.items() - if attr == XML_LANG - # Note: elementtree reads the "xml:lang" attribute name as - # '{http://www.w3.org/XML/1998/namespace}lang' - } - return self.axisLabelDescriptorClass( - name=name, - userValue=value, - userMinimum=minimum, - userMaximum=maximum, - elidable=elidable, - olderSibling=olderSibling, - linkedUserValue=linkedValue, - labelNames=labelNames, - ) - - def readLabels(self): - if self.documentObject.formatTuple < (5, 0): - return - - xml_attrs = {"name", "elidable", "oldersibling"} - for labelElement in self.root.findall(".labels/label"): - unknown_attrs = set(labelElement.attrib) - xml_attrs - if unknown_attrs: - raise DesignSpaceDocumentError( - f"Label element contains unknown attributes: {', '.join(unknown_attrs)}" - ) - - name = labelElement.get("name") - if name is None: - raise DesignSpaceDocumentError( - "label element must have a name attribute." - ) - designLocation, userLocation = self.locationFromElement(labelElement) - if designLocation: - raise DesignSpaceDocumentError( - f'


    S_Yn#U${B-T+CK3Vs6M6vt6Nh#FMktqO1iIP~96 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

    tSwoKrot0EOOC+53o7B!?skSnT$CXl{ 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

    5f>e3^RDqPQ?C*<(lQB~f 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


    `!>7G60nf261@ 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 diff --git a/.venv/Lib/site-packages/fontTools/designspaceLib/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/designspaceLib/__pycache__/__main__.cpython-311.pyc deleted file mode 100644 index 7035e19d07542e1fb8b1883a6e7160ef9d896fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 482 zcmY*Wy-&hG6u)avLkMgP!o=D^J{*m4P!cgwmI5Z^lBUoHsq|XXYZ06n958V;{s$Q2 zKZC}BbTu(?BVl9m4y_6A-n;kx?ss?3>2wkag0IUi6Z%s+F_AxG)e^=NvXF%x)RJ0p zFjHCzMxa`1Uy*fwPCMA?RL-9@ z&S@YMMlZB!VF>P!it{PA1K1Z}`eqL}{fAlHhFOd+R2Yoci6iD&p##T$N}!bQ!F91M zRgCchB`2G;K-zqpm%E6hrnm2EcCKa@BsDp`t4{0F`hD}E`9?AyBr}hBsUngSRlfY% EAAUWC4FCWD diff --git a/.venv/Lib/site-packages/fontTools/designspaceLib/__pycache__/split.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/designspaceLib/__pycache__/split.cpython-311.pyc deleted file mode 100644 index dc0a1c1081b7bf0b027b7fb5825baac83e76b6ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18857 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 alo4T!pyr6BD$kk0aZnIi{274h%l`|;GZ5(j diff --git a/.venv/Lib/site-packages/fontTools/designspaceLib/__pycache__/statNames.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/designspaceLib/__pycache__/statNames.cpython-311.pyc deleted file mode 100644 index d2ead3436f516a627e0e90acad26df142c07f3b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9970 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%0D3wsMP@6Js2QX8AKC4} z_U{P*I5F*Lhj(;z-}0{W<-p!bU~h41b9e-gmZvKnd)BA!PnZ1%EB=GqF;)N0ihsD| ze|dfP{ZU8^AxsP*mKbjKls$tb&)^T9t>RaQ$1B5!FnKT+q$KL ztJ5Xn1$Z_Cee6_wOSyA=H4Qt4XIlW6{Ep%g5a2`KkyZX?Ysq&+e;zpy3uHP45Iad| z%Xc(u#vE4!cP6LgKwDs(^g*cBh1_@B5Y^}B<^^ye@H7b4210Bd%RvIE`q9-ZdTmaHTc0=)^Nm$MUh&PH;Bg^NSuByFA6|N=wfoUxi*|d3W(=OTI-%%_(sH a8nJ?2>yXX%`nm2Jv4Y_t#61Hrb^Qlv1 str: - """Default callable to synthesize an instance filename - when makeNames=True, for instances that don't specify an instance name - in the designspace. This part of the name generation can be overriden - because it's not specified by the STAT table. - """ - familyName = instance.familyName or statNames.familyNames.get("en") - styleName = instance.styleName or statNames.styleNames.get("en") - return f"{familyName}-{styleName}.ttf" - - -def splitInterpolable( - doc: DesignSpaceDocument, - makeNames: bool = True, - expandLocations: bool = True, - makeInstanceFilename: MakeInstanceFilenameCallable = defaultMakeInstanceFilename, -) -> Iterator[Tuple[SimpleLocationDict, DesignSpaceDocument]]: - """Split the given DS5 into several interpolable sub-designspaces. - There are as many interpolable sub-spaces as there are combinations of - discrete axis values. - - E.g. with axes: - - italic (discrete) Upright or Italic - - style (discrete) Sans or Serif - - weight (continuous) 100 to 900 - - There are 4 sub-spaces in which the Weight axis should interpolate: - (Upright, Sans), (Upright, Serif), (Italic, Sans) and (Italic, Serif). - - The sub-designspaces still include the full axis definitions and STAT data, - but the rules, sources, variable fonts, instances are trimmed down to only - keep what falls within the interpolable sub-space. - - Args: - - ``makeNames``: Whether to compute the instance family and style - names using the STAT data. - - ``expandLocations``: Whether to turn all locations into "full" - locations, including implicit default axis values where missing. - - ``makeInstanceFilename``: Callable to synthesize an instance filename - when makeNames=True, for instances that don't specify an instance name - in the designspace. This part of the name generation can be overridden - because it's not specified by the STAT table. - - .. versionadded:: 5.0 - """ - discreteAxes = [] - interpolableUserRegion: Region = {} - for axis in doc.axes: - if hasattr(axis, "values"): - # Mypy doesn't support narrowing union types via hasattr() - # TODO(Python 3.10): use TypeGuard - # https://mypy.readthedocs.io/en/stable/type_narrowing.html - axis = cast(DiscreteAxisDescriptor, axis) - discreteAxes.append(axis) - else: - axis = cast(AxisDescriptor, axis) - interpolableUserRegion[axis.name] = Range( - axis.minimum, - axis.maximum, - axis.default, - ) - valueCombinations = itertools.product(*[axis.values for axis in discreteAxes]) - for values in valueCombinations: - discreteUserLocation = { - discreteAxis.name: value - for discreteAxis, value in zip(discreteAxes, values) - } - subDoc = _extractSubSpace( - doc, - {**interpolableUserRegion, **discreteUserLocation}, - keepVFs=True, - makeNames=makeNames, - expandLocations=expandLocations, - makeInstanceFilename=makeInstanceFilename, - ) - yield discreteUserLocation, subDoc - - -def splitVariableFonts( - doc: DesignSpaceDocument, - makeNames: bool = False, - expandLocations: bool = False, - makeInstanceFilename: MakeInstanceFilenameCallable = defaultMakeInstanceFilename, -) -> Iterator[Tuple[str, DesignSpaceDocument]]: - """Convert each variable font listed in this document into a standalone - designspace. This can be used to compile all the variable fonts from a - format 5 designspace using tools that can only deal with 1 VF at a time. - - Args: - - ``makeNames``: Whether to compute the instance family and style - names using the STAT data. - - ``expandLocations``: Whether to turn all locations into "full" - locations, including implicit default axis values where missing. - - ``makeInstanceFilename``: Callable to synthesize an instance filename - when makeNames=True, for instances that don't specify an instance name - in the designspace. This part of the name generation can be overridden - because it's not specified by the STAT table. - - .. versionadded:: 5.0 - """ - # Make one DesignspaceDoc v5 for each variable font - for vf in doc.getVariableFonts(): - vfUserRegion = getVFUserRegion(doc, vf) - vfDoc = _extractSubSpace( - doc, - vfUserRegion, - keepVFs=False, - makeNames=makeNames, - expandLocations=expandLocations, - makeInstanceFilename=makeInstanceFilename, - ) - vfDoc.lib = {**vfDoc.lib, **vf.lib} - yield vf.name, vfDoc - - -def convert5to4( - doc: DesignSpaceDocument, -) -> Dict[str, DesignSpaceDocument]: - """Convert each variable font listed in this document into a standalone - format 4 designspace. This can be used to compile all the variable fonts - from a format 5 designspace using tools that only know about format 4. - - .. versionadded:: 5.0 - """ - vfs = {} - for _location, subDoc in splitInterpolable(doc): - for vfName, vfDoc in splitVariableFonts(subDoc): - vfDoc.formatVersion = "4.1" - vfs[vfName] = vfDoc - return vfs - - -def _extractSubSpace( - doc: DesignSpaceDocument, - userRegion: Region, - *, - keepVFs: bool, - makeNames: bool, - expandLocations: bool, - makeInstanceFilename: MakeInstanceFilenameCallable, -) -> DesignSpaceDocument: - subDoc = DesignSpaceDocument() - # Don't include STAT info - # FIXME: (Jany) let's think about it. Not include = OK because the point of - # the splitting is to build VFs and we'll use the STAT data of the full - # document to generate the STAT of the VFs, so "no need" to have STAT data - # in sub-docs. Counterpoint: what if someone wants to split this DS for - # other purposes? Maybe for that it would be useful to also subset the STAT - # data? - # subDoc.elidedFallbackName = doc.elidedFallbackName - - def maybeExpandDesignLocation(object): - if expandLocations: - return object.getFullDesignLocation(doc) - else: - return object.designLocation - - for axis in doc.axes: - range = userRegion[axis.name] - if isinstance(range, Range) and hasattr(axis, "minimum"): - # Mypy doesn't support narrowing union types via hasattr() - # TODO(Python 3.10): use TypeGuard - # https://mypy.readthedocs.io/en/stable/type_narrowing.html - axis = cast(AxisDescriptor, axis) - subDoc.addAxis( - AxisDescriptor( - # Same info - tag=axis.tag, - name=axis.name, - labelNames=axis.labelNames, - hidden=axis.hidden, - # Subset range - minimum=max(range.minimum, axis.minimum), - default=range.default or axis.default, - maximum=min(range.maximum, axis.maximum), - map=[ - (user, design) - for user, design in axis.map - if range.minimum <= user <= range.maximum - ], - # Don't include STAT info - axisOrdering=None, - axisLabels=None, - ) - ) - - subDoc.axisMappings = mappings = [] - subDocAxes = {axis.name for axis in subDoc.axes} - for mapping in doc.axisMappings: - if not all(axis in subDocAxes for axis in mapping.inputLocation.keys()): - continue - if not all(axis in subDocAxes for axis in mapping.outputLocation.keys()): - LOGGER.error( - "In axis mapping from input %s, some output axes are not in the variable-font: %s", - mapping.inputLocation, - mapping.outputLocation, - ) - continue - - mappingAxes = set() - mappingAxes.update(mapping.inputLocation.keys()) - mappingAxes.update(mapping.outputLocation.keys()) - for axis in doc.axes: - if axis.name not in mappingAxes: - continue - range = userRegion[axis.name] - if ( - range.minimum != axis.minimum - or (range.default is not None and range.default != axis.default) - or range.maximum != axis.maximum - ): - LOGGER.error( - "Limiting axis ranges used in elements not supported: %s", - axis.name, - ) - continue - - mappings.append( - AxisMappingDescriptor( - inputLocation=mapping.inputLocation, - outputLocation=mapping.outputLocation, - ) - ) - - # Don't include STAT info - # subDoc.locationLabels = doc.locationLabels - - # Rules: subset them based on conditions - designRegion = userRegionToDesignRegion(doc, userRegion) - subDoc.rules = _subsetRulesBasedOnConditions(doc.rules, designRegion) - subDoc.rulesProcessingLast = doc.rulesProcessingLast - - # Sources: keep only the ones that fall within the kept axis ranges - for source in doc.sources: - if not locationInRegion(doc.map_backward(source.designLocation), userRegion): - continue - - subDoc.addSource( - SourceDescriptor( - filename=source.filename, - path=source.path, - font=source.font, - name=source.name, - designLocation=_filterLocation( - userRegion, maybeExpandDesignLocation(source) - ), - layerName=source.layerName, - familyName=source.familyName, - styleName=source.styleName, - muteKerning=source.muteKerning, - muteInfo=source.muteInfo, - mutedGlyphNames=source.mutedGlyphNames, - ) - ) - - # Copy family name translations from the old default source to the new default - vfDefault = subDoc.findDefault() - oldDefault = doc.findDefault() - if vfDefault is not None and oldDefault is not None: - vfDefault.localisedFamilyName = oldDefault.localisedFamilyName - - # Variable fonts: keep only the ones that fall within the kept axis ranges - if keepVFs: - # Note: call getVariableFont() to make the implicit VFs explicit - for vf in doc.getVariableFonts(): - vfUserRegion = getVFUserRegion(doc, vf) - if regionInRegion(vfUserRegion, userRegion): - subDoc.addVariableFont( - VariableFontDescriptor( - name=vf.name, - filename=vf.filename, - axisSubsets=[ - axisSubset - for axisSubset in vf.axisSubsets - if isinstance(userRegion[axisSubset.name], Range) - ], - lib=vf.lib, - ) - ) - - # Instances: same as Sources + compute missing names - for instance in doc.instances: - if not locationInRegion(instance.getFullUserLocation(doc), userRegion): - continue - - if makeNames: - statNames = getStatNames(doc, instance.getFullUserLocation(doc)) - familyName = instance.familyName or statNames.familyNames.get("en") - styleName = instance.styleName or statNames.styleNames.get("en") - subDoc.addInstance( - InstanceDescriptor( - filename=instance.filename - or makeInstanceFilename(doc, instance, statNames), - path=instance.path, - font=instance.font, - name=instance.name or f"{familyName} {styleName}", - userLocation={} if expandLocations else instance.userLocation, - designLocation=_filterLocation( - userRegion, maybeExpandDesignLocation(instance) - ), - familyName=familyName, - styleName=styleName, - postScriptFontName=instance.postScriptFontName - or statNames.postScriptFontName, - styleMapFamilyName=instance.styleMapFamilyName - or statNames.styleMapFamilyNames.get("en"), - styleMapStyleName=instance.styleMapStyleName - or statNames.styleMapStyleName, - localisedFamilyName=instance.localisedFamilyName - or statNames.familyNames, - localisedStyleName=instance.localisedStyleName - or statNames.styleNames, - localisedStyleMapFamilyName=instance.localisedStyleMapFamilyName - or statNames.styleMapFamilyNames, - localisedStyleMapStyleName=instance.localisedStyleMapStyleName - or {}, - lib=instance.lib, - ) - ) - else: - subDoc.addInstance( - InstanceDescriptor( - filename=instance.filename, - path=instance.path, - font=instance.font, - name=instance.name, - userLocation={} if expandLocations else instance.userLocation, - designLocation=_filterLocation( - userRegion, maybeExpandDesignLocation(instance) - ), - familyName=instance.familyName, - styleName=instance.styleName, - postScriptFontName=instance.postScriptFontName, - styleMapFamilyName=instance.styleMapFamilyName, - styleMapStyleName=instance.styleMapStyleName, - localisedFamilyName=instance.localisedFamilyName, - localisedStyleName=instance.localisedStyleName, - localisedStyleMapFamilyName=instance.localisedStyleMapFamilyName, - localisedStyleMapStyleName=instance.localisedStyleMapStyleName, - lib=instance.lib, - ) - ) - - subDoc.lib = doc.lib - - return subDoc - - -def _conditionSetFrom(conditionSet: List[Dict[str, Any]]) -> ConditionSet: - c: Dict[str, Range] = {} - for condition in conditionSet: - minimum, maximum = condition.get("minimum"), condition.get("maximum") - c[condition["name"]] = Range( - minimum if minimum is not None else -math.inf, - maximum if maximum is not None else math.inf, - ) - return c - - -def _subsetRulesBasedOnConditions( - rules: List[RuleDescriptor], designRegion: Region -) -> List[RuleDescriptor]: - # What rules to keep: - # - Keep the rule if any conditionset is relevant. - # - A conditionset is relevant if all conditions are relevant or it is empty. - # - A condition is relevant if - # - axis is point (C-AP), - # - and point in condition's range (C-AP-in) - # (in this case remove the condition because it's always true) - # - else (C-AP-out) whole conditionset can be discarded (condition false - # => conditionset false) - # - axis is range (C-AR), - # - (C-AR-all) and axis range fully contained in condition range: we can - # scrap the condition because it's always true - # - (C-AR-inter) and intersection(axis range, condition range) not empty: - # keep the condition with the smaller range (= intersection) - # - (C-AR-none) else, whole conditionset can be discarded - newRules: List[RuleDescriptor] = [] - for rule in rules: - newRule: RuleDescriptor = RuleDescriptor( - name=rule.name, conditionSets=[], subs=rule.subs - ) - for conditionset in rule.conditionSets: - cs = _conditionSetFrom(conditionset) - newConditionset: List[Dict[str, Any]] = [] - discardConditionset = False - for selectionName, selectionValue in designRegion.items(): - # TODO: Ensure that all(key in conditionset for key in region.keys())? - if selectionName not in cs: - # raise Exception("Selection has different axes than the rules") - continue - if isinstance(selectionValue, (float, int)): # is point - # Case C-AP-in - if selectionValue in cs[selectionName]: - pass # always matches, conditionset can stay empty for this one. - # Case C-AP-out - else: - discardConditionset = True - else: # is range - # Case C-AR-all - if selectionValue in cs[selectionName]: - pass # always matches, conditionset can stay empty for this one. - else: - intersection = cs[selectionName].intersection(selectionValue) - # Case C-AR-inter - if intersection is not None: - newConditionset.append( - { - "name": selectionName, - "minimum": intersection.minimum, - "maximum": intersection.maximum, - } - ) - # Case C-AR-none - else: - discardConditionset = True - if not discardConditionset: - newRule.conditionSets.append(newConditionset) - if newRule.conditionSets: - newRules.append(newRule) - - return newRules - - -def _filterLocation( - userRegion: Region, - location: Dict[str, float], -) -> Dict[str, float]: - return { - name: value - for name, value in location.items() - if name in userRegion and isinstance(userRegion[name], Range) - } diff --git a/.venv/Lib/site-packages/fontTools/designspaceLib/statNames.py b/.venv/Lib/site-packages/fontTools/designspaceLib/statNames.py deleted file mode 100644 index 1474e5f..0000000 --- a/.venv/Lib/site-packages/fontTools/designspaceLib/statNames.py +++ /dev/null @@ -1,253 +0,0 @@ -"""Compute name information for a given location in user-space coordinates -using STAT data. This can be used to fill-in automatically the names of an -instance: - -.. code:: python - - instance = doc.instances[0] - names = getStatNames(doc, instance.getFullUserLocation(doc)) - print(names.styleNames) -""" - -from __future__ import annotations - -from dataclasses import dataclass -from typing import Dict, Optional, Tuple, Union -import logging - -from fontTools.designspaceLib import ( - AxisDescriptor, - AxisLabelDescriptor, - DesignSpaceDocument, - DesignSpaceDocumentError, - DiscreteAxisDescriptor, - SimpleLocationDict, - SourceDescriptor, -) - -LOGGER = logging.getLogger(__name__) - -# TODO(Python 3.8): use Literal -# RibbiStyleName = Union[Literal["regular"], Literal["bold"], Literal["italic"], Literal["bold italic"]] -RibbiStyle = str -BOLD_ITALIC_TO_RIBBI_STYLE = { - (False, False): "regular", - (False, True): "italic", - (True, False): "bold", - (True, True): "bold italic", -} - - -@dataclass -class StatNames: - """Name data generated from the STAT table information.""" - - familyNames: Dict[str, str] - styleNames: Dict[str, str] - postScriptFontName: Optional[str] - styleMapFamilyNames: Dict[str, str] - styleMapStyleName: Optional[RibbiStyle] - - -def getStatNames( - doc: DesignSpaceDocument, userLocation: SimpleLocationDict -) -> StatNames: - """Compute the family, style, PostScript names of the given ``userLocation`` - using the document's STAT information. - - Also computes localizations. - - If not enough STAT data is available for a given name, either its dict of - localized names will be empty (family and style names), or the name will be - None (PostScript name). - - .. versionadded:: 5.0 - """ - familyNames: Dict[str, str] = {} - defaultSource: Optional[SourceDescriptor] = doc.findDefault() - if defaultSource is None: - LOGGER.warning("Cannot determine default source to look up family name.") - elif defaultSource.familyName is None: - LOGGER.warning( - "Cannot look up family name, assign the 'familyname' attribute to the default source." - ) - else: - familyNames = { - "en": defaultSource.familyName, - **defaultSource.localisedFamilyName, - } - - styleNames: Dict[str, str] = {} - # If a free-standing label matches the location, use it for name generation. - label = doc.labelForUserLocation(userLocation) - if label is not None: - styleNames = {"en": label.name, **label.labelNames} - # Otherwise, scour the axis labels for matches. - else: - # Gather all languages in which at least one translation is provided - # Then build names for all these languages, but fallback to English - # whenever a translation is missing. - labels = _getAxisLabelsForUserLocation(doc.axes, userLocation) - if labels: - languages = set( - language for label in labels for language in label.labelNames - ) - languages.add("en") - for language in languages: - styleName = " ".join( - label.labelNames.get(language, label.defaultName) - for label in labels - if not label.elidable - ) - if not styleName and doc.elidedFallbackName is not None: - styleName = doc.elidedFallbackName - styleNames[language] = styleName - - if "en" not in familyNames or "en" not in styleNames: - # Not enough information to compute PS names of styleMap names - return StatNames( - familyNames=familyNames, - styleNames=styleNames, - postScriptFontName=None, - styleMapFamilyNames={}, - styleMapStyleName=None, - ) - - postScriptFontName = f"{familyNames['en']}-{styleNames['en']}".replace(" ", "") - - styleMapStyleName, regularUserLocation = _getRibbiStyle(doc, userLocation) - - styleNamesForStyleMap = styleNames - if regularUserLocation != userLocation: - regularStatNames = getStatNames(doc, regularUserLocation) - styleNamesForStyleMap = regularStatNames.styleNames - - styleMapFamilyNames = {} - for language in set(familyNames).union(styleNames.keys()): - familyName = familyNames.get(language, familyNames["en"]) - styleName = styleNamesForStyleMap.get(language, styleNamesForStyleMap["en"]) - styleMapFamilyNames[language] = (familyName + " " + styleName).strip() - - return StatNames( - familyNames=familyNames, - styleNames=styleNames, - postScriptFontName=postScriptFontName, - styleMapFamilyNames=styleMapFamilyNames, - styleMapStyleName=styleMapStyleName, - ) - - -def _getSortedAxisLabels( - axes: list[Union[AxisDescriptor, DiscreteAxisDescriptor]], -) -> Dict[str, list[AxisLabelDescriptor]]: - """Returns axis labels sorted by their ordering, with unordered ones appended as - they are listed.""" - - # First, get the axis labels with explicit ordering... - sortedAxes = sorted( - (axis for axis in axes if axis.axisOrdering is not None), - key=lambda a: a.axisOrdering, - ) - sortedLabels: Dict[str, list[AxisLabelDescriptor]] = { - axis.name: axis.axisLabels for axis in sortedAxes - } - - # ... then append the others in the order they appear. - # NOTE: This relies on Python 3.7+ dict's preserved insertion order. - for axis in axes: - if axis.axisOrdering is None: - sortedLabels[axis.name] = axis.axisLabels - - return sortedLabels - - -def _getAxisLabelsForUserLocation( - axes: list[Union[AxisDescriptor, DiscreteAxisDescriptor]], - userLocation: SimpleLocationDict, -) -> list[AxisLabelDescriptor]: - labels: list[AxisLabelDescriptor] = [] - - allAxisLabels = _getSortedAxisLabels(axes) - if allAxisLabels.keys() != userLocation.keys(): - LOGGER.warning( - f"Mismatch between user location '{userLocation.keys()}' and available " - f"labels for '{allAxisLabels.keys()}'." - ) - - for axisName, axisLabels in allAxisLabels.items(): - userValue = userLocation[axisName] - label: Optional[AxisLabelDescriptor] = next( - ( - l - for l in axisLabels - if l.userValue == userValue - or ( - l.userMinimum is not None - and l.userMaximum is not None - and l.userMinimum <= userValue <= l.userMaximum - ) - ), - None, - ) - if label is None: - LOGGER.debug( - f"Document needs a label for axis '{axisName}', user value '{userValue}'." - ) - else: - labels.append(label) - - return labels - - -def _getRibbiStyle( - self: DesignSpaceDocument, userLocation: SimpleLocationDict -) -> Tuple[RibbiStyle, SimpleLocationDict]: - """Compute the RIBBI style name of the given user location, - return the location of the matching Regular in the RIBBI group. - - .. versionadded:: 5.0 - """ - regularUserLocation = {} - axes_by_tag = {axis.tag: axis for axis in self.axes} - - bold: bool = False - italic: bool = False - - axis = axes_by_tag.get("wght") - if axis is not None: - for regular_label in axis.axisLabels: - if ( - regular_label.linkedUserValue == userLocation[axis.name] - # In the "recursive" case where both the Regular has - # linkedUserValue pointing the Bold, and the Bold has - # linkedUserValue pointing to the Regular, only consider the - # first case: Regular (e.g. 400) has linkedUserValue pointing to - # Bold (e.g. 700, higher than Regular) - and regular_label.userValue < regular_label.linkedUserValue - ): - regularUserLocation[axis.name] = regular_label.userValue - bold = True - break - - axis = axes_by_tag.get("ital") or axes_by_tag.get("slnt") - if axis is not None: - for upright_label in axis.axisLabels: - if ( - upright_label.linkedUserValue == userLocation[axis.name] - # In the "recursive" case where both the Upright has - # linkedUserValue pointing the Italic, and the Italic has - # linkedUserValue pointing to the Upright, only consider the - # first case: Upright (e.g. ital=0, slant=0) has - # linkedUserValue pointing to Italic (e.g ital=1, slant=-12 or - # slant=12 for backwards italics, in any case higher than - # Upright in absolute value, hence the abs() below. - and abs(upright_label.userValue) < abs(upright_label.linkedUserValue) - ): - regularUserLocation[axis.name] = upright_label.userValue - italic = True - break - - return BOLD_ITALIC_TO_RIBBI_STYLE[bold, italic], { - **userLocation, - **regularUserLocation, - } diff --git a/.venv/Lib/site-packages/fontTools/designspaceLib/types.py b/.venv/Lib/site-packages/fontTools/designspaceLib/types.py deleted file mode 100644 index 80ba9d6..0000000 --- a/.venv/Lib/site-packages/fontTools/designspaceLib/types.py +++ /dev/null @@ -1,147 +0,0 @@ -from __future__ import annotations - -from dataclasses import dataclass -from typing import Dict, List, Optional, Union, cast - -from fontTools.designspaceLib import ( - AxisDescriptor, - DesignSpaceDocument, - DesignSpaceDocumentError, - RangeAxisSubsetDescriptor, - SimpleLocationDict, - ValueAxisSubsetDescriptor, - VariableFontDescriptor, -) - - -def clamp(value, minimum, maximum): - return min(max(value, minimum), maximum) - - -@dataclass -class Range: - minimum: float - """Inclusive minimum of the range.""" - maximum: float - """Inclusive maximum of the range.""" - default: float = 0 - """Default value""" - - def __post_init__(self): - self.minimum, self.maximum = sorted((self.minimum, self.maximum)) - self.default = clamp(self.default, self.minimum, self.maximum) - - def __contains__(self, value: Union[float, Range]) -> bool: - if isinstance(value, Range): - return self.minimum <= value.minimum and value.maximum <= self.maximum - return self.minimum <= value <= self.maximum - - def intersection(self, other: Range) -> Optional[Range]: - if self.maximum < other.minimum or self.minimum > other.maximum: - return None - else: - return Range( - max(self.minimum, other.minimum), - min(self.maximum, other.maximum), - self.default, # We don't care about the default in this use-case - ) - - -# A region selection is either a range or a single value, as a Designspace v5 -# axis-subset element only allows a single discrete value or a range for a -# variable-font element. -Region = Dict[str, Union[Range, float]] - -# A conditionset is a set of named ranges. -ConditionSet = Dict[str, Range] - -# A rule is a list of conditionsets where any has to be relevant for the whole rule to be relevant. -Rule = List[ConditionSet] -Rules = Dict[str, Rule] - - -def locationInRegion(location: SimpleLocationDict, region: Region) -> bool: - for name, value in location.items(): - if name not in region: - return False - regionValue = region[name] - if isinstance(regionValue, (float, int)): - if value != regionValue: - return False - else: - if value not in regionValue: - return False - return True - - -def regionInRegion(region: Region, superRegion: Region) -> bool: - for name, value in region.items(): - if not name in superRegion: - return False - superValue = superRegion[name] - if isinstance(superValue, (float, int)): - if value != superValue: - return False - else: - if value not in superValue: - return False - return True - - -def userRegionToDesignRegion(doc: DesignSpaceDocument, userRegion: Region) -> Region: - designRegion = {} - for name, value in userRegion.items(): - axis = doc.getAxis(name) - if axis is None: - raise DesignSpaceDocumentError( - f"Cannot find axis named '{name}' for region." - ) - if isinstance(value, (float, int)): - designRegion[name] = axis.map_forward(value) - else: - designRegion[name] = Range( - axis.map_forward(value.minimum), - axis.map_forward(value.maximum), - axis.map_forward(value.default), - ) - return designRegion - - -def getVFUserRegion(doc: DesignSpaceDocument, vf: VariableFontDescriptor) -> Region: - vfUserRegion: Region = {} - # For each axis, 2 cases: - # - it has a range = it's an axis in the VF DS - # - it's a single location = use it to know which rules should apply in the VF - for axisSubset in vf.axisSubsets: - axis = doc.getAxis(axisSubset.name) - if axis is None: - raise DesignSpaceDocumentError( - f"Cannot find axis named '{axisSubset.name}' for variable font '{vf.name}'." - ) - if hasattr(axisSubset, "userMinimum"): - # Mypy doesn't support narrowing union types via hasattr() - # TODO(Python 3.10): use TypeGuard - # https://mypy.readthedocs.io/en/stable/type_narrowing.html - axisSubset = cast(RangeAxisSubsetDescriptor, axisSubset) - if not hasattr(axis, "minimum"): - raise DesignSpaceDocumentError( - f"Cannot select a range over '{axis.name}' for variable font '{vf.name}' " - "because it's a discrete axis, use only 'userValue' instead." - ) - axis = cast(AxisDescriptor, axis) - vfUserRegion[axis.name] = Range( - max(axisSubset.userMinimum, axis.minimum), - min(axisSubset.userMaximum, axis.maximum), - axisSubset.userDefault or axis.default, - ) - else: - axisSubset = cast(ValueAxisSubsetDescriptor, axisSubset) - vfUserRegion[axis.name] = axisSubset.userValue - # Any axis not mentioned explicitly has a single location = default value - for axis in doc.axes: - if axis.name not in vfUserRegion: - assert isinstance( - axis.default, (int, float) - ), f"Axis '{axis.name}' has no valid default value." - vfUserRegion[axis.name] = axis.default - return vfUserRegion diff --git a/.venv/Lib/site-packages/fontTools/encodings/MacRoman.py b/.venv/Lib/site-packages/fontTools/encodings/MacRoman.py deleted file mode 100644 index ba8bf14..0000000 --- a/.venv/Lib/site-packages/fontTools/encodings/MacRoman.py +++ /dev/null @@ -1,258 +0,0 @@ -MacRoman = [ - "NUL", - "Eth", - "eth", - "Lslash", - "lslash", - "Scaron", - "scaron", - "Yacute", - "yacute", - "HT", - "LF", - "Thorn", - "thorn", - "CR", - "Zcaron", - "zcaron", - "DLE", - "DC1", - "DC2", - "DC3", - "DC4", - "onehalf", - "onequarter", - "onesuperior", - "threequarters", - "threesuperior", - "twosuperior", - "brokenbar", - "minus", - "multiply", - "RS", - "US", - "space", - "exclam", - "quotedbl", - "numbersign", - "dollar", - "percent", - "ampersand", - "quotesingle", - "parenleft", - "parenright", - "asterisk", - "plus", - "comma", - "hyphen", - "period", - "slash", - "zero", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - "colon", - "semicolon", - "less", - "equal", - "greater", - "question", - "at", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "bracketleft", - "backslash", - "bracketright", - "asciicircum", - "underscore", - "grave", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "braceleft", - "bar", - "braceright", - "asciitilde", - "DEL", - "Adieresis", - "Aring", - "Ccedilla", - "Eacute", - "Ntilde", - "Odieresis", - "Udieresis", - "aacute", - "agrave", - "acircumflex", - "adieresis", - "atilde", - "aring", - "ccedilla", - "eacute", - "egrave", - "ecircumflex", - "edieresis", - "iacute", - "igrave", - "icircumflex", - "idieresis", - "ntilde", - "oacute", - "ograve", - "ocircumflex", - "odieresis", - "otilde", - "uacute", - "ugrave", - "ucircumflex", - "udieresis", - "dagger", - "degree", - "cent", - "sterling", - "section", - "bullet", - "paragraph", - "germandbls", - "registered", - "copyright", - "trademark", - "acute", - "dieresis", - "notequal", - "AE", - "Oslash", - "infinity", - "plusminus", - "lessequal", - "greaterequal", - "yen", - "mu", - "partialdiff", - "summation", - "product", - "pi", - "integral", - "ordfeminine", - "ordmasculine", - "Omega", - "ae", - "oslash", - "questiondown", - "exclamdown", - "logicalnot", - "radical", - "florin", - "approxequal", - "Delta", - "guillemotleft", - "guillemotright", - "ellipsis", - "nbspace", - "Agrave", - "Atilde", - "Otilde", - "OE", - "oe", - "endash", - "emdash", - "quotedblleft", - "quotedblright", - "quoteleft", - "quoteright", - "divide", - "lozenge", - "ydieresis", - "Ydieresis", - "fraction", - "currency", - "guilsinglleft", - "guilsinglright", - "fi", - "fl", - "daggerdbl", - "periodcentered", - "quotesinglbase", - "quotedblbase", - "perthousand", - "Acircumflex", - "Ecircumflex", - "Aacute", - "Edieresis", - "Egrave", - "Iacute", - "Icircumflex", - "Idieresis", - "Igrave", - "Oacute", - "Ocircumflex", - "apple", - "Ograve", - "Uacute", - "Ucircumflex", - "Ugrave", - "dotlessi", - "circumflex", - "tilde", - "macron", - "breve", - "dotaccent", - "ring", - "cedilla", - "hungarumlaut", - "ogonek", - "caron", -] diff --git a/.venv/Lib/site-packages/fontTools/encodings/StandardEncoding.py b/.venv/Lib/site-packages/fontTools/encodings/StandardEncoding.py deleted file mode 100644 index bf13886..0000000 --- a/.venv/Lib/site-packages/fontTools/encodings/StandardEncoding.py +++ /dev/null @@ -1,258 +0,0 @@ -StandardEncoding = [ - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - "space", - "exclam", - "quotedbl", - "numbersign", - "dollar", - "percent", - "ampersand", - "quoteright", - "parenleft", - "parenright", - "asterisk", - "plus", - "comma", - "hyphen", - "period", - "slash", - "zero", - "one", - "two", - "three", - "four", - "five", - "six", - "seven", - "eight", - "nine", - "colon", - "semicolon", - "less", - "equal", - "greater", - "question", - "at", - "A", - "B", - "C", - "D", - "E", - "F", - "G", - "H", - "I", - "J", - "K", - "L", - "M", - "N", - "O", - "P", - "Q", - "R", - "S", - "T", - "U", - "V", - "W", - "X", - "Y", - "Z", - "bracketleft", - "backslash", - "bracketright", - "asciicircum", - "underscore", - "quoteleft", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "braceleft", - "bar", - "braceright", - "asciitilde", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - "exclamdown", - "cent", - "sterling", - "fraction", - "yen", - "florin", - "section", - "currency", - "quotesingle", - "quotedblleft", - "guillemotleft", - "guilsinglleft", - "guilsinglright", - "fi", - "fl", - ".notdef", - "endash", - "dagger", - "daggerdbl", - "periodcentered", - ".notdef", - "paragraph", - "bullet", - "quotesinglbase", - "quotedblbase", - "quotedblright", - "guillemotright", - "ellipsis", - "perthousand", - ".notdef", - "questiondown", - ".notdef", - "grave", - "acute", - "circumflex", - "tilde", - "macron", - "breve", - "dotaccent", - "dieresis", - ".notdef", - "ring", - "cedilla", - ".notdef", - "hungarumlaut", - "ogonek", - "caron", - "emdash", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - "AE", - ".notdef", - "ordfeminine", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - "Lslash", - "Oslash", - "OE", - "ordmasculine", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - ".notdef", - "ae", - ".notdef", - ".notdef", - ".notdef", - "dotlessi", - ".notdef", - ".notdef", - "lslash", - "oslash", - "oe", - "germandbls", - ".notdef", - ".notdef", - ".notdef", - ".notdef", -] diff --git a/.venv/Lib/site-packages/fontTools/encodings/__init__.py b/.venv/Lib/site-packages/fontTools/encodings/__init__.py deleted file mode 100644 index 156cb23..0000000 --- a/.venv/Lib/site-packages/fontTools/encodings/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Empty __init__.py file to signal Python this directory is a package.""" diff --git a/.venv/Lib/site-packages/fontTools/encodings/__pycache__/MacRoman.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/encodings/__pycache__/MacRoman.cpython-311.pyc deleted file mode 100644 index 107c619bdd16e82fb301081f236cf818260f04e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2312 zcmYjT&2Aev5MHjNl~%I-1_5$x4o&Q|r=lpJSW4nnv0BS&nm|B7?Q&PFxJ!jUw&hbF zp|{?9Df&utEzom-+;ZwHNy(B8az^|}&fhoG-^a)O2tVwuZQ7FQIe2lB$M|aZ`ML1tR2TPS< z3I-@^yJ3n;1;=Kk*ltM&b-y|=w{owfOC{H=UQz{}iq}>{ud>4Mjo3nbHG_CQgO1+N z3|(M%nV=Q)K3Hj3z7)`}ZM9@d^Aa7-r4V>Z7j4K`Z6Ku;ikj9r4BQUQ>ryaCH&n4& zu);v!iHesi13jwI53bkH-Uu|KlgX;0kgT?w6~p75YdPBD!ri`SNB9=n%^Ou-QeyHb9c0BjvMe~ff-6QtGE~2f@!?5iI{+HsTgfSiheR}I6`A; zfDD1W0CEmw1Y`{4C6HG@UIV!R@;#6rfJ}hA0dfgs3gky1KLNP{G6QlAWDewKAa8;E z0^}W#_b^y0nyr~}VMv!Kd%upt_dX^Asx!_rt}2E)2?eqQk^#wq zpjrSafvkXVAin`w0}((fAT_5Cud7L4Pce8z8qp?tpB8+yj;ZrrBB4YU-iy zbZ<%DSz@@zF|ecY1kz#7nPQq_+=dD>3%&D<27FD5jgsCQ;S zy`zO-cUU|JIDblq`fIZNH7p#!!U62?0JJ68m+*k&0T&|bFX9il+Fz8&fR_O;56_hk zcp30E;BCO$L%e;!=d>)bu96%LZi>~>q}P8HDs`g0opcA2(J= zrKQl&SFGgCE|x=@$<5ZMC^d@atfFcS9dA%?e|4`$#=7c`hhs>lzSw%aE_lt&7H>kz zdHSaf7d-YTFu`lBEfOiNEDX>r!>P!5Q6P&f($tyV-6)yc%s{;1fM=T~F9JK0$_u2L z}0QohQoy5o2G!f^)ht0q0eA444Iw!Ii8LomQ4q&bJy%y z<>sSZCv>Da-f1BpPW64xiT>*(=QkW#)D`lc)g|`B?LJNEyS>;ekc=*@z04|XnAz4l zpZKoX6q+lS6K9Cqv!t5A-T|i#5RLDV^*wudP{o7s zfszb;d8OmMwaGXH?!qq(E)MYN#RKjl;HCjLJ-~G^hxk4u(}0-=%=`e8%>807Z?dX2 zhyKB8C#0>SS@Q;WmI}K+#zPv4T?5~wwre5XT?aW@*}A04R)SiCC0OEng6whc@8uH$ zy*D(wlE}M%qEF2)gU^3t-z?@DyYPZ3doeRed|NF> zuV1`fTt7cOJzbogJ)X(J+~V`MI6Zs(YJRaW&BCu(n2V?QOx-Lde7VrvurKk!UDJ~3 zMImc*Ev3-UumrI8)TMs5v+C()`?>dRg`^YgJC)$C6a0_#BOE@q2q7QiVf!fl7(I-? K_nJS|M%@21ho3Y6 diff --git a/.venv/Lib/site-packages/fontTools/encodings/__pycache__/StandardEncoding.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/encodings/__pycache__/StandardEncoding.cpython-311.pyc deleted file mode 100644 index ffaed9d3dab8e63516a8318e4aa2918ec79e7259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1904 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 J<=fhT{tfC6wZH%X diff --git a/.venv/Lib/site-packages/fontTools/encodings/codecs.py b/.venv/Lib/site-packages/fontTools/encodings/codecs.py deleted file mode 100644 index 3ac0268..0000000 --- a/.venv/Lib/site-packages/fontTools/encodings/codecs.py +++ /dev/null @@ -1,135 +0,0 @@ -"""Extend the Python codecs module with a few encodings that are used in OpenType (name table) -but missing from Python. See https://github.com/fonttools/fonttools/issues/236 for details.""" - -import codecs -import encodings - - -class ExtendCodec(codecs.Codec): - def __init__(self, name, base_encoding, mapping): - self.name = name - self.base_encoding = base_encoding - self.mapping = mapping - self.reverse = {v: k for k, v in mapping.items()} - self.max_len = max(len(v) for v in mapping.values()) - self.info = codecs.CodecInfo( - name=self.name, encode=self.encode, decode=self.decode - ) - codecs.register_error(name, self.error) - - def _map(self, mapper, output_type, exc_type, input, errors): - base_error_handler = codecs.lookup_error(errors) - length = len(input) - out = output_type() - while input: - # first try to use self.error as the error handler - try: - part = mapper(input, self.base_encoding, errors=self.name) - out += part - break # All converted - except exc_type as e: - # else convert the correct part, handle error as requested and continue - out += mapper(input[: e.start], self.base_encoding, self.name) - replacement, pos = base_error_handler(e) - out += replacement - input = input[pos:] - return out, length - - def encode(self, input, errors="strict"): - return self._map(codecs.encode, bytes, UnicodeEncodeError, input, errors) - - def decode(self, input, errors="strict"): - return self._map(codecs.decode, str, UnicodeDecodeError, input, errors) - - def error(self, e): - if isinstance(e, UnicodeDecodeError): - for end in range(e.start + 1, e.end + 1): - s = e.object[e.start : end] - if s in self.mapping: - return self.mapping[s], end - elif isinstance(e, UnicodeEncodeError): - for end in range(e.start + 1, e.start + self.max_len + 1): - s = e.object[e.start : end] - if s in self.reverse: - return self.reverse[s], end - e.encoding = self.name - raise e - - -_extended_encodings = { - "x_mac_japanese_ttx": ( - "shift_jis", - { - b"\xFC": chr(0x007C), - b"\x7E": chr(0x007E), - b"\x80": chr(0x005C), - b"\xA0": chr(0x00A0), - b"\xFD": chr(0x00A9), - b"\xFE": chr(0x2122), - b"\xFF": chr(0x2026), - }, - ), - "x_mac_trad_chinese_ttx": ( - "big5", - { - b"\x80": chr(0x005C), - b"\xA0": chr(0x00A0), - b"\xFD": chr(0x00A9), - b"\xFE": chr(0x2122), - b"\xFF": chr(0x2026), - }, - ), - "x_mac_korean_ttx": ( - "euc_kr", - { - b"\x80": chr(0x00A0), - b"\x81": chr(0x20A9), - b"\x82": chr(0x2014), - b"\x83": chr(0x00A9), - b"\xFE": chr(0x2122), - b"\xFF": chr(0x2026), - }, - ), - "x_mac_simp_chinese_ttx": ( - "gb2312", - { - b"\x80": chr(0x00FC), - b"\xA0": chr(0x00A0), - b"\xFD": chr(0x00A9), - b"\xFE": chr(0x2122), - b"\xFF": chr(0x2026), - }, - ), -} - -_cache = {} - - -def search_function(name): - name = encodings.normalize_encoding(name) # Rather undocumented... - if name in _extended_encodings: - if name not in _cache: - base_encoding, mapping = _extended_encodings[name] - assert name[-4:] == "_ttx" - # Python 2 didn't have any of the encodings that we are implementing - # in this file. Python 3 added aliases for the East Asian ones, mapping - # them "temporarily" to the same base encoding as us, with a comment - # suggesting that full implementation will appear some time later. - # As such, try the Python version of the x_mac_... first, if that is found, - # use *that* as our base encoding. This would make our encoding upgrade - # to the full encoding when and if Python finally implements that. - # http://bugs.python.org/issue24041 - base_encodings = [name[:-4], base_encoding] - for base_encoding in base_encodings: - try: - codecs.lookup(base_encoding) - except LookupError: - continue - _cache[name] = ExtendCodec(name, base_encoding, mapping) - break - return _cache[name].info - - return None - - -codecs.register(search_function) diff --git a/.venv/Lib/site-packages/fontTools/feaLib/__init__.py b/.venv/Lib/site-packages/fontTools/feaLib/__init__.py deleted file mode 100644 index ae532cd..0000000 --- a/.venv/Lib/site-packages/fontTools/feaLib/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""fontTools.feaLib -- a package for dealing with OpenType feature files.""" - -# The structure of OpenType feature files is defined here: -# http://www.adobe.com/devnet/opentype/afdko/topic_feature_file_syntax.html diff --git a/.venv/Lib/site-packages/fontTools/feaLib/__main__.py b/.venv/Lib/site-packages/fontTools/feaLib/__main__.py deleted file mode 100644 index a45230e..0000000 --- a/.venv/Lib/site-packages/fontTools/feaLib/__main__.py +++ /dev/null @@ -1,78 +0,0 @@ -from fontTools.ttLib import TTFont -from fontTools.feaLib.builder import addOpenTypeFeatures, Builder -from fontTools.feaLib.error import FeatureLibError -from fontTools import configLogger -from fontTools.misc.cliTools import makeOutputFileName -import sys -import argparse -import logging - - -log = logging.getLogger("fontTools.feaLib") - - -def main(args=None): - """Add features from a feature file (.fea) into an OTF font""" - parser = argparse.ArgumentParser( - description="Use fontTools to compile OpenType feature files (*.fea)." - ) - parser.add_argument( - "input_fea", metavar="FEATURES", help="Path to the feature file" - ) - parser.add_argument( - "input_font", metavar="INPUT_FONT", help="Path to the input font" - ) - parser.add_argument( - "-o", - "--output", - dest="output_font", - metavar="OUTPUT_FONT", - help="Path to the output font.", - ) - parser.add_argument( - "-t", - "--tables", - metavar="TABLE_TAG", - choices=Builder.supportedTables, - nargs="+", - help="Specify the table(s) to be built.", - ) - parser.add_argument( - "-d", - "--debug", - action="store_true", - help="Add source-level debugging information to font.", - ) - parser.add_argument( - "-v", - "--verbose", - help="Increase the logger verbosity. Multiple -v " "options are allowed.", - action="count", - default=0, - ) - parser.add_argument( - "--traceback", help="show traceback for exceptions.", action="store_true" - ) - options = parser.parse_args(args) - - levels = ["WARNING", "INFO", "DEBUG"] - configLogger(level=levels[min(len(levels) - 1, options.verbose)]) - - output_font = options.output_font or makeOutputFileName(options.input_font) - log.info("Compiling features to '%s'" % (output_font)) - - font = TTFont(options.input_font) - try: - addOpenTypeFeatures( - font, options.input_fea, tables=options.tables, debug=options.debug - ) - except FeatureLibError as e: - if options.traceback: - raise - log.error(e) - sys.exit(1) - font.save(output_font) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/.venv/Lib/site-packages/fontTools/feaLib/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/feaLib/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index c5969aaad6685e2f5560e91036db7f2b4560723f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 334 zcmX|7%SyvQ6rHH32wnIGv+W{j;!?zg6dzFQqA7x07^azDlaP23Ef8$c! z3a*9jx^jZ8hs%A#J?Fl3ItRo9zpwKTAHUjSgJ7L3+m&Y`$Q=>Eh;+9e&vRAVRH@QL zIr4#=&@iN&Hawg10%@)^7063j7j!P|J-unLP8W@zAh%BYC`&Zaup4~tF(y>T*ehAK z=T=YIF^mmr1E>X7v~q?|V2BSkE0q(_S5sGEZ4pM+3F#{6U!L7UdKAYoBncg<+|Id1 zh!c7-z5?40Sm7i@GpuLe$%2stmrd>c{ncX-hwaX_vfwSju@@9T%no@&J1+qqQIiI^} z#=SUVDJ@QfR$7M&;Xd5IcWeh}yKVYQtUZng@E{)A8{Pp8yKOBmkvM@*;@9vge0op) zpY1(^&*H(ob1&G#wznN$5ZZX|pl!Nx2%rCruqj%>4&R1o^>jv7ZwKEHyQ7OoDv*vF zt`$hdX4`>S@3!MT)S5StRAwxtK5L-O$|!->s9S1NvW8m}gtpsB*qK8J zk8Vg6h)}nrfUMIUu9vJJdy#eK2&W9Z?HvHToy36mwfOcfJRjxat#in_(4r%B9?_p} zDj;*LHAjW}sLPw#yj+t!4{53p67cX;pnFFfl~A|ziYx8x+lJm)`Sgt zyAzm}0{Cu7&+EX^1r)tlxjc!n3N?Y38g-c(1yyT})nzCk>IGIZqH4Zq8LC!P=aVxk zt0tApizeY1uPZ80vqquBBw7`$OOL5uxX3ldp=kLrF|#yZvhqgJ@#c$AtTM2Qx(I z7d4tQTdHxz9gAVIRL(g*(=sT@ShP$k<1BQhQKnfE)5$8)RnC*k7jqD;WrG$pw!ds8 z=3E?hPSLV#s-<|f;*G^t30*QwQh9r>n59I6pt3F3`F)}`iFs>1uHGu^R=xz`jjgH% zkDRG$l&G4n8*2o|9XV^1ixy=SA}aDFC_9Ue8>9$#)WSiCIUQOU%qW^3?RT#o2G!`CTXr*AVupo8&W3#*Kh`?e2%hm>-3oAQpune z!O3QfeO#1rnbgfV#6rI4h&m}c?!zsmthi8iyHZwkfoS9$iHC+=ij>_P)XxB`O7tuP z?EZ1Q?QL;n!tQxTG}lc>BKPu^BbnMNiMkz$E$t}W4C=TKL*giWGfcj=Bk@x$5R+M` zHrumbWv`?mcd3~s6qABlD4W_+IzjGPS=}h(^ptUzJ5JIIRvG8Zh4j>oYwx9#uTM-& zq%U1k7mQ_V4I-bOxTMZ5&ZR9z$mGiTbbOT*SJUwGB5md^5-UNRwHz_i%nDv5#vw33 z9?xV7TE3Xc#7par#8CPs7|1foT!-^hMc)LE)r05l{zOA`g_M6G0RLv7I@3^)?Egv{ zcp?qhp1w~~wfK#Oh~z=wkr|JyG&nfQ*8hoKyEOMowt(%4*uh~t{F)scZTPuTg((Hl z;2?BlZO$D&aS$G;hez#DuN|Cd1i6fx$pC0@5bl=gwR=w3!M7S-&MGrj01XZT-K>3f z@aJ~VaXZ}mN@I@IPG0>o{R1BM9Q!JC`bp^YwzMA_sfR|YvtI|JHQuW;2U7Ua>ZjS? zo!egiZ0xsVUkIO#fAQl#zP*3ydL8<}R85-Rm!|8|G$3C`hU$@#T4erj(VzTjwth9S zADyp9=c_+EklY{LxPJq5e*TO7;G6r>mAZ7LCSCc)-}`8^9y!17AF2CCs#6V@NA5rH zoUj97Hh=E(*}cS+ZfZT$hGx zt!}bQ_b=mTXCmlv#5a3Ve0=ha*#Ysd12W)_r*&+jLL%Dd^t6w4+_KEYcf%Z6F$eY=CR?qWXY8Dpui-DeF3%gm#hT`XV zbHr-?9iU^3%2JEjUWC5_nGBtP;UCabfQViO@XT|yVBoS&-lEemWHr@10MHNxL9o%; zT6ee6WbH-WMz7bp`-^1XsG+WIBVUz2HtMPJ$3~$le<0D_gVkJJ8K@0j+*iix%2-uw zC|3nI4&C4b0ZDTZ1s?tv Dc|DQ# diff --git a/.venv/Lib/site-packages/fontTools/feaLib/__pycache__/ast.cpython-311.pyc b/.venv/Lib/site-packages/fontTools/feaLib/__pycache__/ast.cpython-311.pyc deleted file mode 100644 index 82c4d1e28fb70cb36c96e09d14c30504feef52b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133874 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 diff --git a/.venv/Lib/site-packages/dateutil/__pycache__/utils.cpython-311.pyc b/.venv/Lib/site-packages/dateutil/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index bb41ed100b8d21669d545850e3d105866e0b0e8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2739 zcmbVO-D_M$6rZ~v-DH!Prixf>WvEDYu~~PcRk^mYt*y1C=E0;0VPSXn&fMK;@5eeb zHy_IuqV%Ck!T4fT1oNQPQU(8%t>mFB2n9j#Ef9R^lV@gkZ@O(P;^p3RXU?5_&Y3g6 z`JMT3Vj_#+s{i@E`%4C)KXhksCHjpW8yYteMN5cUG~ro(Vku$icG64w$)%*9T1r8G zgr=`qOKH0A8d};%GaxfGwSe-YEty?xaEbkpMjpeV>oOs6odrw~4?AJ7%mU5=hhY*> z94YQ`wT9g&a1;*%iQQ0O%818R^6VELc-8$pWR5ry2}9kr2?ul&oQ*u+M40>kXAP#_T2$#K)?|12?pd zO8Z!Z|8$~oD-56&!jFnL4V;5?hB%UpY9(cmV4v#|!+!FxOxlbsOsu) z^`96&_{6cxmn49z%migV_9IDZ<$1QM950M$`Am2v@*$V3yr3e=Bfos+z0)6-7iWvb zV!2ep3!$r4h+ySn37@-kzO3|zNPqQB+eC5XR@rL(fEHw3t4Ec zb<-+@l@d=uL=*7Hw?M3;zn??d12+zBxOYbnZ;c*aKmGgI(_3TDe|7r1bKji%`uw-& ze^5W2`qk}BpSU}HVhiNh+}7A!CpEVNzau9G7IZW`4ct#c<0fjO%kb`9A1B&q0W_O2 z%m-ieyKMnXhcE@_Ew-;#Rgs)CO8amK=?8P9QOAzsJyivPz+lD zVF0q+$TRz&trEWpW8Sto)0N`$rWo80lKpEhX1ek*f z?r?>HP}pj}9RvF)mJxuO$et63Rq9PccA;;~NhLtthcvJc4IRa#vh7~%8t8L#bJ!K3 zZ=%vmSx_zQJQND{7Vw{B%Gla_u=WfA_kS?GCyX{w84RY(C6T8py^Ih2MO~xEC*lxt zN6s!R9yy9K?E28gLEe`lO-{CdL@7S`F$aoJfFk1h5YKC?Z}jn{d!blA6q?x=E@^ zTFiFSlzEDDv%6-bu0VRv_i{R}4>LTdm~rADd^-t`JPraVK8q&yZ=^rHaO1-I*?UvZ zY{)MTu3xw}K6U-|jit_54({KK+&tEM_jH|9FVT5xK0ngUR4PDEl}a~Tskjjw6j-Gq zbjnRFG`_ - - and - - `The Calendar FAQ: Easter `_ - - """ - - if not (1 <= method <= 3): - raise ValueError("invalid method") - - # g - Golden year - 1 - # c - Century - # h - (23 - Epact) mod 30 - # i - Number of days from March 21 to Paschal Full Moon - # j - Weekday for PFM (0=Sunday, etc) - # p - Number of days from March 21 to Sunday on or before PFM - # (-6 to 28 methods 1 & 3, to 56 for method 2) - # e - Extra days to add for method 2 (converting Julian - # date to Gregorian date) - - y = year - g = y % 19 - e = 0 - if method < 3: - # Old method - i = (19*g + 15) % 30 - j = (y + y//4 + i) % 7 - if method == 2: - # Extra dates to convert Julian to Gregorian date - e = 10 - if y > 1600: - e = e + y//100 - 16 - (y//100 - 16)//4 - else: - # New method - c = y//100 - h = (c - c//4 - (8*c + 13)//25 + 19*g + 15) % 30 - i = h - (h//28)*(1 - (h//28)*(29//(h + 1))*((21 - g)//11)) - j = (y + y//4 + i + 2 - c + c//4) % 7 - - # p can be from -6 to 56 corresponding to dates 22 March to 23 May - # (later dates apply to method 2, although 23 May never actually occurs) - p = i - j + e - d = 1 + (p + 27 + (p + 6)//40) % 31 - m = 3 + (p + 26)//30 - return datetime.date(int(y), int(m), int(d)) diff --git a/.venv/Lib/site-packages/dateutil/parser/__init__.py b/.venv/Lib/site-packages/dateutil/parser/__init__.py deleted file mode 100644 index d174b0e..0000000 --- a/.venv/Lib/site-packages/dateutil/parser/__init__.py +++ /dev/null @@ -1,61 +0,0 @@ -# -*- coding: utf-8 -*- -from ._parser import parse, parser, parserinfo, ParserError -from ._parser import DEFAULTPARSER, DEFAULTTZPARSER -from ._parser import UnknownTimezoneWarning - -from ._parser import __doc__ - -from .isoparser import isoparser, isoparse - -__all__ = ['parse', 'parser', 'parserinfo', - 'isoparse', 'isoparser', - 'ParserError', - 'UnknownTimezoneWarning'] - - -### -# Deprecate portions of the private interface so that downstream code that -# is improperly relying on it is given *some* notice. - - -def __deprecated_private_func(f): - from functools import wraps - import warnings - - msg = ('{name} is a private function and may break without warning, ' - 'it will be moved and or renamed in future versions.') - msg = msg.format(name=f.__name__) - - @wraps(f) - def deprecated_func(*args, **kwargs): - warnings.warn(msg, DeprecationWarning) - return f(*args, **kwargs) - - return deprecated_func - -def __deprecate_private_class(c): - import warnings - - msg = ('{name} is a private class and may break without warning, ' - 'it will be moved and or renamed in future versions.') - msg = msg.format(name=c.__name__) - - class private_class(c): - __doc__ = c.__doc__ - - def __init__(self, *args, **kwargs): - warnings.warn(msg, DeprecationWarning) - super(private_class, self).__init__(*args, **kwargs) - - private_class.__name__ = c.__name__ - - return private_class - - -from ._parser import _timelex, _resultbase -from ._parser import _tzparser, _parsetz - -_timelex = __deprecate_private_class(_timelex) -_tzparser = __deprecate_private_class(_tzparser) -_resultbase = __deprecate_private_class(_resultbase) -_parsetz = __deprecated_private_func(_parsetz) diff --git a/.venv/Lib/site-packages/dateutil/parser/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/dateutil/parser/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index ef388ab008f7318269b4d7888a99187c2f1c6834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3195 zcmb_eTW=f36`t7(xg?jQe2L>r8m|+}E|r+N#6ZwC2;|mo+9Gy>$U=-Qfz66LR5#k? zDzi)3QDuMy1c)Ts*bfQfhdc;H;nr{-@|d4N0SZ9ulh6VI^2R`YF#ObWh8Ky7())0D z_RN_xvvY3W&Y!c{G=aAG_4Ufv2}1scgF%z~%L<*E7|SqDnn}Scz-y)^c-2e!DKq7#%`_#8#7X>-ni(g#PE6g=fM#K@6zJ#7 zoS!%IVoe&xW9FED#5_WYL|B&P9#TRc!@t+eoRE$kkd6sy{(v+OQk@++AU)z_=14*R z2KOu|vAS&Yki`k{;BmV5bgPvh&b*CN{2J#0FGz9r>b0L=nSb-<+gIM1yY^0;?+F8Wqu@cPV(2I>eJ&iX*q=ro1_bFKF+zCV3zC z5$$tj)K4v0B5SlsMx_nXkQ+)xcGPw4A*_4cUroqeX-xvZCT@I#A~0FK&F$rIHTZ4S z_Ss#-4Gr5^=I)9eF{4temLoT)8g|t&eEUOVfiru_xa~&232KpXyXUu;4HtOV^Na;% z_`wQugnqyc&Tv!5aI3IYRO8H8VLXHl!{Q?vD>zvmo(vdt=~?*i{tCz^@~5P!Yy$V) z)|4Y@Px=t}$HOsZWK&urF8Jk7^dmY)9?=^RPz8@0AHB+!IV;;})*$X`tk`@pj1xYVm+VCrmK=ygEpoldUN%lzmRofr%PKB^80Ve7HO#RvSgSLTzU%BV=V1OB_=l@No;-o`c9gU2(cV#x)!)KjSE2e9TL0NjI(u)THSyrwXA_Ny zt@QYIdK`pmx<22S{@tzhTU|*~U+9wWA>Ya*ksBy!L_gD3PIL6wNR?yliz@#J7^rf( zA#FhRirOYE*^yebNjLZ70_gP`)b=oQKbJ?VxJ4!M27y|p4XGhl6h~Rt92IIE-t`#Y zCt6F|zeiKDhWj;pmCkdZx9S~M;APJaq2T}T)y>D?l_RA+0I=Q5F!PDB0Us|$OaMPq z`k1~yG{%&{Trd{EOL6GBW-1MGhngxtmh^OLUusx`+!iM6CHIJUBuGPWiNpy2ToRkW zeYZ80e-17Y?$mEhb&ZU|&z>!76d*`K2*Qu%9O1`cQ9PTTGmd4_E9pWq zRzl`g_z6^b7FAM~B`mZoQ8ICM#6VGQVGNR*Bx=@INP_j%sfw^MgdpSat|&hP!9n{V8$%Kao=7s zaULdK!pUC)L2wxSI!BLvTxcY_ij=xSq0;|HDvaXz%7QFT!|{_PY=q#V?+%_8bN{{B z!vJnHi}@rdq8TCL2mqWwxPJ%Fx{9izZT}5@K))61{=R>8jy!+%GqZkuTRFXxIoVcD z_ChH^u10Wc^4Og?V{sPNylBA=8QzzyXmxO3vIG;Y-Y6V}D^*W=@a81$OPIM_LxMM_ zULuIw6yB@wHfCcU2;dja;ZvwKjbsMND?lERUPSQg@l<=Qmt(KRvD^p5$ z$WPk;s&~jM?ZbM9ywo1;JLI|cXx||d?ZbLkku&36G9dM2_e7SS>5?INevF>#k|DW3 zD7@^Dy*lKF?Zf&`=6pMIe)HB=rnsFc*0qj4-qy!A-7S4;Tc4_@I=PGO+{M3SwsM!Z RbC>Ix&H??pR@a0N{{i^4B+mc< diff --git a/.venv/Lib/site-packages/dateutil/parser/__pycache__/_parser.cpython-311.pyc b/.venv/Lib/site-packages/dateutil/parser/__pycache__/_parser.cpython-311.pyc deleted file mode 100644 index 8ff95994031daff29ea41ed7032beb5a8316efef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69846 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 V@wo(7xo+Q)vhTfTqYuNu{{b$X$D9BF diff --git a/.venv/Lib/site-packages/dateutil/parser/_parser.py b/.venv/Lib/site-packages/dateutil/parser/_parser.py deleted file mode 100644 index 37d1663..0000000 --- a/.venv/Lib/site-packages/dateutil/parser/_parser.py +++ /dev/null @@ -1,1613 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers a generic date/time string parser which is able to parse -most known formats to represent a date and/or time. - -This module attempts to be forgiving with regards to unlikely input formats, -returning a datetime object even for dates which are ambiguous. If an element -of a date/time stamp is omitted, the following rules are applied: - -- If AM or PM is left unspecified, a 24-hour clock is assumed, however, an hour - on a 12-hour clock (``0 <= hour <= 12``) *must* be specified if AM or PM is - specified. -- If a time zone is omitted, a timezone-naive datetime is returned. - -If any other elements are missing, they are taken from the -:class:`datetime.datetime` object passed to the parameter ``default``. If this -results in a day number exceeding the valid number of days per month, the -value falls back to the end of the month. - -Additional resources about date/time string formats can be found below: - -- `A summary of the international standard date and time notation - `_ -- `W3C Date and Time Formats `_ -- `Time Formats (Planetary Rings Node) `_ -- `CPAN ParseDate module - `_ -- `Java SimpleDateFormat Class - `_ -""" -from __future__ import unicode_literals - -import datetime -import re -import string -import time -import warnings - -from calendar import monthrange -from io import StringIO - -import six -from six import integer_types, text_type - -from decimal import Decimal - -from warnings import warn - -from .. import relativedelta -from .. import tz - -__all__ = ["parse", "parserinfo", "ParserError"] - - -# TODO: pandas.core.tools.datetimes imports this explicitly. Might be worth -# making public and/or figuring out if there is something we can -# take off their plate. -class _timelex(object): - # Fractional seconds are sometimes split by a comma - _split_decimal = re.compile("([.,])") - - def __init__(self, instream): - if isinstance(instream, (bytes, bytearray)): - instream = instream.decode() - - if isinstance(instream, text_type): - instream = StringIO(instream) - elif getattr(instream, 'read', None) is None: - raise TypeError('Parser must be a string or character stream, not ' - '{itype}'.format(itype=instream.__class__.__name__)) - - self.instream = instream - self.charstack = [] - self.tokenstack = [] - self.eof = False - - def get_token(self): - """ - This function breaks the time string into lexical units (tokens), which - can be parsed by the parser. Lexical units are demarcated by changes in - the character set, so any continuous string of letters is considered - one unit, any continuous string of numbers is considered one unit. - - The main complication arises from the fact that dots ('.') can be used - both as separators (e.g. "Sep.20.2009") or decimal points (e.g. - "4:30:21.447"). As such, it is necessary to read the full context of - any dot-separated strings before breaking it into tokens; as such, this - function maintains a "token stack", for when the ambiguous context - demands that multiple tokens be parsed at once. - """ - if self.tokenstack: - return self.tokenstack.pop(0) - - seenletters = False - token = None - state = None - - while not self.eof: - # We only realize that we've reached the end of a token when we - # find a character that's not part of the current token - since - # that character may be part of the next token, it's stored in the - # charstack. - if self.charstack: - nextchar = self.charstack.pop(0) - else: - nextchar = self.instream.read(1) - while nextchar == '\x00': - nextchar = self.instream.read(1) - - if not nextchar: - self.eof = True - break - elif not state: - # First character of the token - determines if we're starting - # to parse a word, a number or something else. - token = nextchar - if self.isword(nextchar): - state = 'a' - elif self.isnum(nextchar): - state = '0' - elif self.isspace(nextchar): - token = ' ' - break # emit token - else: - break # emit token - elif state == 'a': - # If we've already started reading a word, we keep reading - # letters until we find something that's not part of a word. - seenletters = True - if self.isword(nextchar): - token += nextchar - elif nextchar == '.': - token += nextchar - state = 'a.' - else: - self.charstack.append(nextchar) - break # emit token - elif state == '0': - # If we've already started reading a number, we keep reading - # numbers until we find something that doesn't fit. - if self.isnum(nextchar): - token += nextchar - elif nextchar == '.' or (nextchar == ',' and len(token) >= 2): - token += nextchar - state = '0.' - else: - self.charstack.append(nextchar) - break # emit token - elif state == 'a.': - # If we've seen some letters and a dot separator, continue - # parsing, and the tokens will be broken up later. - seenletters = True - if nextchar == '.' or self.isword(nextchar): - token += nextchar - elif self.isnum(nextchar) and token[-1] == '.': - token += nextchar - state = '0.' - else: - self.charstack.append(nextchar) - break # emit token - elif state == '0.': - # If we've seen at least one dot separator, keep going, we'll - # break up the tokens later. - if nextchar == '.' or self.isnum(nextchar): - token += nextchar - elif self.isword(nextchar) and token[-1] == '.': - token += nextchar - state = 'a.' - else: - self.charstack.append(nextchar) - break # emit token - - if (state in ('a.', '0.') and (seenletters or token.count('.') > 1 or - token[-1] in '.,')): - l = self._split_decimal.split(token) - token = l[0] - for tok in l[1:]: - if tok: - self.tokenstack.append(tok) - - if state == '0.' and token.count('.') == 0: - token = token.replace(',', '.') - - return token - - def __iter__(self): - return self - - def __next__(self): - token = self.get_token() - if token is None: - raise StopIteration - - return token - - def next(self): - return self.__next__() # Python 2.x support - - @classmethod - def split(cls, s): - return list(cls(s)) - - @classmethod - def isword(cls, nextchar): - """ Whether or not the next character is part of a word """ - return nextchar.isalpha() - - @classmethod - def isnum(cls, nextchar): - """ Whether the next character is part of a number """ - return nextchar.isdigit() - - @classmethod - def isspace(cls, nextchar): - """ Whether the next character is whitespace """ - return nextchar.isspace() - - -class _resultbase(object): - - def __init__(self): - for attr in self.__slots__: - setattr(self, attr, None) - - def _repr(self, classname): - l = [] - for attr in self.__slots__: - value = getattr(self, attr) - if value is not None: - l.append("%s=%s" % (attr, repr(value))) - return "%s(%s)" % (classname, ", ".join(l)) - - def __len__(self): - return (sum(getattr(self, attr) is not None - for attr in self.__slots__)) - - def __repr__(self): - return self._repr(self.__class__.__name__) - - -class parserinfo(object): - """ - Class which handles what inputs are accepted. Subclass this to customize - the language and acceptable values for each parameter. - - :param dayfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the day (``True``) or month (``False``). If - ``yearfirst`` is set to ``True``, this distinguishes between YDM - and YMD. Default is ``False``. - - :param yearfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the year. If ``True``, the first number is taken - to be the year, otherwise the last number is taken to be the year. - Default is ``False``. - """ - - # m from a.m/p.m, t from ISO T separator - JUMP = [" ", ".", ",", ";", "-", "/", "'", - "at", "on", "and", "ad", "m", "t", "of", - "st", "nd", "rd", "th"] - - WEEKDAYS = [("Mon", "Monday"), - ("Tue", "Tuesday"), # TODO: "Tues" - ("Wed", "Wednesday"), - ("Thu", "Thursday"), # TODO: "Thurs" - ("Fri", "Friday"), - ("Sat", "Saturday"), - ("Sun", "Sunday")] - MONTHS = [("Jan", "January"), - ("Feb", "February"), # TODO: "Febr" - ("Mar", "March"), - ("Apr", "April"), - ("May", "May"), - ("Jun", "June"), - ("Jul", "July"), - ("Aug", "August"), - ("Sep", "Sept", "September"), - ("Oct", "October"), - ("Nov", "November"), - ("Dec", "December")] - HMS = [("h", "hour", "hours"), - ("m", "minute", "minutes"), - ("s", "second", "seconds")] - AMPM = [("am", "a"), - ("pm", "p")] - UTCZONE = ["UTC", "GMT", "Z", "z"] - PERTAIN = ["of"] - TZOFFSET = {} - # TODO: ERA = ["AD", "BC", "CE", "BCE", "Stardate", - # "Anno Domini", "Year of Our Lord"] - - def __init__(self, dayfirst=False, yearfirst=False): - self._jump = self._convert(self.JUMP) - self._weekdays = self._convert(self.WEEKDAYS) - self._months = self._convert(self.MONTHS) - self._hms = self._convert(self.HMS) - self._ampm = self._convert(self.AMPM) - self._utczone = self._convert(self.UTCZONE) - self._pertain = self._convert(self.PERTAIN) - - self.dayfirst = dayfirst - self.yearfirst = yearfirst - - self._year = time.localtime().tm_year - self._century = self._year // 100 * 100 - - def _convert(self, lst): - dct = {} - for i, v in enumerate(lst): - if isinstance(v, tuple): - for v in v: - dct[v.lower()] = i - else: - dct[v.lower()] = i - return dct - - def jump(self, name): - return name.lower() in self._jump - - def weekday(self, name): - try: - return self._weekdays[name.lower()] - except KeyError: - pass - return None - - def month(self, name): - try: - return self._months[name.lower()] + 1 - except KeyError: - pass - return None - - def hms(self, name): - try: - return self._hms[name.lower()] - except KeyError: - return None - - def ampm(self, name): - try: - return self._ampm[name.lower()] - except KeyError: - return None - - def pertain(self, name): - return name.lower() in self._pertain - - def utczone(self, name): - return name.lower() in self._utczone - - def tzoffset(self, name): - if name in self._utczone: - return 0 - - return self.TZOFFSET.get(name) - - def convertyear(self, year, century_specified=False): - """ - Converts two-digit years to year within [-50, 49] - range of self._year (current local time) - """ - - # Function contract is that the year is always positive - assert year >= 0 - - if year < 100 and not century_specified: - # assume current century to start - year += self._century - - if year >= self._year + 50: # if too far in future - year -= 100 - elif year < self._year - 50: # if too far in past - year += 100 - - return year - - def validate(self, res): - # move to info - if res.year is not None: - res.year = self.convertyear(res.year, res.century_specified) - - if ((res.tzoffset == 0 and not res.tzname) or - (res.tzname == 'Z' or res.tzname == 'z')): - res.tzname = "UTC" - res.tzoffset = 0 - elif res.tzoffset != 0 and res.tzname and self.utczone(res.tzname): - res.tzoffset = 0 - return True - - -class _ymd(list): - def __init__(self, *args, **kwargs): - super(self.__class__, self).__init__(*args, **kwargs) - self.century_specified = False - self.dstridx = None - self.mstridx = None - self.ystridx = None - - @property - def has_year(self): - return self.ystridx is not None - - @property - def has_month(self): - return self.mstridx is not None - - @property - def has_day(self): - return self.dstridx is not None - - def could_be_day(self, value): - if self.has_day: - return False - elif not self.has_month: - return 1 <= value <= 31 - elif not self.has_year: - # Be permissive, assume leap year - month = self[self.mstridx] - return 1 <= value <= monthrange(2000, month)[1] - else: - month = self[self.mstridx] - year = self[self.ystridx] - return 1 <= value <= monthrange(year, month)[1] - - def append(self, val, label=None): - if hasattr(val, '__len__'): - if val.isdigit() and len(val) > 2: - self.century_specified = True - if label not in [None, 'Y']: # pragma: no cover - raise ValueError(label) - label = 'Y' - elif val > 100: - self.century_specified = True - if label not in [None, 'Y']: # pragma: no cover - raise ValueError(label) - label = 'Y' - - super(self.__class__, self).append(int(val)) - - if label == 'M': - if self.has_month: - raise ValueError('Month is already set') - self.mstridx = len(self) - 1 - elif label == 'D': - if self.has_day: - raise ValueError('Day is already set') - self.dstridx = len(self) - 1 - elif label == 'Y': - if self.has_year: - raise ValueError('Year is already set') - self.ystridx = len(self) - 1 - - def _resolve_from_stridxs(self, strids): - """ - Try to resolve the identities of year/month/day elements using - ystridx, mstridx, and dstridx, if enough of these are specified. - """ - if len(self) == 3 and len(strids) == 2: - # we can back out the remaining stridx value - missing = [x for x in range(3) if x not in strids.values()] - key = [x for x in ['y', 'm', 'd'] if x not in strids] - assert len(missing) == len(key) == 1 - key = key[0] - val = missing[0] - strids[key] = val - - assert len(self) == len(strids) # otherwise this should not be called - out = {key: self[strids[key]] for key in strids} - return (out.get('y'), out.get('m'), out.get('d')) - - def resolve_ymd(self, yearfirst, dayfirst): - len_ymd = len(self) - year, month, day = (None, None, None) - - strids = (('y', self.ystridx), - ('m', self.mstridx), - ('d', self.dstridx)) - - strids = {key: val for key, val in strids if val is not None} - if (len(self) == len(strids) > 0 or - (len(self) == 3 and len(strids) == 2)): - return self._resolve_from_stridxs(strids) - - mstridx = self.mstridx - - if len_ymd > 3: - raise ValueError("More than three YMD values") - elif len_ymd == 1 or (mstridx is not None and len_ymd == 2): - # One member, or two members with a month string - if mstridx is not None: - month = self[mstridx] - # since mstridx is 0 or 1, self[mstridx-1] always - # looks up the other element - other = self[mstridx - 1] - else: - other = self[0] - - if len_ymd > 1 or mstridx is None: - if other > 31: - year = other - else: - day = other - - elif len_ymd == 2: - # Two members with numbers - if self[0] > 31: - # 99-01 - year, month = self - elif self[1] > 31: - # 01-99 - month, year = self - elif dayfirst and self[1] <= 12: - # 13-01 - day, month = self - else: - # 01-13 - month, day = self - - elif len_ymd == 3: - # Three members - if mstridx == 0: - if self[1] > 31: - # Apr-2003-25 - month, year, day = self - else: - month, day, year = self - elif mstridx == 1: - if self[0] > 31 or (yearfirst and self[2] <= 31): - # 99-Jan-01 - year, month, day = self - else: - # 01-Jan-01 - # Give precedence to day-first, since - # two-digit years is usually hand-written. - day, month, year = self - - elif mstridx == 2: - # WTF!? - if self[1] > 31: - # 01-99-Jan - day, year, month = self - else: - # 99-01-Jan - year, day, month = self - - else: - if (self[0] > 31 or - self.ystridx == 0 or - (yearfirst and self[1] <= 12 and self[2] <= 31)): - # 99-01-01 - if dayfirst and self[2] <= 12: - year, day, month = self - else: - year, month, day = self - elif self[0] > 12 or (dayfirst and self[1] <= 12): - # 13-01-01 - day, month, year = self - else: - # 01-13-01 - month, day, year = self - - return year, month, day - - -class parser(object): - def __init__(self, info=None): - self.info = info or parserinfo() - - def parse(self, timestr, default=None, - ignoretz=False, tzinfos=None, **kwargs): - """ - Parse the date/time string into a :class:`datetime.datetime` object. - - :param timestr: - Any date/time string using the supported formats. - - :param default: - The default datetime object, if this is a datetime object and not - ``None``, elements specified in ``timestr`` replace elements in the - default object. - - :param ignoretz: - If set ``True``, time zones in parsed strings are ignored and a - naive :class:`datetime.datetime` object is returned. - - :param tzinfos: - Additional time zone names / aliases which may be present in the - string. This argument maps time zone names (and optionally offsets - from those time zones) to time zones. This parameter can be a - dictionary with timezone aliases mapping time zone names to time - zones or a function taking two parameters (``tzname`` and - ``tzoffset``) and returning a time zone. - - The timezones to which the names are mapped can be an integer - offset from UTC in seconds or a :class:`tzinfo` object. - - .. doctest:: - :options: +NORMALIZE_WHITESPACE - - >>> from dateutil.parser import parse - >>> from dateutil.tz import gettz - >>> tzinfos = {"BRST": -7200, "CST": gettz("America/Chicago")} - >>> parse("2012-01-19 17:21:00 BRST", tzinfos=tzinfos) - datetime.datetime(2012, 1, 19, 17, 21, tzinfo=tzoffset(u'BRST', -7200)) - >>> parse("2012-01-19 17:21:00 CST", tzinfos=tzinfos) - datetime.datetime(2012, 1, 19, 17, 21, - tzinfo=tzfile('/usr/share/zoneinfo/America/Chicago')) - - This parameter is ignored if ``ignoretz`` is set. - - :param \\*\\*kwargs: - Keyword arguments as passed to ``_parse()``. - - :return: - Returns a :class:`datetime.datetime` object or, if the - ``fuzzy_with_tokens`` option is ``True``, returns a tuple, the - first element being a :class:`datetime.datetime` object, the second - a tuple containing the fuzzy tokens. - - :raises ParserError: - Raised for invalid or unknown string format, if the provided - :class:`tzinfo` is not in a valid format, or if an invalid date - would be created. - - :raises TypeError: - Raised for non-string or character stream input. - - :raises OverflowError: - Raised if the parsed date exceeds the largest valid C integer on - your system. - """ - - if default is None: - default = datetime.datetime.now().replace(hour=0, minute=0, - second=0, microsecond=0) - - res, skipped_tokens = self._parse(timestr, **kwargs) - - if res is None: - raise ParserError("Unknown string format: %s", timestr) - - if len(res) == 0: - raise ParserError("String does not contain a date: %s", timestr) - - try: - ret = self._build_naive(res, default) - except ValueError as e: - six.raise_from(ParserError(str(e) + ": %s", timestr), e) - - if not ignoretz: - ret = self._build_tzaware(ret, res, tzinfos) - - if kwargs.get('fuzzy_with_tokens', False): - return ret, skipped_tokens - else: - return ret - - class _result(_resultbase): - __slots__ = ["year", "month", "day", "weekday", - "hour", "minute", "second", "microsecond", - "tzname", "tzoffset", "ampm","any_unused_tokens"] - - def _parse(self, timestr, dayfirst=None, yearfirst=None, fuzzy=False, - fuzzy_with_tokens=False): - """ - Private method which performs the heavy lifting of parsing, called from - ``parse()``, which passes on its ``kwargs`` to this function. - - :param timestr: - The string to parse. - - :param dayfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the day (``True``) or month (``False``). If - ``yearfirst`` is set to ``True``, this distinguishes between YDM - and YMD. If set to ``None``, this value is retrieved from the - current :class:`parserinfo` object (which itself defaults to - ``False``). - - :param yearfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the year. If ``True``, the first number is taken - to be the year, otherwise the last number is taken to be the year. - If this is set to ``None``, the value is retrieved from the current - :class:`parserinfo` object (which itself defaults to ``False``). - - :param fuzzy: - Whether to allow fuzzy parsing, allowing for string like "Today is - January 1, 2047 at 8:21:00AM". - - :param fuzzy_with_tokens: - If ``True``, ``fuzzy`` is automatically set to True, and the parser - will return a tuple where the first element is the parsed - :class:`datetime.datetime` datetimestamp and the second element is - a tuple containing the portions of the string which were ignored: - - .. doctest:: - - >>> from dateutil.parser import parse - >>> parse("Today is January 1, 2047 at 8:21:00AM", fuzzy_with_tokens=True) - (datetime.datetime(2047, 1, 1, 8, 21), (u'Today is ', u' ', u'at ')) - - """ - if fuzzy_with_tokens: - fuzzy = True - - info = self.info - - if dayfirst is None: - dayfirst = info.dayfirst - - if yearfirst is None: - yearfirst = info.yearfirst - - res = self._result() - l = _timelex.split(timestr) # Splits the timestr into tokens - - skipped_idxs = [] - - # year/month/day list - ymd = _ymd() - - len_l = len(l) - i = 0 - try: - while i < len_l: - - # Check if it's a number - value_repr = l[i] - try: - value = float(value_repr) - except ValueError: - value = None - - if value is not None: - # Numeric token - i = self._parse_numeric_token(l, i, info, ymd, res, fuzzy) - - # Check weekday - elif info.weekday(l[i]) is not None: - value = info.weekday(l[i]) - res.weekday = value - - # Check month name - elif info.month(l[i]) is not None: - value = info.month(l[i]) - ymd.append(value, 'M') - - if i + 1 < len_l: - if l[i + 1] in ('-', '/'): - # Jan-01[-99] - sep = l[i + 1] - ymd.append(l[i + 2]) - - if i + 3 < len_l and l[i + 3] == sep: - # Jan-01-99 - ymd.append(l[i + 4]) - i += 2 - - i += 2 - - elif (i + 4 < len_l and l[i + 1] == l[i + 3] == ' ' and - info.pertain(l[i + 2])): - # Jan of 01 - # In this case, 01 is clearly year - if l[i + 4].isdigit(): - # Convert it here to become unambiguous - value = int(l[i + 4]) - year = str(info.convertyear(value)) - ymd.append(year, 'Y') - else: - # Wrong guess - pass - # TODO: not hit in tests - i += 4 - - # Check am/pm - elif info.ampm(l[i]) is not None: - value = info.ampm(l[i]) - val_is_ampm = self._ampm_valid(res.hour, res.ampm, fuzzy) - - if val_is_ampm: - res.hour = self._adjust_ampm(res.hour, value) - res.ampm = value - - elif fuzzy: - skipped_idxs.append(i) - - # Check for a timezone name - elif self._could_be_tzname(res.hour, res.tzname, res.tzoffset, l[i]): - res.tzname = l[i] - res.tzoffset = info.tzoffset(res.tzname) - - # Check for something like GMT+3, or BRST+3. Notice - # that it doesn't mean "I am 3 hours after GMT", but - # "my time +3 is GMT". If found, we reverse the - # logic so that timezone parsing code will get it - # right. - if i + 1 < len_l and l[i + 1] in ('+', '-'): - l[i + 1] = ('+', '-')[l[i + 1] == '+'] - res.tzoffset = None - if info.utczone(res.tzname): - # With something like GMT+3, the timezone - # is *not* GMT. - res.tzname = None - - # Check for a numbered timezone - elif res.hour is not None and l[i] in ('+', '-'): - signal = (-1, 1)[l[i] == '+'] - len_li = len(l[i + 1]) - - # TODO: check that l[i + 1] is integer? - if len_li == 4: - # -0300 - hour_offset = int(l[i + 1][:2]) - min_offset = int(l[i + 1][2:]) - elif i + 2 < len_l and l[i + 2] == ':': - # -03:00 - hour_offset = int(l[i + 1]) - min_offset = int(l[i + 3]) # TODO: Check that l[i+3] is minute-like? - i += 2 - elif len_li <= 2: - # -[0]3 - hour_offset = int(l[i + 1][:2]) - min_offset = 0 - else: - raise ValueError(timestr) - - res.tzoffset = signal * (hour_offset * 3600 + min_offset * 60) - - # Look for a timezone name between parenthesis - if (i + 5 < len_l and - info.jump(l[i + 2]) and l[i + 3] == '(' and - l[i + 5] == ')' and - 3 <= len(l[i + 4]) and - self._could_be_tzname(res.hour, res.tzname, - None, l[i + 4])): - # -0300 (BRST) - res.tzname = l[i + 4] - i += 4 - - i += 1 - - # Check jumps - elif not (info.jump(l[i]) or fuzzy): - raise ValueError(timestr) - - else: - skipped_idxs.append(i) - i += 1 - - # Process year/month/day - year, month, day = ymd.resolve_ymd(yearfirst, dayfirst) - - res.century_specified = ymd.century_specified - res.year = year - res.month = month - res.day = day - - except (IndexError, ValueError): - return None, None - - if not info.validate(res): - return None, None - - if fuzzy_with_tokens: - skipped_tokens = self._recombine_skipped(l, skipped_idxs) - return res, tuple(skipped_tokens) - else: - return res, None - - def _parse_numeric_token(self, tokens, idx, info, ymd, res, fuzzy): - # Token is a number - value_repr = tokens[idx] - try: - value = self._to_decimal(value_repr) - except Exception as e: - six.raise_from(ValueError('Unknown numeric token'), e) - - len_li = len(value_repr) - - len_l = len(tokens) - - if (len(ymd) == 3 and len_li in (2, 4) and - res.hour is None and - (idx + 1 >= len_l or - (tokens[idx + 1] != ':' and - info.hms(tokens[idx + 1]) is None))): - # 19990101T23[59] - s = tokens[idx] - res.hour = int(s[:2]) - - if len_li == 4: - res.minute = int(s[2:]) - - elif len_li == 6 or (len_li > 6 and tokens[idx].find('.') == 6): - # YYMMDD or HHMMSS[.ss] - s = tokens[idx] - - if not ymd and '.' not in tokens[idx]: - ymd.append(s[:2]) - ymd.append(s[2:4]) - ymd.append(s[4:]) - else: - # 19990101T235959[.59] - - # TODO: Check if res attributes already set. - res.hour = int(s[:2]) - res.minute = int(s[2:4]) - res.second, res.microsecond = self._parsems(s[4:]) - - elif len_li in (8, 12, 14): - # YYYYMMDD - s = tokens[idx] - ymd.append(s[:4], 'Y') - ymd.append(s[4:6]) - ymd.append(s[6:8]) - - if len_li > 8: - res.hour = int(s[8:10]) - res.minute = int(s[10:12]) - - if len_li > 12: - res.second = int(s[12:]) - - elif self._find_hms_idx(idx, tokens, info, allow_jump=True) is not None: - # HH[ ]h or MM[ ]m or SS[.ss][ ]s - hms_idx = self._find_hms_idx(idx, tokens, info, allow_jump=True) - (idx, hms) = self._parse_hms(idx, tokens, info, hms_idx) - if hms is not None: - # TODO: checking that hour/minute/second are not - # already set? - self._assign_hms(res, value_repr, hms) - - elif idx + 2 < len_l and tokens[idx + 1] == ':': - # HH:MM[:SS[.ss]] - res.hour = int(value) - value = self._to_decimal(tokens[idx + 2]) # TODO: try/except for this? - (res.minute, res.second) = self._parse_min_sec(value) - - if idx + 4 < len_l and tokens[idx + 3] == ':': - res.second, res.microsecond = self._parsems(tokens[idx + 4]) - - idx += 2 - - idx += 2 - - elif idx + 1 < len_l and tokens[idx + 1] in ('-', '/', '.'): - sep = tokens[idx + 1] - ymd.append(value_repr) - - if idx + 2 < len_l and not info.jump(tokens[idx + 2]): - if tokens[idx + 2].isdigit(): - # 01-01[-01] - ymd.append(tokens[idx + 2]) - else: - # 01-Jan[-01] - value = info.month(tokens[idx + 2]) - - if value is not None: - ymd.append(value, 'M') - else: - raise ValueError() - - if idx + 3 < len_l and tokens[idx + 3] == sep: - # We have three members - value = info.month(tokens[idx + 4]) - - if value is not None: - ymd.append(value, 'M') - else: - ymd.append(tokens[idx + 4]) - idx += 2 - - idx += 1 - idx += 1 - - elif idx + 1 >= len_l or info.jump(tokens[idx + 1]): - if idx + 2 < len_l and info.ampm(tokens[idx + 2]) is not None: - # 12 am - hour = int(value) - res.hour = self._adjust_ampm(hour, info.ampm(tokens[idx + 2])) - idx += 1 - else: - # Year, month or day - ymd.append(value) - idx += 1 - - elif info.ampm(tokens[idx + 1]) is not None and (0 <= value < 24): - # 12am - hour = int(value) - res.hour = self._adjust_ampm(hour, info.ampm(tokens[idx + 1])) - idx += 1 - - elif ymd.could_be_day(value): - ymd.append(value) - - elif not fuzzy: - raise ValueError() - - return idx - - def _find_hms_idx(self, idx, tokens, info, allow_jump): - len_l = len(tokens) - - if idx+1 < len_l and info.hms(tokens[idx+1]) is not None: - # There is an "h", "m", or "s" label following this token. We take - # assign the upcoming label to the current token. - # e.g. the "12" in 12h" - hms_idx = idx + 1 - - elif (allow_jump and idx+2 < len_l and tokens[idx+1] == ' ' and - info.hms(tokens[idx+2]) is not None): - # There is a space and then an "h", "m", or "s" label. - # e.g. the "12" in "12 h" - hms_idx = idx + 2 - - elif idx > 0 and info.hms(tokens[idx-1]) is not None: - # There is a "h", "m", or "s" preceding this token. Since neither - # of the previous cases was hit, there is no label following this - # token, so we use the previous label. - # e.g. the "04" in "12h04" - hms_idx = idx-1 - - elif (1 < idx == len_l-1 and tokens[idx-1] == ' ' and - info.hms(tokens[idx-2]) is not None): - # If we are looking at the final token, we allow for a - # backward-looking check to skip over a space. - # TODO: Are we sure this is the right condition here? - hms_idx = idx - 2 - - else: - hms_idx = None - - return hms_idx - - def _assign_hms(self, res, value_repr, hms): - # See GH issue #427, fixing float rounding - value = self._to_decimal(value_repr) - - if hms == 0: - # Hour - res.hour = int(value) - if value % 1: - res.minute = int(60*(value % 1)) - - elif hms == 1: - (res.minute, res.second) = self._parse_min_sec(value) - - elif hms == 2: - (res.second, res.microsecond) = self._parsems(value_repr) - - def _could_be_tzname(self, hour, tzname, tzoffset, token): - return (hour is not None and - tzname is None and - tzoffset is None and - len(token) <= 5 and - (all(x in string.ascii_uppercase for x in token) - or token in self.info.UTCZONE)) - - def _ampm_valid(self, hour, ampm, fuzzy): - """ - For fuzzy parsing, 'a' or 'am' (both valid English words) - may erroneously trigger the AM/PM flag. Deal with that - here. - """ - val_is_ampm = True - - # If there's already an AM/PM flag, this one isn't one. - if fuzzy and ampm is not None: - val_is_ampm = False - - # If AM/PM is found and hour is not, raise a ValueError - if hour is None: - if fuzzy: - val_is_ampm = False - else: - raise ValueError('No hour specified with AM or PM flag.') - elif not 0 <= hour <= 12: - # If AM/PM is found, it's a 12 hour clock, so raise - # an error for invalid range - if fuzzy: - val_is_ampm = False - else: - raise ValueError('Invalid hour specified for 12-hour clock.') - - return val_is_ampm - - def _adjust_ampm(self, hour, ampm): - if hour < 12 and ampm == 1: - hour += 12 - elif hour == 12 and ampm == 0: - hour = 0 - return hour - - def _parse_min_sec(self, value): - # TODO: Every usage of this function sets res.second to the return - # value. Are there any cases where second will be returned as None and - # we *don't* want to set res.second = None? - minute = int(value) - second = None - - sec_remainder = value % 1 - if sec_remainder: - second = int(60 * sec_remainder) - return (minute, second) - - def _parse_hms(self, idx, tokens, info, hms_idx): - # TODO: Is this going to admit a lot of false-positives for when we - # just happen to have digits and "h", "m" or "s" characters in non-date - # text? I guess hex hashes won't have that problem, but there's plenty - # of random junk out there. - if hms_idx is None: - hms = None - new_idx = idx - elif hms_idx > idx: - hms = info.hms(tokens[hms_idx]) - new_idx = hms_idx - else: - # Looking backwards, increment one. - hms = info.hms(tokens[hms_idx]) + 1 - new_idx = idx - - return (new_idx, hms) - - # ------------------------------------------------------------------ - # Handling for individual tokens. These are kept as methods instead - # of functions for the sake of customizability via subclassing. - - def _parsems(self, value): - """Parse a I[.F] seconds value into (seconds, microseconds).""" - if "." not in value: - return int(value), 0 - else: - i, f = value.split(".") - return int(i), int(f.ljust(6, "0")[:6]) - - def _to_decimal(self, val): - try: - decimal_value = Decimal(val) - # See GH 662, edge case, infinite value should not be converted - # via `_to_decimal` - if not decimal_value.is_finite(): - raise ValueError("Converted decimal value is infinite or NaN") - except Exception as e: - msg = "Could not convert %s to decimal" % val - six.raise_from(ValueError(msg), e) - else: - return decimal_value - - # ------------------------------------------------------------------ - # Post-Parsing construction of datetime output. These are kept as - # methods instead of functions for the sake of customizability via - # subclassing. - - def _build_tzinfo(self, tzinfos, tzname, tzoffset): - if callable(tzinfos): - tzdata = tzinfos(tzname, tzoffset) - else: - tzdata = tzinfos.get(tzname) - # handle case where tzinfo is paased an options that returns None - # eg tzinfos = {'BRST' : None} - if isinstance(tzdata, datetime.tzinfo) or tzdata is None: - tzinfo = tzdata - elif isinstance(tzdata, text_type): - tzinfo = tz.tzstr(tzdata) - elif isinstance(tzdata, integer_types): - tzinfo = tz.tzoffset(tzname, tzdata) - else: - raise TypeError("Offset must be tzinfo subclass, tz string, " - "or int offset.") - return tzinfo - - def _build_tzaware(self, naive, res, tzinfos): - if (callable(tzinfos) or (tzinfos and res.tzname in tzinfos)): - tzinfo = self._build_tzinfo(tzinfos, res.tzname, res.tzoffset) - aware = naive.replace(tzinfo=tzinfo) - aware = self._assign_tzname(aware, res.tzname) - - elif res.tzname and res.tzname in time.tzname: - aware = naive.replace(tzinfo=tz.tzlocal()) - - # Handle ambiguous local datetime - aware = self._assign_tzname(aware, res.tzname) - - # This is mostly relevant for winter GMT zones parsed in the UK - if (aware.tzname() != res.tzname and - res.tzname in self.info.UTCZONE): - aware = aware.replace(tzinfo=tz.UTC) - - elif res.tzoffset == 0: - aware = naive.replace(tzinfo=tz.UTC) - - elif res.tzoffset: - aware = naive.replace(tzinfo=tz.tzoffset(res.tzname, res.tzoffset)) - - elif not res.tzname and not res.tzoffset: - # i.e. no timezone information was found. - aware = naive - - elif res.tzname: - # tz-like string was parsed but we don't know what to do - # with it - warnings.warn("tzname {tzname} identified but not understood. " - "Pass `tzinfos` argument in order to correctly " - "return a timezone-aware datetime. In a future " - "version, this will raise an " - "exception.".format(tzname=res.tzname), - category=UnknownTimezoneWarning) - aware = naive - - return aware - - def _build_naive(self, res, default): - repl = {} - for attr in ("year", "month", "day", "hour", - "minute", "second", "microsecond"): - value = getattr(res, attr) - if value is not None: - repl[attr] = value - - if 'day' not in repl: - # If the default day exceeds the last day of the month, fall back - # to the end of the month. - cyear = default.year if res.year is None else res.year - cmonth = default.month if res.month is None else res.month - cday = default.day if res.day is None else res.day - - if cday > monthrange(cyear, cmonth)[1]: - repl['day'] = monthrange(cyear, cmonth)[1] - - naive = default.replace(**repl) - - if res.weekday is not None and not res.day: - naive = naive + relativedelta.relativedelta(weekday=res.weekday) - - return naive - - def _assign_tzname(self, dt, tzname): - if dt.tzname() != tzname: - new_dt = tz.enfold(dt, fold=1) - if new_dt.tzname() == tzname: - return new_dt - - return dt - - def _recombine_skipped(self, tokens, skipped_idxs): - """ - >>> tokens = ["foo", " ", "bar", " ", "19June2000", "baz"] - >>> skipped_idxs = [0, 1, 2, 5] - >>> _recombine_skipped(tokens, skipped_idxs) - ["foo bar", "baz"] - """ - skipped_tokens = [] - for i, idx in enumerate(sorted(skipped_idxs)): - if i > 0 and idx - 1 == skipped_idxs[i - 1]: - skipped_tokens[-1] = skipped_tokens[-1] + tokens[idx] - else: - skipped_tokens.append(tokens[idx]) - - return skipped_tokens - - -DEFAULTPARSER = parser() - - -def parse(timestr, parserinfo=None, **kwargs): - """ - - Parse a string in one of the supported formats, using the - ``parserinfo`` parameters. - - :param timestr: - A string containing a date/time stamp. - - :param parserinfo: - A :class:`parserinfo` object containing parameters for the parser. - If ``None``, the default arguments to the :class:`parserinfo` - constructor are used. - - The ``**kwargs`` parameter takes the following keyword arguments: - - :param default: - The default datetime object, if this is a datetime object and not - ``None``, elements specified in ``timestr`` replace elements in the - default object. - - :param ignoretz: - If set ``True``, time zones in parsed strings are ignored and a naive - :class:`datetime` object is returned. - - :param tzinfos: - Additional time zone names / aliases which may be present in the - string. This argument maps time zone names (and optionally offsets - from those time zones) to time zones. This parameter can be a - dictionary with timezone aliases mapping time zone names to time - zones or a function taking two parameters (``tzname`` and - ``tzoffset``) and returning a time zone. - - The timezones to which the names are mapped can be an integer - offset from UTC in seconds or a :class:`tzinfo` object. - - .. doctest:: - :options: +NORMALIZE_WHITESPACE - - >>> from dateutil.parser import parse - >>> from dateutil.tz import gettz - >>> tzinfos = {"BRST": -7200, "CST": gettz("America/Chicago")} - >>> parse("2012-01-19 17:21:00 BRST", tzinfos=tzinfos) - datetime.datetime(2012, 1, 19, 17, 21, tzinfo=tzoffset(u'BRST', -7200)) - >>> parse("2012-01-19 17:21:00 CST", tzinfos=tzinfos) - datetime.datetime(2012, 1, 19, 17, 21, - tzinfo=tzfile('/usr/share/zoneinfo/America/Chicago')) - - This parameter is ignored if ``ignoretz`` is set. - - :param dayfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the day (``True``) or month (``False``). If - ``yearfirst`` is set to ``True``, this distinguishes between YDM and - YMD. If set to ``None``, this value is retrieved from the current - :class:`parserinfo` object (which itself defaults to ``False``). - - :param yearfirst: - Whether to interpret the first value in an ambiguous 3-integer date - (e.g. 01/05/09) as the year. If ``True``, the first number is taken to - be the year, otherwise the last number is taken to be the year. If - this is set to ``None``, the value is retrieved from the current - :class:`parserinfo` object (which itself defaults to ``False``). - - :param fuzzy: - Whether to allow fuzzy parsing, allowing for string like "Today is - January 1, 2047 at 8:21:00AM". - - :param fuzzy_with_tokens: - If ``True``, ``fuzzy`` is automatically set to True, and the parser - will return a tuple where the first element is the parsed - :class:`datetime.datetime` datetimestamp and the second element is - a tuple containing the portions of the string which were ignored: - - .. doctest:: - - >>> from dateutil.parser import parse - >>> parse("Today is January 1, 2047 at 8:21:00AM", fuzzy_with_tokens=True) - (datetime.datetime(2047, 1, 1, 8, 21), (u'Today is ', u' ', u'at ')) - - :return: - Returns a :class:`datetime.datetime` object or, if the - ``fuzzy_with_tokens`` option is ``True``, returns a tuple, the - first element being a :class:`datetime.datetime` object, the second - a tuple containing the fuzzy tokens. - - :raises ParserError: - Raised for invalid or unknown string formats, if the provided - :class:`tzinfo` is not in a valid format, or if an invalid date would - be created. - - :raises OverflowError: - Raised if the parsed date exceeds the largest valid C integer on - your system. - """ - if parserinfo: - return parser(parserinfo).parse(timestr, **kwargs) - else: - return DEFAULTPARSER.parse(timestr, **kwargs) - - -class _tzparser(object): - - class _result(_resultbase): - - __slots__ = ["stdabbr", "stdoffset", "dstabbr", "dstoffset", - "start", "end"] - - class _attr(_resultbase): - __slots__ = ["month", "week", "weekday", - "yday", "jyday", "day", "time"] - - def __repr__(self): - return self._repr("") - - def __init__(self): - _resultbase.__init__(self) - self.start = self._attr() - self.end = self._attr() - - def parse(self, tzstr): - res = self._result() - l = [x for x in re.split(r'([,:.]|[a-zA-Z]+|[0-9]+)',tzstr) if x] - used_idxs = list() - try: - - len_l = len(l) - - i = 0 - while i < len_l: - # BRST+3[BRDT[+2]] - j = i - while j < len_l and not [x for x in l[j] - if x in "0123456789:,-+"]: - j += 1 - if j != i: - if not res.stdabbr: - offattr = "stdoffset" - res.stdabbr = "".join(l[i:j]) - else: - offattr = "dstoffset" - res.dstabbr = "".join(l[i:j]) - - for ii in range(j): - used_idxs.append(ii) - i = j - if (i < len_l and (l[i] in ('+', '-') or l[i][0] in - "0123456789")): - if l[i] in ('+', '-'): - # Yes, that's right. See the TZ variable - # documentation. - signal = (1, -1)[l[i] == '+'] - used_idxs.append(i) - i += 1 - else: - signal = -1 - len_li = len(l[i]) - if len_li == 4: - # -0300 - setattr(res, offattr, (int(l[i][:2]) * 3600 + - int(l[i][2:]) * 60) * signal) - elif i + 1 < len_l and l[i + 1] == ':': - # -03:00 - setattr(res, offattr, - (int(l[i]) * 3600 + - int(l[i + 2]) * 60) * signal) - used_idxs.append(i) - i += 2 - elif len_li <= 2: - # -[0]3 - setattr(res, offattr, - int(l[i][:2]) * 3600 * signal) - else: - return None - used_idxs.append(i) - i += 1 - if res.dstabbr: - break - else: - break - - - if i < len_l: - for j in range(i, len_l): - if l[j] == ';': - l[j] = ',' - - assert l[i] == ',' - - i += 1 - - if i >= len_l: - pass - elif (8 <= l.count(',') <= 9 and - not [y for x in l[i:] if x != ',' - for y in x if y not in "0123456789+-"]): - # GMT0BST,3,0,30,3600,10,0,26,7200[,3600] - for x in (res.start, res.end): - x.month = int(l[i]) - used_idxs.append(i) - i += 2 - if l[i] == '-': - value = int(l[i + 1]) * -1 - used_idxs.append(i) - i += 1 - else: - value = int(l[i]) - used_idxs.append(i) - i += 2 - if value: - x.week = value - x.weekday = (int(l[i]) - 1) % 7 - else: - x.day = int(l[i]) - used_idxs.append(i) - i += 2 - x.time = int(l[i]) - used_idxs.append(i) - i += 2 - if i < len_l: - if l[i] in ('-', '+'): - signal = (-1, 1)[l[i] == "+"] - used_idxs.append(i) - i += 1 - else: - signal = 1 - used_idxs.append(i) - res.dstoffset = (res.stdoffset + int(l[i]) * signal) - - # This was a made-up format that is not in normal use - warn(('Parsed time zone "%s"' % tzstr) + - 'is in a non-standard dateutil-specific format, which ' + - 'is now deprecated; support for parsing this format ' + - 'will be removed in future versions. It is recommended ' + - 'that you switch to a standard format like the GNU ' + - 'TZ variable format.', tz.DeprecatedTzFormatWarning) - elif (l.count(',') == 2 and l[i:].count('/') <= 2 and - not [y for x in l[i:] if x not in (',', '/', 'J', 'M', - '.', '-', ':') - for y in x if y not in "0123456789"]): - for x in (res.start, res.end): - if l[i] == 'J': - # non-leap year day (1 based) - used_idxs.append(i) - i += 1 - x.jyday = int(l[i]) - elif l[i] == 'M': - # month[-.]week[-.]weekday - used_idxs.append(i) - i += 1 - x.month = int(l[i]) - used_idxs.append(i) - i += 1 - assert l[i] in ('-', '.') - used_idxs.append(i) - i += 1 - x.week = int(l[i]) - if x.week == 5: - x.week = -1 - used_idxs.append(i) - i += 1 - assert l[i] in ('-', '.') - used_idxs.append(i) - i += 1 - x.weekday = (int(l[i]) - 1) % 7 - else: - # year day (zero based) - x.yday = int(l[i]) + 1 - - used_idxs.append(i) - i += 1 - - if i < len_l and l[i] == '/': - used_idxs.append(i) - i += 1 - # start time - len_li = len(l[i]) - if len_li == 4: - # -0300 - x.time = (int(l[i][:2]) * 3600 + - int(l[i][2:]) * 60) - elif i + 1 < len_l and l[i + 1] == ':': - # -03:00 - x.time = int(l[i]) * 3600 + int(l[i + 2]) * 60 - used_idxs.append(i) - i += 2 - if i + 1 < len_l and l[i + 1] == ':': - used_idxs.append(i) - i += 2 - x.time += int(l[i]) - elif len_li <= 2: - # -[0]3 - x.time = (int(l[i][:2]) * 3600) - else: - return None - used_idxs.append(i) - i += 1 - - assert i == len_l or l[i] == ',' - - i += 1 - - assert i >= len_l - - except (IndexError, ValueError, AssertionError): - return None - - unused_idxs = set(range(len_l)).difference(used_idxs) - res.any_unused_tokens = not {l[n] for n in unused_idxs}.issubset({",",":"}) - return res - - -DEFAULTTZPARSER = _tzparser() - - -def _parsetz(tzstr): - return DEFAULTTZPARSER.parse(tzstr) - - -class ParserError(ValueError): - """Exception subclass used for any failure to parse a datetime string. - - This is a subclass of :py:exc:`ValueError`, and should be raised any time - earlier versions of ``dateutil`` would have raised ``ValueError``. - - .. versionadded:: 2.8.1 - """ - def __str__(self): - try: - return self.args[0] % self.args[1:] - except (TypeError, IndexError): - return super(ParserError, self).__str__() - - def __repr__(self): - args = ", ".join("'%s'" % arg for arg in self.args) - return "%s(%s)" % (self.__class__.__name__, args) - - -class UnknownTimezoneWarning(RuntimeWarning): - """Raised when the parser finds a timezone it cannot parse into a tzinfo. - - .. versionadded:: 2.7.0 - """ -# vim:ts=4:sw=4:et diff --git a/.venv/Lib/site-packages/dateutil/parser/isoparser.py b/.venv/Lib/site-packages/dateutil/parser/isoparser.py deleted file mode 100644 index 7060087..0000000 --- a/.venv/Lib/site-packages/dateutil/parser/isoparser.py +++ /dev/null @@ -1,416 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers a parser for ISO-8601 strings - -It is intended to support all valid date, time and datetime formats per the -ISO-8601 specification. - -..versionadded:: 2.7.0 -""" -from datetime import datetime, timedelta, time, date -import calendar -from dateutil import tz - -from functools import wraps - -import re -import six - -__all__ = ["isoparse", "isoparser"] - - -def _takes_ascii(f): - @wraps(f) - def func(self, str_in, *args, **kwargs): - # If it's a stream, read the whole thing - str_in = getattr(str_in, 'read', lambda: str_in)() - - # If it's unicode, turn it into bytes, since ISO-8601 only covers ASCII - if isinstance(str_in, six.text_type): - # ASCII is the same in UTF-8 - try: - str_in = str_in.encode('ascii') - except UnicodeEncodeError as e: - msg = 'ISO-8601 strings should contain only ASCII characters' - six.raise_from(ValueError(msg), e) - - return f(self, str_in, *args, **kwargs) - - return func - - -class isoparser(object): - def __init__(self, sep=None): - """ - :param sep: - A single character that separates date and time portions. If - ``None``, the parser will accept any single character. - For strict ISO-8601 adherence, pass ``'T'``. - """ - if sep is not None: - if (len(sep) != 1 or ord(sep) >= 128 or sep in '0123456789'): - raise ValueError('Separator must be a single, non-numeric ' + - 'ASCII character') - - sep = sep.encode('ascii') - - self._sep = sep - - @_takes_ascii - def isoparse(self, dt_str): - """ - Parse an ISO-8601 datetime string into a :class:`datetime.datetime`. - - An ISO-8601 datetime string consists of a date portion, followed - optionally by a time portion - the date and time portions are separated - by a single character separator, which is ``T`` in the official - standard. Incomplete date formats (such as ``YYYY-MM``) may *not* be - combined with a time portion. - - Supported date formats are: - - Common: - - - ``YYYY`` - - ``YYYY-MM`` - - ``YYYY-MM-DD`` or ``YYYYMMDD`` - - Uncommon: - - - ``YYYY-Www`` or ``YYYYWww`` - ISO week (day defaults to 0) - - ``YYYY-Www-D`` or ``YYYYWwwD`` - ISO week and day - - The ISO week and day numbering follows the same logic as - :func:`datetime.date.isocalendar`. - - Supported time formats are: - - - ``hh`` - - ``hh:mm`` or ``hhmm`` - - ``hh:mm:ss`` or ``hhmmss`` - - ``hh:mm:ss.ssssss`` (Up to 6 sub-second digits) - - Midnight is a special case for `hh`, as the standard supports both - 00:00 and 24:00 as a representation. The decimal separator can be - either a dot or a comma. - - - .. caution:: - - Support for fractional components other than seconds is part of the - ISO-8601 standard, but is not currently implemented in this parser. - - Supported time zone offset formats are: - - - `Z` (UTC) - - `±HH:MM` - - `±HHMM` - - `±HH` - - Offsets will be represented as :class:`dateutil.tz.tzoffset` objects, - with the exception of UTC, which will be represented as - :class:`dateutil.tz.tzutc`. Time zone offsets equivalent to UTC (such - as `+00:00`) will also be represented as :class:`dateutil.tz.tzutc`. - - :param dt_str: - A string or stream containing only an ISO-8601 datetime string - - :return: - Returns a :class:`datetime.datetime` representing the string. - Unspecified components default to their lowest value. - - .. warning:: - - As of version 2.7.0, the strictness of the parser should not be - considered a stable part of the contract. Any valid ISO-8601 string - that parses correctly with the default settings will continue to - parse correctly in future versions, but invalid strings that - currently fail (e.g. ``2017-01-01T00:00+00:00:00``) are not - guaranteed to continue failing in future versions if they encode - a valid date. - - .. versionadded:: 2.7.0 - """ - components, pos = self._parse_isodate(dt_str) - - if len(dt_str) > pos: - if self._sep is None or dt_str[pos:pos + 1] == self._sep: - components += self._parse_isotime(dt_str[pos + 1:]) - else: - raise ValueError('String contains unknown ISO components') - - if len(components) > 3 and components[3] == 24: - components[3] = 0 - return datetime(*components) + timedelta(days=1) - - return datetime(*components) - - @_takes_ascii - def parse_isodate(self, datestr): - """ - Parse the date portion of an ISO string. - - :param datestr: - The string portion of an ISO string, without a separator - - :return: - Returns a :class:`datetime.date` object - """ - components, pos = self._parse_isodate(datestr) - if pos < len(datestr): - raise ValueError('String contains unknown ISO ' + - 'components: {!r}'.format(datestr.decode('ascii'))) - return date(*components) - - @_takes_ascii - def parse_isotime(self, timestr): - """ - Parse the time portion of an ISO string. - - :param timestr: - The time portion of an ISO string, without a separator - - :return: - Returns a :class:`datetime.time` object - """ - components = self._parse_isotime(timestr) - if components[0] == 24: - components[0] = 0 - return time(*components) - - @_takes_ascii - def parse_tzstr(self, tzstr, zero_as_utc=True): - """ - Parse a valid ISO time zone string. - - See :func:`isoparser.isoparse` for details on supported formats. - - :param tzstr: - A string representing an ISO time zone offset - - :param zero_as_utc: - Whether to return :class:`dateutil.tz.tzutc` for zero-offset zones - - :return: - Returns :class:`dateutil.tz.tzoffset` for offsets and - :class:`dateutil.tz.tzutc` for ``Z`` and (if ``zero_as_utc`` is - specified) offsets equivalent to UTC. - """ - return self._parse_tzstr(tzstr, zero_as_utc=zero_as_utc) - - # Constants - _DATE_SEP = b'-' - _TIME_SEP = b':' - _FRACTION_REGEX = re.compile(b'[\\.,]([0-9]+)') - - def _parse_isodate(self, dt_str): - try: - return self._parse_isodate_common(dt_str) - except ValueError: - return self._parse_isodate_uncommon(dt_str) - - def _parse_isodate_common(self, dt_str): - len_str = len(dt_str) - components = [1, 1, 1] - - if len_str < 4: - raise ValueError('ISO string too short') - - # Year - components[0] = int(dt_str[0:4]) - pos = 4 - if pos >= len_str: - return components, pos - - has_sep = dt_str[pos:pos + 1] == self._DATE_SEP - if has_sep: - pos += 1 - - # Month - if len_str - pos < 2: - raise ValueError('Invalid common month') - - components[1] = int(dt_str[pos:pos + 2]) - pos += 2 - - if pos >= len_str: - if has_sep: - return components, pos - else: - raise ValueError('Invalid ISO format') - - if has_sep: - if dt_str[pos:pos + 1] != self._DATE_SEP: - raise ValueError('Invalid separator in ISO string') - pos += 1 - - # Day - if len_str - pos < 2: - raise ValueError('Invalid common day') - components[2] = int(dt_str[pos:pos + 2]) - return components, pos + 2 - - def _parse_isodate_uncommon(self, dt_str): - if len(dt_str) < 4: - raise ValueError('ISO string too short') - - # All ISO formats start with the year - year = int(dt_str[0:4]) - - has_sep = dt_str[4:5] == self._DATE_SEP - - pos = 4 + has_sep # Skip '-' if it's there - if dt_str[pos:pos + 1] == b'W': - # YYYY-?Www-?D? - pos += 1 - weekno = int(dt_str[pos:pos + 2]) - pos += 2 - - dayno = 1 - if len(dt_str) > pos: - if (dt_str[pos:pos + 1] == self._DATE_SEP) != has_sep: - raise ValueError('Inconsistent use of dash separator') - - pos += has_sep - - dayno = int(dt_str[pos:pos + 1]) - pos += 1 - - base_date = self._calculate_weekdate(year, weekno, dayno) - else: - # YYYYDDD or YYYY-DDD - if len(dt_str) - pos < 3: - raise ValueError('Invalid ordinal day') - - ordinal_day = int(dt_str[pos:pos + 3]) - pos += 3 - - if ordinal_day < 1 or ordinal_day > (365 + calendar.isleap(year)): - raise ValueError('Invalid ordinal day' + - ' {} for year {}'.format(ordinal_day, year)) - - base_date = date(year, 1, 1) + timedelta(days=ordinal_day - 1) - - components = [base_date.year, base_date.month, base_date.day] - return components, pos - - def _calculate_weekdate(self, year, week, day): - """ - Calculate the day of corresponding to the ISO year-week-day calendar. - - This function is effectively the inverse of - :func:`datetime.date.isocalendar`. - - :param year: - The year in the ISO calendar - - :param week: - The week in the ISO calendar - range is [1, 53] - - :param day: - The day in the ISO calendar - range is [1 (MON), 7 (SUN)] - - :return: - Returns a :class:`datetime.date` - """ - if not 0 < week < 54: - raise ValueError('Invalid week: {}'.format(week)) - - if not 0 < day < 8: # Range is 1-7 - raise ValueError('Invalid weekday: {}'.format(day)) - - # Get week 1 for the specific year: - jan_4 = date(year, 1, 4) # Week 1 always has January 4th in it - week_1 = jan_4 - timedelta(days=jan_4.isocalendar()[2] - 1) - - # Now add the specific number of weeks and days to get what we want - week_offset = (week - 1) * 7 + (day - 1) - return week_1 + timedelta(days=week_offset) - - def _parse_isotime(self, timestr): - len_str = len(timestr) - components = [0, 0, 0, 0, None] - pos = 0 - comp = -1 - - if len_str < 2: - raise ValueError('ISO time too short') - - has_sep = False - - while pos < len_str and comp < 5: - comp += 1 - - if timestr[pos:pos + 1] in b'-+Zz': - # Detect time zone boundary - components[-1] = self._parse_tzstr(timestr[pos:]) - pos = len_str - break - - if comp == 1 and timestr[pos:pos+1] == self._TIME_SEP: - has_sep = True - pos += 1 - elif comp == 2 and has_sep: - if timestr[pos:pos+1] != self._TIME_SEP: - raise ValueError('Inconsistent use of colon separator') - pos += 1 - - if comp < 3: - # Hour, minute, second - components[comp] = int(timestr[pos:pos + 2]) - pos += 2 - - if comp == 3: - # Fraction of a second - frac = self._FRACTION_REGEX.match(timestr[pos:]) - if not frac: - continue - - us_str = frac.group(1)[:6] # Truncate to microseconds - components[comp] = int(us_str) * 10**(6 - len(us_str)) - pos += len(frac.group()) - - if pos < len_str: - raise ValueError('Unused components in ISO string') - - if components[0] == 24: - # Standard supports 00:00 and 24:00 as representations of midnight - if any(component != 0 for component in components[1:4]): - raise ValueError('Hour may only be 24 at 24:00:00.000') - - return components - - def _parse_tzstr(self, tzstr, zero_as_utc=True): - if tzstr == b'Z' or tzstr == b'z': - return tz.UTC - - if len(tzstr) not in {3, 5, 6}: - raise ValueError('Time zone offset must be 1, 3, 5 or 6 characters') - - if tzstr[0:1] == b'-': - mult = -1 - elif tzstr[0:1] == b'+': - mult = 1 - else: - raise ValueError('Time zone offset requires sign') - - hours = int(tzstr[1:3]) - if len(tzstr) == 3: - minutes = 0 - else: - minutes = int(tzstr[(4 if tzstr[3:4] == self._TIME_SEP else 3):]) - - if zero_as_utc and hours == 0 and minutes == 0: - return tz.UTC - else: - if minutes > 59: - raise ValueError('Invalid minutes in time zone offset') - - if hours > 23: - raise ValueError('Invalid hours in time zone offset') - - return tz.tzoffset(None, mult * (hours * 60 + minutes) * 60) - - -DEFAULT_ISOPARSER = isoparser() -isoparse = DEFAULT_ISOPARSER.isoparse diff --git a/.venv/Lib/site-packages/dateutil/relativedelta.py b/.venv/Lib/site-packages/dateutil/relativedelta.py deleted file mode 100644 index cd323a5..0000000 --- a/.venv/Lib/site-packages/dateutil/relativedelta.py +++ /dev/null @@ -1,599 +0,0 @@ -# -*- coding: utf-8 -*- -import datetime -import calendar - -import operator -from math import copysign - -from six import integer_types -from warnings import warn - -from ._common import weekday - -MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7)) - -__all__ = ["relativedelta", "MO", "TU", "WE", "TH", "FR", "SA", "SU"] - - -class relativedelta(object): - """ - The relativedelta type is designed to be applied to an existing datetime and - can replace specific components of that datetime, or represents an interval - of time. - - It is based on the specification of the excellent work done by M.-A. Lemburg - in his - `mx.DateTime `_ extension. - However, notice that this type does *NOT* implement the same algorithm as - his work. Do *NOT* expect it to behave like mx.DateTime's counterpart. - - There are two different ways to build a relativedelta instance. The - first one is passing it two date/datetime classes:: - - relativedelta(datetime1, datetime2) - - The second one is passing it any number of the following keyword arguments:: - - relativedelta(arg1=x,arg2=y,arg3=z...) - - year, month, day, hour, minute, second, microsecond: - Absolute information (argument is singular); adding or subtracting a - relativedelta with absolute information does not perform an arithmetic - operation, but rather REPLACES the corresponding value in the - original datetime with the value(s) in relativedelta. - - years, months, weeks, days, hours, minutes, seconds, microseconds: - Relative information, may be negative (argument is plural); adding - or subtracting a relativedelta with relative information performs - the corresponding arithmetic operation on the original datetime value - with the information in the relativedelta. - - weekday: - One of the weekday instances (MO, TU, etc) available in the - relativedelta module. These instances may receive a parameter N, - specifying the Nth weekday, which could be positive or negative - (like MO(+1) or MO(-2)). Not specifying it is the same as specifying - +1. You can also use an integer, where 0=MO. This argument is always - relative e.g. if the calculated date is already Monday, using MO(1) - or MO(-1) won't change the day. To effectively make it absolute, use - it in combination with the day argument (e.g. day=1, MO(1) for first - Monday of the month). - - leapdays: - Will add given days to the date found, if year is a leap - year, and the date found is post 28 of february. - - yearday, nlyearday: - Set the yearday or the non-leap year day (jump leap days). - These are converted to day/month/leapdays information. - - There are relative and absolute forms of the keyword - arguments. The plural is relative, and the singular is - absolute. For each argument in the order below, the absolute form - is applied first (by setting each attribute to that value) and - then the relative form (by adding the value to the attribute). - - The order of attributes considered when this relativedelta is - added to a datetime is: - - 1. Year - 2. Month - 3. Day - 4. Hours - 5. Minutes - 6. Seconds - 7. Microseconds - - Finally, weekday is applied, using the rule described above. - - For example - - >>> from datetime import datetime - >>> from dateutil.relativedelta import relativedelta, MO - >>> dt = datetime(2018, 4, 9, 13, 37, 0) - >>> delta = relativedelta(hours=25, day=1, weekday=MO(1)) - >>> dt + delta - datetime.datetime(2018, 4, 2, 14, 37) - - First, the day is set to 1 (the first of the month), then 25 hours - are added, to get to the 2nd day and 14th hour, finally the - weekday is applied, but since the 2nd is already a Monday there is - no effect. - - """ - - def __init__(self, dt1=None, dt2=None, - years=0, months=0, days=0, leapdays=0, weeks=0, - hours=0, minutes=0, seconds=0, microseconds=0, - year=None, month=None, day=None, weekday=None, - yearday=None, nlyearday=None, - hour=None, minute=None, second=None, microsecond=None): - - if dt1 and dt2: - # datetime is a subclass of date. So both must be date - if not (isinstance(dt1, datetime.date) and - isinstance(dt2, datetime.date)): - raise TypeError("relativedelta only diffs datetime/date") - - # We allow two dates, or two datetimes, so we coerce them to be - # of the same type - if (isinstance(dt1, datetime.datetime) != - isinstance(dt2, datetime.datetime)): - if not isinstance(dt1, datetime.datetime): - dt1 = datetime.datetime.fromordinal(dt1.toordinal()) - elif not isinstance(dt2, datetime.datetime): - dt2 = datetime.datetime.fromordinal(dt2.toordinal()) - - self.years = 0 - self.months = 0 - self.days = 0 - self.leapdays = 0 - self.hours = 0 - self.minutes = 0 - self.seconds = 0 - self.microseconds = 0 - self.year = None - self.month = None - self.day = None - self.weekday = None - self.hour = None - self.minute = None - self.second = None - self.microsecond = None - self._has_time = 0 - - # Get year / month delta between the two - months = (dt1.year - dt2.year) * 12 + (dt1.month - dt2.month) - self._set_months(months) - - # Remove the year/month delta so the timedelta is just well-defined - # time units (seconds, days and microseconds) - dtm = self.__radd__(dt2) - - # If we've overshot our target, make an adjustment - if dt1 < dt2: - compare = operator.gt - increment = 1 - else: - compare = operator.lt - increment = -1 - - while compare(dt1, dtm): - months += increment - self._set_months(months) - dtm = self.__radd__(dt2) - - # Get the timedelta between the "months-adjusted" date and dt1 - delta = dt1 - dtm - self.seconds = delta.seconds + delta.days * 86400 - self.microseconds = delta.microseconds - else: - # Check for non-integer values in integer-only quantities - if any(x is not None and x != int(x) for x in (years, months)): - raise ValueError("Non-integer years and months are " - "ambiguous and not currently supported.") - - # Relative information - self.years = int(years) - self.months = int(months) - self.days = days + weeks * 7 - self.leapdays = leapdays - self.hours = hours - self.minutes = minutes - self.seconds = seconds - self.microseconds = microseconds - - # Absolute information - self.year = year - self.month = month - self.day = day - self.hour = hour - self.minute = minute - self.second = second - self.microsecond = microsecond - - if any(x is not None and int(x) != x - for x in (year, month, day, hour, - minute, second, microsecond)): - # For now we'll deprecate floats - later it'll be an error. - warn("Non-integer value passed as absolute information. " + - "This is not a well-defined condition and will raise " + - "errors in future versions.", DeprecationWarning) - - if isinstance(weekday, integer_types): - self.weekday = weekdays[weekday] - else: - self.weekday = weekday - - yday = 0 - if nlyearday: - yday = nlyearday - elif yearday: - yday = yearday - if yearday > 59: - self.leapdays = -1 - if yday: - ydayidx = [31, 59, 90, 120, 151, 181, 212, - 243, 273, 304, 334, 366] - for idx, ydays in enumerate(ydayidx): - if yday <= ydays: - self.month = idx+1 - if idx == 0: - self.day = yday - else: - self.day = yday-ydayidx[idx-1] - break - else: - raise ValueError("invalid year day (%d)" % yday) - - self._fix() - - def _fix(self): - if abs(self.microseconds) > 999999: - s = _sign(self.microseconds) - div, mod = divmod(self.microseconds * s, 1000000) - self.microseconds = mod * s - self.seconds += div * s - if abs(self.seconds) > 59: - s = _sign(self.seconds) - div, mod = divmod(self.seconds * s, 60) - self.seconds = mod * s - self.minutes += div * s - if abs(self.minutes) > 59: - s = _sign(self.minutes) - div, mod = divmod(self.minutes * s, 60) - self.minutes = mod * s - self.hours += div * s - if abs(self.hours) > 23: - s = _sign(self.hours) - div, mod = divmod(self.hours * s, 24) - self.hours = mod * s - self.days += div * s - if abs(self.months) > 11: - s = _sign(self.months) - div, mod = divmod(self.months * s, 12) - self.months = mod * s - self.years += div * s - if (self.hours or self.minutes or self.seconds or self.microseconds - or self.hour is not None or self.minute is not None or - self.second is not None or self.microsecond is not None): - self._has_time = 1 - else: - self._has_time = 0 - - @property - def weeks(self): - return int(self.days / 7.0) - - @weeks.setter - def weeks(self, value): - self.days = self.days - (self.weeks * 7) + value * 7 - - def _set_months(self, months): - self.months = months - if abs(self.months) > 11: - s = _sign(self.months) - div, mod = divmod(self.months * s, 12) - self.months = mod * s - self.years = div * s - else: - self.years = 0 - - def normalized(self): - """ - Return a version of this object represented entirely using integer - values for the relative attributes. - - >>> relativedelta(days=1.5, hours=2).normalized() - relativedelta(days=+1, hours=+14) - - :return: - Returns a :class:`dateutil.relativedelta.relativedelta` object. - """ - # Cascade remainders down (rounding each to roughly nearest microsecond) - days = int(self.days) - - hours_f = round(self.hours + 24 * (self.days - days), 11) - hours = int(hours_f) - - minutes_f = round(self.minutes + 60 * (hours_f - hours), 10) - minutes = int(minutes_f) - - seconds_f = round(self.seconds + 60 * (minutes_f - minutes), 8) - seconds = int(seconds_f) - - microseconds = round(self.microseconds + 1e6 * (seconds_f - seconds)) - - # Constructor carries overflow back up with call to _fix() - return self.__class__(years=self.years, months=self.months, - days=days, hours=hours, minutes=minutes, - seconds=seconds, microseconds=microseconds, - leapdays=self.leapdays, year=self.year, - month=self.month, day=self.day, - weekday=self.weekday, hour=self.hour, - minute=self.minute, second=self.second, - microsecond=self.microsecond) - - def __add__(self, other): - if isinstance(other, relativedelta): - return self.__class__(years=other.years + self.years, - months=other.months + self.months, - days=other.days + self.days, - hours=other.hours + self.hours, - minutes=other.minutes + self.minutes, - seconds=other.seconds + self.seconds, - microseconds=(other.microseconds + - self.microseconds), - leapdays=other.leapdays or self.leapdays, - year=(other.year if other.year is not None - else self.year), - month=(other.month if other.month is not None - else self.month), - day=(other.day if other.day is not None - else self.day), - weekday=(other.weekday if other.weekday is not None - else self.weekday), - hour=(other.hour if other.hour is not None - else self.hour), - minute=(other.minute if other.minute is not None - else self.minute), - second=(other.second if other.second is not None - else self.second), - microsecond=(other.microsecond if other.microsecond - is not None else - self.microsecond)) - if isinstance(other, datetime.timedelta): - return self.__class__(years=self.years, - months=self.months, - days=self.days + other.days, - hours=self.hours, - minutes=self.minutes, - seconds=self.seconds + other.seconds, - microseconds=self.microseconds + other.microseconds, - leapdays=self.leapdays, - year=self.year, - month=self.month, - day=self.day, - weekday=self.weekday, - hour=self.hour, - minute=self.minute, - second=self.second, - microsecond=self.microsecond) - if not isinstance(other, datetime.date): - return NotImplemented - elif self._has_time and not isinstance(other, datetime.datetime): - other = datetime.datetime.fromordinal(other.toordinal()) - year = (self.year or other.year)+self.years - month = self.month or other.month - if self.months: - assert 1 <= abs(self.months) <= 12 - month += self.months - if month > 12: - year += 1 - month -= 12 - elif month < 1: - year -= 1 - month += 12 - day = min(calendar.monthrange(year, month)[1], - self.day or other.day) - repl = {"year": year, "month": month, "day": day} - for attr in ["hour", "minute", "second", "microsecond"]: - value = getattr(self, attr) - if value is not None: - repl[attr] = value - days = self.days - if self.leapdays and month > 2 and calendar.isleap(year): - days += self.leapdays - ret = (other.replace(**repl) - + datetime.timedelta(days=days, - hours=self.hours, - minutes=self.minutes, - seconds=self.seconds, - microseconds=self.microseconds)) - if self.weekday: - weekday, nth = self.weekday.weekday, self.weekday.n or 1 - jumpdays = (abs(nth) - 1) * 7 - if nth > 0: - jumpdays += (7 - ret.weekday() + weekday) % 7 - else: - jumpdays += (ret.weekday() - weekday) % 7 - jumpdays *= -1 - ret += datetime.timedelta(days=jumpdays) - return ret - - def __radd__(self, other): - return self.__add__(other) - - def __rsub__(self, other): - return self.__neg__().__radd__(other) - - def __sub__(self, other): - if not isinstance(other, relativedelta): - return NotImplemented # In case the other object defines __rsub__ - return self.__class__(years=self.years - other.years, - months=self.months - other.months, - days=self.days - other.days, - hours=self.hours - other.hours, - minutes=self.minutes - other.minutes, - seconds=self.seconds - other.seconds, - microseconds=self.microseconds - other.microseconds, - leapdays=self.leapdays or other.leapdays, - year=(self.year if self.year is not None - else other.year), - month=(self.month if self.month is not None else - other.month), - day=(self.day if self.day is not None else - other.day), - weekday=(self.weekday if self.weekday is not None else - other.weekday), - hour=(self.hour if self.hour is not None else - other.hour), - minute=(self.minute if self.minute is not None else - other.minute), - second=(self.second if self.second is not None else - other.second), - microsecond=(self.microsecond if self.microsecond - is not None else - other.microsecond)) - - def __abs__(self): - return self.__class__(years=abs(self.years), - months=abs(self.months), - days=abs(self.days), - hours=abs(self.hours), - minutes=abs(self.minutes), - seconds=abs(self.seconds), - microseconds=abs(self.microseconds), - leapdays=self.leapdays, - year=self.year, - month=self.month, - day=self.day, - weekday=self.weekday, - hour=self.hour, - minute=self.minute, - second=self.second, - microsecond=self.microsecond) - - def __neg__(self): - return self.__class__(years=-self.years, - months=-self.months, - days=-self.days, - hours=-self.hours, - minutes=-self.minutes, - seconds=-self.seconds, - microseconds=-self.microseconds, - leapdays=self.leapdays, - year=self.year, - month=self.month, - day=self.day, - weekday=self.weekday, - hour=self.hour, - minute=self.minute, - second=self.second, - microsecond=self.microsecond) - - def __bool__(self): - return not (not self.years and - not self.months and - not self.days and - not self.hours and - not self.minutes and - not self.seconds and - not self.microseconds and - not self.leapdays and - self.year is None and - self.month is None and - self.day is None and - self.weekday is None and - self.hour is None and - self.minute is None and - self.second is None and - self.microsecond is None) - # Compatibility with Python 2.x - __nonzero__ = __bool__ - - def __mul__(self, other): - try: - f = float(other) - except TypeError: - return NotImplemented - - return self.__class__(years=int(self.years * f), - months=int(self.months * f), - days=int(self.days * f), - hours=int(self.hours * f), - minutes=int(self.minutes * f), - seconds=int(self.seconds * f), - microseconds=int(self.microseconds * f), - leapdays=self.leapdays, - year=self.year, - month=self.month, - day=self.day, - weekday=self.weekday, - hour=self.hour, - minute=self.minute, - second=self.second, - microsecond=self.microsecond) - - __rmul__ = __mul__ - - def __eq__(self, other): - if not isinstance(other, relativedelta): - return NotImplemented - if self.weekday or other.weekday: - if not self.weekday or not other.weekday: - return False - if self.weekday.weekday != other.weekday.weekday: - return False - n1, n2 = self.weekday.n, other.weekday.n - if n1 != n2 and not ((not n1 or n1 == 1) and (not n2 or n2 == 1)): - return False - return (self.years == other.years and - self.months == other.months and - self.days == other.days and - self.hours == other.hours and - self.minutes == other.minutes and - self.seconds == other.seconds and - self.microseconds == other.microseconds and - self.leapdays == other.leapdays and - self.year == other.year and - self.month == other.month and - self.day == other.day and - self.hour == other.hour and - self.minute == other.minute and - self.second == other.second and - self.microsecond == other.microsecond) - - def __hash__(self): - return hash(( - self.weekday, - self.years, - self.months, - self.days, - self.hours, - self.minutes, - self.seconds, - self.microseconds, - self.leapdays, - self.year, - self.month, - self.day, - self.hour, - self.minute, - self.second, - self.microsecond, - )) - - def __ne__(self, other): - return not self.__eq__(other) - - def __div__(self, other): - try: - reciprocal = 1 / float(other) - except TypeError: - return NotImplemented - - return self.__mul__(reciprocal) - - __truediv__ = __div__ - - def __repr__(self): - l = [] - for attr in ["years", "months", "days", "leapdays", - "hours", "minutes", "seconds", "microseconds"]: - value = getattr(self, attr) - if value: - l.append("{attr}={value:+g}".format(attr=attr, value=value)) - for attr in ["year", "month", "day", "weekday", - "hour", "minute", "second", "microsecond"]: - value = getattr(self, attr) - if value is not None: - l.append("{attr}={value}".format(attr=attr, value=repr(value))) - return "{classname}({attrs})".format(classname=self.__class__.__name__, - attrs=", ".join(l)) - - -def _sign(x): - return int(copysign(1, x)) - -# vim:ts=4:sw=4:et diff --git a/.venv/Lib/site-packages/dateutil/rrule.py b/.venv/Lib/site-packages/dateutil/rrule.py deleted file mode 100644 index 571a0d2..0000000 --- a/.venv/Lib/site-packages/dateutil/rrule.py +++ /dev/null @@ -1,1737 +0,0 @@ -# -*- coding: utf-8 -*- -""" -The rrule module offers a small, complete, and very fast, implementation of -the recurrence rules documented in the -`iCalendar RFC `_, -including support for caching of results. -""" -import calendar -import datetime -import heapq -import itertools -import re -import sys -from functools import wraps -# For warning about deprecation of until and count -from warnings import warn - -from six import advance_iterator, integer_types - -from six.moves import _thread, range - -from ._common import weekday as weekdaybase - -try: - from math import gcd -except ImportError: - from fractions import gcd - -__all__ = ["rrule", "rruleset", "rrulestr", - "YEARLY", "MONTHLY", "WEEKLY", "DAILY", - "HOURLY", "MINUTELY", "SECONDLY", - "MO", "TU", "WE", "TH", "FR", "SA", "SU"] - -# Every mask is 7 days longer to handle cross-year weekly periods. -M366MASK = tuple([1]*31+[2]*29+[3]*31+[4]*30+[5]*31+[6]*30 + - [7]*31+[8]*31+[9]*30+[10]*31+[11]*30+[12]*31+[1]*7) -M365MASK = list(M366MASK) -M29, M30, M31 = list(range(1, 30)), list(range(1, 31)), list(range(1, 32)) -MDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) -MDAY365MASK = list(MDAY366MASK) -M29, M30, M31 = list(range(-29, 0)), list(range(-30, 0)), list(range(-31, 0)) -NMDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) -NMDAY365MASK = list(NMDAY366MASK) -M366RANGE = (0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366) -M365RANGE = (0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365) -WDAYMASK = [0, 1, 2, 3, 4, 5, 6]*55 -del M29, M30, M31, M365MASK[59], MDAY365MASK[59], NMDAY365MASK[31] -MDAY365MASK = tuple(MDAY365MASK) -M365MASK = tuple(M365MASK) - -FREQNAMES = ['YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', 'HOURLY', 'MINUTELY', 'SECONDLY'] - -(YEARLY, - MONTHLY, - WEEKLY, - DAILY, - HOURLY, - MINUTELY, - SECONDLY) = list(range(7)) - -# Imported on demand. -easter = None -parser = None - - -class weekday(weekdaybase): - """ - This version of weekday does not allow n = 0. - """ - def __init__(self, wkday, n=None): - if n == 0: - raise ValueError("Can't create weekday with n==0") - - super(weekday, self).__init__(wkday, n) - - -MO, TU, WE, TH, FR, SA, SU = weekdays = tuple(weekday(x) for x in range(7)) - - -def _invalidates_cache(f): - """ - Decorator for rruleset methods which may invalidate the - cached length. - """ - @wraps(f) - def inner_func(self, *args, **kwargs): - rv = f(self, *args, **kwargs) - self._invalidate_cache() - return rv - - return inner_func - - -class rrulebase(object): - def __init__(self, cache=False): - if cache: - self._cache = [] - self._cache_lock = _thread.allocate_lock() - self._invalidate_cache() - else: - self._cache = None - self._cache_complete = False - self._len = None - - def __iter__(self): - if self._cache_complete: - return iter(self._cache) - elif self._cache is None: - return self._iter() - else: - return self._iter_cached() - - def _invalidate_cache(self): - if self._cache is not None: - self._cache = [] - self._cache_complete = False - self._cache_gen = self._iter() - - if self._cache_lock.locked(): - self._cache_lock.release() - - self._len = None - - def _iter_cached(self): - i = 0 - gen = self._cache_gen - cache = self._cache - acquire = self._cache_lock.acquire - release = self._cache_lock.release - while gen: - if i == len(cache): - acquire() - if self._cache_complete: - break - try: - for j in range(10): - cache.append(advance_iterator(gen)) - except StopIteration: - self._cache_gen = gen = None - self._cache_complete = True - break - release() - yield cache[i] - i += 1 - while i < self._len: - yield cache[i] - i += 1 - - def __getitem__(self, item): - if self._cache_complete: - return self._cache[item] - elif isinstance(item, slice): - if item.step and item.step < 0: - return list(iter(self))[item] - else: - return list(itertools.islice(self, - item.start or 0, - item.stop or sys.maxsize, - item.step or 1)) - elif item >= 0: - gen = iter(self) - try: - for i in range(item+1): - res = advance_iterator(gen) - except StopIteration: - raise IndexError - return res - else: - return list(iter(self))[item] - - def __contains__(self, item): - if self._cache_complete: - return item in self._cache - else: - for i in self: - if i == item: - return True - elif i > item: - return False - return False - - # __len__() introduces a large performance penalty. - def count(self): - """ Returns the number of recurrences in this set. It will have go - through the whole recurrence, if this hasn't been done before. """ - if self._len is None: - for x in self: - pass - return self._len - - def before(self, dt, inc=False): - """ Returns the last recurrence before the given datetime instance. The - inc keyword defines what happens if dt is an occurrence. With - inc=True, if dt itself is an occurrence, it will be returned. """ - if self._cache_complete: - gen = self._cache - else: - gen = self - last = None - if inc: - for i in gen: - if i > dt: - break - last = i - else: - for i in gen: - if i >= dt: - break - last = i - return last - - def after(self, dt, inc=False): - """ Returns the first recurrence after the given datetime instance. The - inc keyword defines what happens if dt is an occurrence. With - inc=True, if dt itself is an occurrence, it will be returned. """ - if self._cache_complete: - gen = self._cache - else: - gen = self - if inc: - for i in gen: - if i >= dt: - return i - else: - for i in gen: - if i > dt: - return i - return None - - def xafter(self, dt, count=None, inc=False): - """ - Generator which yields up to `count` recurrences after the given - datetime instance, equivalent to `after`. - - :param dt: - The datetime at which to start generating recurrences. - - :param count: - The maximum number of recurrences to generate. If `None` (default), - dates are generated until the recurrence rule is exhausted. - - :param inc: - If `dt` is an instance of the rule and `inc` is `True`, it is - included in the output. - - :yields: Yields a sequence of `datetime` objects. - """ - - if self._cache_complete: - gen = self._cache - else: - gen = self - - # Select the comparison function - if inc: - comp = lambda dc, dtc: dc >= dtc - else: - comp = lambda dc, dtc: dc > dtc - - # Generate dates - n = 0 - for d in gen: - if comp(d, dt): - if count is not None: - n += 1 - if n > count: - break - - yield d - - def between(self, after, before, inc=False, count=1): - """ Returns all the occurrences of the rrule between after and before. - The inc keyword defines what happens if after and/or before are - themselves occurrences. With inc=True, they will be included in the - list, if they are found in the recurrence set. """ - if self._cache_complete: - gen = self._cache - else: - gen = self - started = False - l = [] - if inc: - for i in gen: - if i > before: - break - elif not started: - if i >= after: - started = True - l.append(i) - else: - l.append(i) - else: - for i in gen: - if i >= before: - break - elif not started: - if i > after: - started = True - l.append(i) - else: - l.append(i) - return l - - -class rrule(rrulebase): - """ - That's the base of the rrule operation. It accepts all the keywords - defined in the RFC as its constructor parameters (except byday, - which was renamed to byweekday) and more. The constructor prototype is:: - - rrule(freq) - - Where freq must be one of YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, - or SECONDLY. - - .. note:: - Per RFC section 3.3.10, recurrence instances falling on invalid dates - and times are ignored rather than coerced: - - Recurrence rules may generate recurrence instances with an invalid - date (e.g., February 30) or nonexistent local time (e.g., 1:30 AM - on a day where the local time is moved forward by an hour at 1:00 - AM). Such recurrence instances MUST be ignored and MUST NOT be - counted as part of the recurrence set. - - This can lead to possibly surprising behavior when, for example, the - start date occurs at the end of the month: - - >>> from dateutil.rrule import rrule, MONTHLY - >>> from datetime import datetime - >>> start_date = datetime(2014, 12, 31) - >>> list(rrule(freq=MONTHLY, count=4, dtstart=start_date)) - ... # doctest: +NORMALIZE_WHITESPACE - [datetime.datetime(2014, 12, 31, 0, 0), - datetime.datetime(2015, 1, 31, 0, 0), - datetime.datetime(2015, 3, 31, 0, 0), - datetime.datetime(2015, 5, 31, 0, 0)] - - Additionally, it supports the following keyword arguments: - - :param dtstart: - The recurrence start. Besides being the base for the recurrence, - missing parameters in the final recurrence instances will also be - extracted from this date. If not given, datetime.now() will be used - instead. - :param interval: - The interval between each freq iteration. For example, when using - YEARLY, an interval of 2 means once every two years, but with HOURLY, - it means once every two hours. The default interval is 1. - :param wkst: - The week start day. Must be one of the MO, TU, WE constants, or an - integer, specifying the first day of the week. This will affect - recurrences based on weekly periods. The default week start is got - from calendar.firstweekday(), and may be modified by - calendar.setfirstweekday(). - :param count: - If given, this determines how many occurrences will be generated. - - .. note:: - As of version 2.5.0, the use of the keyword ``until`` in conjunction - with ``count`` is deprecated, to make sure ``dateutil`` is fully - compliant with `RFC-5545 Sec. 3.3.10 `_. Therefore, ``until`` and ``count`` - **must not** occur in the same call to ``rrule``. - :param until: - If given, this must be a datetime instance specifying the upper-bound - limit of the recurrence. The last recurrence in the rule is the greatest - datetime that is less than or equal to the value specified in the - ``until`` parameter. - - .. note:: - As of version 2.5.0, the use of the keyword ``until`` in conjunction - with ``count`` is deprecated, to make sure ``dateutil`` is fully - compliant with `RFC-5545 Sec. 3.3.10 `_. Therefore, ``until`` and ``count`` - **must not** occur in the same call to ``rrule``. - :param bysetpos: - If given, it must be either an integer, or a sequence of integers, - positive or negative. Each given integer will specify an occurrence - number, corresponding to the nth occurrence of the rule inside the - frequency period. For example, a bysetpos of -1 if combined with a - MONTHLY frequency, and a byweekday of (MO, TU, WE, TH, FR), will - result in the last work day of every month. - :param bymonth: - If given, it must be either an integer, or a sequence of integers, - meaning the months to apply the recurrence to. - :param bymonthday: - If given, it must be either an integer, or a sequence of integers, - meaning the month days to apply the recurrence to. - :param byyearday: - If given, it must be either an integer, or a sequence of integers, - meaning the year days to apply the recurrence to. - :param byeaster: - If given, it must be either an integer, or a sequence of integers, - positive or negative. Each integer will define an offset from the - Easter Sunday. Passing the offset 0 to byeaster will yield the Easter - Sunday itself. This is an extension to the RFC specification. - :param byweekno: - If given, it must be either an integer, or a sequence of integers, - meaning the week numbers to apply the recurrence to. Week numbers - have the meaning described in ISO8601, that is, the first week of - the year is that containing at least four days of the new year. - :param byweekday: - If given, it must be either an integer (0 == MO), a sequence of - integers, one of the weekday constants (MO, TU, etc), or a sequence - of these constants. When given, these variables will define the - weekdays where the recurrence will be applied. It's also possible to - use an argument n for the weekday instances, which will mean the nth - occurrence of this weekday in the period. For example, with MONTHLY, - or with YEARLY and BYMONTH, using FR(+1) in byweekday will specify the - first friday of the month where the recurrence happens. Notice that in - the RFC documentation, this is specified as BYDAY, but was renamed to - avoid the ambiguity of that keyword. - :param byhour: - If given, it must be either an integer, or a sequence of integers, - meaning the hours to apply the recurrence to. - :param byminute: - If given, it must be either an integer, or a sequence of integers, - meaning the minutes to apply the recurrence to. - :param bysecond: - If given, it must be either an integer, or a sequence of integers, - meaning the seconds to apply the recurrence to. - :param cache: - If given, it must be a boolean value specifying to enable or disable - caching of results. If you will use the same rrule instance multiple - times, enabling caching will improve the performance considerably. - """ - def __init__(self, freq, dtstart=None, - interval=1, wkst=None, count=None, until=None, bysetpos=None, - bymonth=None, bymonthday=None, byyearday=None, byeaster=None, - byweekno=None, byweekday=None, - byhour=None, byminute=None, bysecond=None, - cache=False): - super(rrule, self).__init__(cache) - global easter - if not dtstart: - if until and until.tzinfo: - dtstart = datetime.datetime.now(tz=until.tzinfo).replace(microsecond=0) - else: - dtstart = datetime.datetime.now().replace(microsecond=0) - elif not isinstance(dtstart, datetime.datetime): - dtstart = datetime.datetime.fromordinal(dtstart.toordinal()) - else: - dtstart = dtstart.replace(microsecond=0) - self._dtstart = dtstart - self._tzinfo = dtstart.tzinfo - self._freq = freq - self._interval = interval - self._count = count - - # Cache the original byxxx rules, if they are provided, as the _byxxx - # attributes do not necessarily map to the inputs, and this can be - # a problem in generating the strings. Only store things if they've - # been supplied (the string retrieval will just use .get()) - self._original_rule = {} - - if until and not isinstance(until, datetime.datetime): - until = datetime.datetime.fromordinal(until.toordinal()) - self._until = until - - if self._dtstart and self._until: - if (self._dtstart.tzinfo is not None) != (self._until.tzinfo is not None): - # According to RFC5545 Section 3.3.10: - # https://tools.ietf.org/html/rfc5545#section-3.3.10 - # - # > If the "DTSTART" property is specified as a date with UTC - # > time or a date with local time and time zone reference, - # > then the UNTIL rule part MUST be specified as a date with - # > UTC time. - raise ValueError( - 'RRULE UNTIL values must be specified in UTC when DTSTART ' - 'is timezone-aware' - ) - - if count is not None and until: - warn("Using both 'count' and 'until' is inconsistent with RFC 5545" - " and has been deprecated in dateutil. Future versions will " - "raise an error.", DeprecationWarning) - - if wkst is None: - self._wkst = calendar.firstweekday() - elif isinstance(wkst, integer_types): - self._wkst = wkst - else: - self._wkst = wkst.weekday - - if bysetpos is None: - self._bysetpos = None - elif isinstance(bysetpos, integer_types): - if bysetpos == 0 or not (-366 <= bysetpos <= 366): - raise ValueError("bysetpos must be between 1 and 366, " - "or between -366 and -1") - self._bysetpos = (bysetpos,) - else: - self._bysetpos = tuple(bysetpos) - for pos in self._bysetpos: - if pos == 0 or not (-366 <= pos <= 366): - raise ValueError("bysetpos must be between 1 and 366, " - "or between -366 and -1") - - if self._bysetpos: - self._original_rule['bysetpos'] = self._bysetpos - - if (byweekno is None and byyearday is None and bymonthday is None and - byweekday is None and byeaster is None): - if freq == YEARLY: - if bymonth is None: - bymonth = dtstart.month - self._original_rule['bymonth'] = None - bymonthday = dtstart.day - self._original_rule['bymonthday'] = None - elif freq == MONTHLY: - bymonthday = dtstart.day - self._original_rule['bymonthday'] = None - elif freq == WEEKLY: - byweekday = dtstart.weekday() - self._original_rule['byweekday'] = None - - # bymonth - if bymonth is None: - self._bymonth = None - else: - if isinstance(bymonth, integer_types): - bymonth = (bymonth,) - - self._bymonth = tuple(sorted(set(bymonth))) - - if 'bymonth' not in self._original_rule: - self._original_rule['bymonth'] = self._bymonth - - # byyearday - if byyearday is None: - self._byyearday = None - else: - if isinstance(byyearday, integer_types): - byyearday = (byyearday,) - - self._byyearday = tuple(sorted(set(byyearday))) - self._original_rule['byyearday'] = self._byyearday - - # byeaster - if byeaster is not None: - if not easter: - from dateutil import easter - if isinstance(byeaster, integer_types): - self._byeaster = (byeaster,) - else: - self._byeaster = tuple(sorted(byeaster)) - - self._original_rule['byeaster'] = self._byeaster - else: - self._byeaster = None - - # bymonthday - if bymonthday is None: - self._bymonthday = () - self._bynmonthday = () - else: - if isinstance(bymonthday, integer_types): - bymonthday = (bymonthday,) - - bymonthday = set(bymonthday) # Ensure it's unique - - self._bymonthday = tuple(sorted(x for x in bymonthday if x > 0)) - self._bynmonthday = tuple(sorted(x for x in bymonthday if x < 0)) - - # Storing positive numbers first, then negative numbers - if 'bymonthday' not in self._original_rule: - self._original_rule['bymonthday'] = tuple( - itertools.chain(self._bymonthday, self._bynmonthday)) - - # byweekno - if byweekno is None: - self._byweekno = None - else: - if isinstance(byweekno, integer_types): - byweekno = (byweekno,) - - self._byweekno = tuple(sorted(set(byweekno))) - - self._original_rule['byweekno'] = self._byweekno - - # byweekday / bynweekday - if byweekday is None: - self._byweekday = None - self._bynweekday = None - else: - # If it's one of the valid non-sequence types, convert to a - # single-element sequence before the iterator that builds the - # byweekday set. - if isinstance(byweekday, integer_types) or hasattr(byweekday, "n"): - byweekday = (byweekday,) - - self._byweekday = set() - self._bynweekday = set() - for wday in byweekday: - if isinstance(wday, integer_types): - self._byweekday.add(wday) - elif not wday.n or freq > MONTHLY: - self._byweekday.add(wday.weekday) - else: - self._bynweekday.add((wday.weekday, wday.n)) - - if not self._byweekday: - self._byweekday = None - elif not self._bynweekday: - self._bynweekday = None - - if self._byweekday is not None: - self._byweekday = tuple(sorted(self._byweekday)) - orig_byweekday = [weekday(x) for x in self._byweekday] - else: - orig_byweekday = () - - if self._bynweekday is not None: - self._bynweekday = tuple(sorted(self._bynweekday)) - orig_bynweekday = [weekday(*x) for x in self._bynweekday] - else: - orig_bynweekday = () - - if 'byweekday' not in self._original_rule: - self._original_rule['byweekday'] = tuple(itertools.chain( - orig_byweekday, orig_bynweekday)) - - # byhour - if byhour is None: - if freq < HOURLY: - self._byhour = {dtstart.hour} - else: - self._byhour = None - else: - if isinstance(byhour, integer_types): - byhour = (byhour,) - - if freq == HOURLY: - self._byhour = self.__construct_byset(start=dtstart.hour, - byxxx=byhour, - base=24) - else: - self._byhour = set(byhour) - - self._byhour = tuple(sorted(self._byhour)) - self._original_rule['byhour'] = self._byhour - - # byminute - if byminute is None: - if freq < MINUTELY: - self._byminute = {dtstart.minute} - else: - self._byminute = None - else: - if isinstance(byminute, integer_types): - byminute = (byminute,) - - if freq == MINUTELY: - self._byminute = self.__construct_byset(start=dtstart.minute, - byxxx=byminute, - base=60) - else: - self._byminute = set(byminute) - - self._byminute = tuple(sorted(self._byminute)) - self._original_rule['byminute'] = self._byminute - - # bysecond - if bysecond is None: - if freq < SECONDLY: - self._bysecond = ((dtstart.second,)) - else: - self._bysecond = None - else: - if isinstance(bysecond, integer_types): - bysecond = (bysecond,) - - self._bysecond = set(bysecond) - - if freq == SECONDLY: - self._bysecond = self.__construct_byset(start=dtstart.second, - byxxx=bysecond, - base=60) - else: - self._bysecond = set(bysecond) - - self._bysecond = tuple(sorted(self._bysecond)) - self._original_rule['bysecond'] = self._bysecond - - if self._freq >= HOURLY: - self._timeset = None - else: - self._timeset = [] - for hour in self._byhour: - for minute in self._byminute: - for second in self._bysecond: - self._timeset.append( - datetime.time(hour, minute, second, - tzinfo=self._tzinfo)) - self._timeset.sort() - self._timeset = tuple(self._timeset) - - def __str__(self): - """ - Output a string that would generate this RRULE if passed to rrulestr. - This is mostly compatible with RFC5545, except for the - dateutil-specific extension BYEASTER. - """ - - output = [] - h, m, s = [None] * 3 - if self._dtstart: - output.append(self._dtstart.strftime('DTSTART:%Y%m%dT%H%M%S')) - h, m, s = self._dtstart.timetuple()[3:6] - - parts = ['FREQ=' + FREQNAMES[self._freq]] - if self._interval != 1: - parts.append('INTERVAL=' + str(self._interval)) - - if self._wkst: - parts.append('WKST=' + repr(weekday(self._wkst))[0:2]) - - if self._count is not None: - parts.append('COUNT=' + str(self._count)) - - if self._until: - parts.append(self._until.strftime('UNTIL=%Y%m%dT%H%M%S')) - - if self._original_rule.get('byweekday') is not None: - # The str() method on weekday objects doesn't generate - # RFC5545-compliant strings, so we should modify that. - original_rule = dict(self._original_rule) - wday_strings = [] - for wday in original_rule['byweekday']: - if wday.n: - wday_strings.append('{n:+d}{wday}'.format( - n=wday.n, - wday=repr(wday)[0:2])) - else: - wday_strings.append(repr(wday)) - - original_rule['byweekday'] = wday_strings - else: - original_rule = self._original_rule - - partfmt = '{name}={vals}' - for name, key in [('BYSETPOS', 'bysetpos'), - ('BYMONTH', 'bymonth'), - ('BYMONTHDAY', 'bymonthday'), - ('BYYEARDAY', 'byyearday'), - ('BYWEEKNO', 'byweekno'), - ('BYDAY', 'byweekday'), - ('BYHOUR', 'byhour'), - ('BYMINUTE', 'byminute'), - ('BYSECOND', 'bysecond'), - ('BYEASTER', 'byeaster')]: - value = original_rule.get(key) - if value: - parts.append(partfmt.format(name=name, vals=(','.join(str(v) - for v in value)))) - - output.append('RRULE:' + ';'.join(parts)) - return '\n'.join(output) - - def replace(self, **kwargs): - """Return new rrule with same attributes except for those attributes given new - values by whichever keyword arguments are specified.""" - new_kwargs = {"interval": self._interval, - "count": self._count, - "dtstart": self._dtstart, - "freq": self._freq, - "until": self._until, - "wkst": self._wkst, - "cache": False if self._cache is None else True } - new_kwargs.update(self._original_rule) - new_kwargs.update(kwargs) - return rrule(**new_kwargs) - - def _iter(self): - year, month, day, hour, minute, second, weekday, yearday, _ = \ - self._dtstart.timetuple() - - # Some local variables to speed things up a bit - freq = self._freq - interval = self._interval - wkst = self._wkst - until = self._until - bymonth = self._bymonth - byweekno = self._byweekno - byyearday = self._byyearday - byweekday = self._byweekday - byeaster = self._byeaster - bymonthday = self._bymonthday - bynmonthday = self._bynmonthday - bysetpos = self._bysetpos - byhour = self._byhour - byminute = self._byminute - bysecond = self._bysecond - - ii = _iterinfo(self) - ii.rebuild(year, month) - - getdayset = {YEARLY: ii.ydayset, - MONTHLY: ii.mdayset, - WEEKLY: ii.wdayset, - DAILY: ii.ddayset, - HOURLY: ii.ddayset, - MINUTELY: ii.ddayset, - SECONDLY: ii.ddayset}[freq] - - if freq < HOURLY: - timeset = self._timeset - else: - gettimeset = {HOURLY: ii.htimeset, - MINUTELY: ii.mtimeset, - SECONDLY: ii.stimeset}[freq] - if ((freq >= HOURLY and - self._byhour and hour not in self._byhour) or - (freq >= MINUTELY and - self._byminute and minute not in self._byminute) or - (freq >= SECONDLY and - self._bysecond and second not in self._bysecond)): - timeset = () - else: - timeset = gettimeset(hour, minute, second) - - total = 0 - count = self._count - while True: - # Get dayset with the right frequency - dayset, start, end = getdayset(year, month, day) - - # Do the "hard" work ;-) - filtered = False - for i in dayset[start:end]: - if ((bymonth and ii.mmask[i] not in bymonth) or - (byweekno and not ii.wnomask[i]) or - (byweekday and ii.wdaymask[i] not in byweekday) or - (ii.nwdaymask and not ii.nwdaymask[i]) or - (byeaster and not ii.eastermask[i]) or - ((bymonthday or bynmonthday) and - ii.mdaymask[i] not in bymonthday and - ii.nmdaymask[i] not in bynmonthday) or - (byyearday and - ((i < ii.yearlen and i+1 not in byyearday and - -ii.yearlen+i not in byyearday) or - (i >= ii.yearlen and i+1-ii.yearlen not in byyearday and - -ii.nextyearlen+i-ii.yearlen not in byyearday)))): - dayset[i] = None - filtered = True - - # Output results - if bysetpos and timeset: - poslist = [] - for pos in bysetpos: - if pos < 0: - daypos, timepos = divmod(pos, len(timeset)) - else: - daypos, timepos = divmod(pos-1, len(timeset)) - try: - i = [x for x in dayset[start:end] - if x is not None][daypos] - time = timeset[timepos] - except IndexError: - pass - else: - date = datetime.date.fromordinal(ii.yearordinal+i) - res = datetime.datetime.combine(date, time) - if res not in poslist: - poslist.append(res) - poslist.sort() - for res in poslist: - if until and res > until: - self._len = total - return - elif res >= self._dtstart: - if count is not None: - count -= 1 - if count < 0: - self._len = total - return - total += 1 - yield res - else: - for i in dayset[start:end]: - if i is not None: - date = datetime.date.fromordinal(ii.yearordinal + i) - for time in timeset: - res = datetime.datetime.combine(date, time) - if until and res > until: - self._len = total - return - elif res >= self._dtstart: - if count is not None: - count -= 1 - if count < 0: - self._len = total - return - - total += 1 - yield res - - # Handle frequency and interval - fixday = False - if freq == YEARLY: - year += interval - if year > datetime.MAXYEAR: - self._len = total - return - ii.rebuild(year, month) - elif freq == MONTHLY: - month += interval - if month > 12: - div, mod = divmod(month, 12) - month = mod - year += div - if month == 0: - month = 12 - year -= 1 - if year > datetime.MAXYEAR: - self._len = total - return - ii.rebuild(year, month) - elif freq == WEEKLY: - if wkst > weekday: - day += -(weekday+1+(6-wkst))+self._interval*7 - else: - day += -(weekday-wkst)+self._interval*7 - weekday = wkst - fixday = True - elif freq == DAILY: - day += interval - fixday = True - elif freq == HOURLY: - if filtered: - # Jump to one iteration before next day - hour += ((23-hour)//interval)*interval - - if byhour: - ndays, hour = self.__mod_distance(value=hour, - byxxx=self._byhour, - base=24) - else: - ndays, hour = divmod(hour+interval, 24) - - if ndays: - day += ndays - fixday = True - - timeset = gettimeset(hour, minute, second) - elif freq == MINUTELY: - if filtered: - # Jump to one iteration before next day - minute += ((1439-(hour*60+minute))//interval)*interval - - valid = False - rep_rate = (24*60) - for j in range(rep_rate // gcd(interval, rep_rate)): - if byminute: - nhours, minute = \ - self.__mod_distance(value=minute, - byxxx=self._byminute, - base=60) - else: - nhours, minute = divmod(minute+interval, 60) - - div, hour = divmod(hour+nhours, 24) - if div: - day += div - fixday = True - filtered = False - - if not byhour or hour in byhour: - valid = True - break - - if not valid: - raise ValueError('Invalid combination of interval and ' + - 'byhour resulting in empty rule.') - - timeset = gettimeset(hour, minute, second) - elif freq == SECONDLY: - if filtered: - # Jump to one iteration before next day - second += (((86399 - (hour * 3600 + minute * 60 + second)) - // interval) * interval) - - rep_rate = (24 * 3600) - valid = False - for j in range(0, rep_rate // gcd(interval, rep_rate)): - if bysecond: - nminutes, second = \ - self.__mod_distance(value=second, - byxxx=self._bysecond, - base=60) - else: - nminutes, second = divmod(second+interval, 60) - - div, minute = divmod(minute+nminutes, 60) - if div: - hour += div - div, hour = divmod(hour, 24) - if div: - day += div - fixday = True - - if ((not byhour or hour in byhour) and - (not byminute or minute in byminute) and - (not bysecond or second in bysecond)): - valid = True - break - - if not valid: - raise ValueError('Invalid combination of interval, ' + - 'byhour and byminute resulting in empty' + - ' rule.') - - timeset = gettimeset(hour, minute, second) - - if fixday and day > 28: - daysinmonth = calendar.monthrange(year, month)[1] - if day > daysinmonth: - while day > daysinmonth: - day -= daysinmonth - month += 1 - if month == 13: - month = 1 - year += 1 - if year > datetime.MAXYEAR: - self._len = total - return - daysinmonth = calendar.monthrange(year, month)[1] - ii.rebuild(year, month) - - def __construct_byset(self, start, byxxx, base): - """ - If a `BYXXX` sequence is passed to the constructor at the same level as - `FREQ` (e.g. `FREQ=HOURLY,BYHOUR={2,4,7},INTERVAL=3`), there are some - specifications which cannot be reached given some starting conditions. - - This occurs whenever the interval is not coprime with the base of a - given unit and the difference between the starting position and the - ending position is not coprime with the greatest common denominator - between the interval and the base. For example, with a FREQ of hourly - starting at 17:00 and an interval of 4, the only valid values for - BYHOUR would be {21, 1, 5, 9, 13, 17}, because 4 and 24 are not - coprime. - - :param start: - Specifies the starting position. - :param byxxx: - An iterable containing the list of allowed values. - :param base: - The largest allowable value for the specified frequency (e.g. - 24 hours, 60 minutes). - - This does not preserve the type of the iterable, returning a set, since - the values should be unique and the order is irrelevant, this will - speed up later lookups. - - In the event of an empty set, raises a :exception:`ValueError`, as this - results in an empty rrule. - """ - - cset = set() - - # Support a single byxxx value. - if isinstance(byxxx, integer_types): - byxxx = (byxxx, ) - - for num in byxxx: - i_gcd = gcd(self._interval, base) - # Use divmod rather than % because we need to wrap negative nums. - if i_gcd == 1 or divmod(num - start, i_gcd)[1] == 0: - cset.add(num) - - if len(cset) == 0: - raise ValueError("Invalid rrule byxxx generates an empty set.") - - return cset - - def __mod_distance(self, value, byxxx, base): - """ - Calculates the next value in a sequence where the `FREQ` parameter is - specified along with a `BYXXX` parameter at the same "level" - (e.g. `HOURLY` specified with `BYHOUR`). - - :param value: - The old value of the component. - :param byxxx: - The `BYXXX` set, which should have been generated by - `rrule._construct_byset`, or something else which checks that a - valid rule is present. - :param base: - The largest allowable value for the specified frequency (e.g. - 24 hours, 60 minutes). - - If a valid value is not found after `base` iterations (the maximum - number before the sequence would start to repeat), this raises a - :exception:`ValueError`, as no valid values were found. - - This returns a tuple of `divmod(n*interval, base)`, where `n` is the - smallest number of `interval` repetitions until the next specified - value in `byxxx` is found. - """ - accumulator = 0 - for ii in range(1, base + 1): - # Using divmod() over % to account for negative intervals - div, value = divmod(value + self._interval, base) - accumulator += div - if value in byxxx: - return (accumulator, value) - - -class _iterinfo(object): - __slots__ = ["rrule", "lastyear", "lastmonth", - "yearlen", "nextyearlen", "yearordinal", "yearweekday", - "mmask", "mrange", "mdaymask", "nmdaymask", - "wdaymask", "wnomask", "nwdaymask", "eastermask"] - - def __init__(self, rrule): - for attr in self.__slots__: - setattr(self, attr, None) - self.rrule = rrule - - def rebuild(self, year, month): - # Every mask is 7 days longer to handle cross-year weekly periods. - rr = self.rrule - if year != self.lastyear: - self.yearlen = 365 + calendar.isleap(year) - self.nextyearlen = 365 + calendar.isleap(year + 1) - firstyday = datetime.date(year, 1, 1) - self.yearordinal = firstyday.toordinal() - self.yearweekday = firstyday.weekday() - - wday = datetime.date(year, 1, 1).weekday() - if self.yearlen == 365: - self.mmask = M365MASK - self.mdaymask = MDAY365MASK - self.nmdaymask = NMDAY365MASK - self.wdaymask = WDAYMASK[wday:] - self.mrange = M365RANGE - else: - self.mmask = M366MASK - self.mdaymask = MDAY366MASK - self.nmdaymask = NMDAY366MASK - self.wdaymask = WDAYMASK[wday:] - self.mrange = M366RANGE - - if not rr._byweekno: - self.wnomask = None - else: - self.wnomask = [0]*(self.yearlen+7) - # no1wkst = firstwkst = self.wdaymask.index(rr._wkst) - no1wkst = firstwkst = (7-self.yearweekday+rr._wkst) % 7 - if no1wkst >= 4: - no1wkst = 0 - # Number of days in the year, plus the days we got - # from last year. - wyearlen = self.yearlen+(self.yearweekday-rr._wkst) % 7 - else: - # Number of days in the year, minus the days we - # left in last year. - wyearlen = self.yearlen-no1wkst - div, mod = divmod(wyearlen, 7) - numweeks = div+mod//4 - for n in rr._byweekno: - if n < 0: - n += numweeks+1 - if not (0 < n <= numweeks): - continue - if n > 1: - i = no1wkst+(n-1)*7 - if no1wkst != firstwkst: - i -= 7-firstwkst - else: - i = no1wkst - for j in range(7): - self.wnomask[i] = 1 - i += 1 - if self.wdaymask[i] == rr._wkst: - break - if 1 in rr._byweekno: - # Check week number 1 of next year as well - # TODO: Check -numweeks for next year. - i = no1wkst+numweeks*7 - if no1wkst != firstwkst: - i -= 7-firstwkst - if i < self.yearlen: - # If week starts in next year, we - # don't care about it. - for j in range(7): - self.wnomask[i] = 1 - i += 1 - if self.wdaymask[i] == rr._wkst: - break - if no1wkst: - # Check last week number of last year as - # well. If no1wkst is 0, either the year - # started on week start, or week number 1 - # got days from last year, so there are no - # days from last year's last week number in - # this year. - if -1 not in rr._byweekno: - lyearweekday = datetime.date(year-1, 1, 1).weekday() - lno1wkst = (7-lyearweekday+rr._wkst) % 7 - lyearlen = 365+calendar.isleap(year-1) - if lno1wkst >= 4: - lno1wkst = 0 - lnumweeks = 52+(lyearlen + - (lyearweekday-rr._wkst) % 7) % 7//4 - else: - lnumweeks = 52+(self.yearlen-no1wkst) % 7//4 - else: - lnumweeks = -1 - if lnumweeks in rr._byweekno: - for i in range(no1wkst): - self.wnomask[i] = 1 - - if (rr._bynweekday and (month != self.lastmonth or - year != self.lastyear)): - ranges = [] - if rr._freq == YEARLY: - if rr._bymonth: - for month in rr._bymonth: - ranges.append(self.mrange[month-1:month+1]) - else: - ranges = [(0, self.yearlen)] - elif rr._freq == MONTHLY: - ranges = [self.mrange[month-1:month+1]] - if ranges: - # Weekly frequency won't get here, so we may not - # care about cross-year weekly periods. - self.nwdaymask = [0]*self.yearlen - for first, last in ranges: - last -= 1 - for wday, n in rr._bynweekday: - if n < 0: - i = last+(n+1)*7 - i -= (self.wdaymask[i]-wday) % 7 - else: - i = first+(n-1)*7 - i += (7-self.wdaymask[i]+wday) % 7 - if first <= i <= last: - self.nwdaymask[i] = 1 - - if rr._byeaster: - self.eastermask = [0]*(self.yearlen+7) - eyday = easter.easter(year).toordinal()-self.yearordinal - for offset in rr._byeaster: - self.eastermask[eyday+offset] = 1 - - self.lastyear = year - self.lastmonth = month - - def ydayset(self, year, month, day): - return list(range(self.yearlen)), 0, self.yearlen - - def mdayset(self, year, month, day): - dset = [None]*self.yearlen - start, end = self.mrange[month-1:month+1] - for i in range(start, end): - dset[i] = i - return dset, start, end - - def wdayset(self, year, month, day): - # We need to handle cross-year weeks here. - dset = [None]*(self.yearlen+7) - i = datetime.date(year, month, day).toordinal()-self.yearordinal - start = i - for j in range(7): - dset[i] = i - i += 1 - # if (not (0 <= i < self.yearlen) or - # self.wdaymask[i] == self.rrule._wkst): - # This will cross the year boundary, if necessary. - if self.wdaymask[i] == self.rrule._wkst: - break - return dset, start, i - - def ddayset(self, year, month, day): - dset = [None] * self.yearlen - i = datetime.date(year, month, day).toordinal() - self.yearordinal - dset[i] = i - return dset, i, i + 1 - - def htimeset(self, hour, minute, second): - tset = [] - rr = self.rrule - for minute in rr._byminute: - for second in rr._bysecond: - tset.append(datetime.time(hour, minute, second, - tzinfo=rr._tzinfo)) - tset.sort() - return tset - - def mtimeset(self, hour, minute, second): - tset = [] - rr = self.rrule - for second in rr._bysecond: - tset.append(datetime.time(hour, minute, second, tzinfo=rr._tzinfo)) - tset.sort() - return tset - - def stimeset(self, hour, minute, second): - return (datetime.time(hour, minute, second, - tzinfo=self.rrule._tzinfo),) - - -class rruleset(rrulebase): - """ The rruleset type allows more complex recurrence setups, mixing - multiple rules, dates, exclusion rules, and exclusion dates. The type - constructor takes the following keyword arguments: - - :param cache: If True, caching of results will be enabled, improving - performance of multiple queries considerably. """ - - class _genitem(object): - def __init__(self, genlist, gen): - try: - self.dt = advance_iterator(gen) - genlist.append(self) - except StopIteration: - pass - self.genlist = genlist - self.gen = gen - - def __next__(self): - try: - self.dt = advance_iterator(self.gen) - except StopIteration: - if self.genlist[0] is self: - heapq.heappop(self.genlist) - else: - self.genlist.remove(self) - heapq.heapify(self.genlist) - - next = __next__ - - def __lt__(self, other): - return self.dt < other.dt - - def __gt__(self, other): - return self.dt > other.dt - - def __eq__(self, other): - return self.dt == other.dt - - def __ne__(self, other): - return self.dt != other.dt - - def __init__(self, cache=False): - super(rruleset, self).__init__(cache) - self._rrule = [] - self._rdate = [] - self._exrule = [] - self._exdate = [] - - @_invalidates_cache - def rrule(self, rrule): - """ Include the given :py:class:`rrule` instance in the recurrence set - generation. """ - self._rrule.append(rrule) - - @_invalidates_cache - def rdate(self, rdate): - """ Include the given :py:class:`datetime` instance in the recurrence - set generation. """ - self._rdate.append(rdate) - - @_invalidates_cache - def exrule(self, exrule): - """ Include the given rrule instance in the recurrence set exclusion - list. Dates which are part of the given recurrence rules will not - be generated, even if some inclusive rrule or rdate matches them. - """ - self._exrule.append(exrule) - - @_invalidates_cache - def exdate(self, exdate): - """ Include the given datetime instance in the recurrence set - exclusion list. Dates included that way will not be generated, - even if some inclusive rrule or rdate matches them. """ - self._exdate.append(exdate) - - def _iter(self): - rlist = [] - self._rdate.sort() - self._genitem(rlist, iter(self._rdate)) - for gen in [iter(x) for x in self._rrule]: - self._genitem(rlist, gen) - exlist = [] - self._exdate.sort() - self._genitem(exlist, iter(self._exdate)) - for gen in [iter(x) for x in self._exrule]: - self._genitem(exlist, gen) - lastdt = None - total = 0 - heapq.heapify(rlist) - heapq.heapify(exlist) - while rlist: - ritem = rlist[0] - if not lastdt or lastdt != ritem.dt: - while exlist and exlist[0] < ritem: - exitem = exlist[0] - advance_iterator(exitem) - if exlist and exlist[0] is exitem: - heapq.heapreplace(exlist, exitem) - if not exlist or ritem != exlist[0]: - total += 1 - yield ritem.dt - lastdt = ritem.dt - advance_iterator(ritem) - if rlist and rlist[0] is ritem: - heapq.heapreplace(rlist, ritem) - self._len = total - - - - -class _rrulestr(object): - """ Parses a string representation of a recurrence rule or set of - recurrence rules. - - :param s: - Required, a string defining one or more recurrence rules. - - :param dtstart: - If given, used as the default recurrence start if not specified in the - rule string. - - :param cache: - If set ``True`` caching of results will be enabled, improving - performance of multiple queries considerably. - - :param unfold: - If set ``True`` indicates that a rule string is split over more - than one line and should be joined before processing. - - :param forceset: - If set ``True`` forces a :class:`dateutil.rrule.rruleset` to - be returned. - - :param compatible: - If set ``True`` forces ``unfold`` and ``forceset`` to be ``True``. - - :param ignoretz: - If set ``True``, time zones in parsed strings are ignored and a naive - :class:`datetime.datetime` object is returned. - - :param tzids: - If given, a callable or mapping used to retrieve a - :class:`datetime.tzinfo` from a string representation. - Defaults to :func:`dateutil.tz.gettz`. - - :param tzinfos: - Additional time zone names / aliases which may be present in a string - representation. See :func:`dateutil.parser.parse` for more - information. - - :return: - Returns a :class:`dateutil.rrule.rruleset` or - :class:`dateutil.rrule.rrule` - """ - - _freq_map = {"YEARLY": YEARLY, - "MONTHLY": MONTHLY, - "WEEKLY": WEEKLY, - "DAILY": DAILY, - "HOURLY": HOURLY, - "MINUTELY": MINUTELY, - "SECONDLY": SECONDLY} - - _weekday_map = {"MO": 0, "TU": 1, "WE": 2, "TH": 3, - "FR": 4, "SA": 5, "SU": 6} - - def _handle_int(self, rrkwargs, name, value, **kwargs): - rrkwargs[name.lower()] = int(value) - - def _handle_int_list(self, rrkwargs, name, value, **kwargs): - rrkwargs[name.lower()] = [int(x) for x in value.split(',')] - - _handle_INTERVAL = _handle_int - _handle_COUNT = _handle_int - _handle_BYSETPOS = _handle_int_list - _handle_BYMONTH = _handle_int_list - _handle_BYMONTHDAY = _handle_int_list - _handle_BYYEARDAY = _handle_int_list - _handle_BYEASTER = _handle_int_list - _handle_BYWEEKNO = _handle_int_list - _handle_BYHOUR = _handle_int_list - _handle_BYMINUTE = _handle_int_list - _handle_BYSECOND = _handle_int_list - - def _handle_FREQ(self, rrkwargs, name, value, **kwargs): - rrkwargs["freq"] = self._freq_map[value] - - def _handle_UNTIL(self, rrkwargs, name, value, **kwargs): - global parser - if not parser: - from dateutil import parser - try: - rrkwargs["until"] = parser.parse(value, - ignoretz=kwargs.get("ignoretz"), - tzinfos=kwargs.get("tzinfos")) - except ValueError: - raise ValueError("invalid until date") - - def _handle_WKST(self, rrkwargs, name, value, **kwargs): - rrkwargs["wkst"] = self._weekday_map[value] - - def _handle_BYWEEKDAY(self, rrkwargs, name, value, **kwargs): - """ - Two ways to specify this: +1MO or MO(+1) - """ - l = [] - for wday in value.split(','): - if '(' in wday: - # If it's of the form TH(+1), etc. - splt = wday.split('(') - w = splt[0] - n = int(splt[1][:-1]) - elif len(wday): - # If it's of the form +1MO - for i in range(len(wday)): - if wday[i] not in '+-0123456789': - break - n = wday[:i] or None - w = wday[i:] - if n: - n = int(n) - else: - raise ValueError("Invalid (empty) BYDAY specification.") - - l.append(weekdays[self._weekday_map[w]](n)) - rrkwargs["byweekday"] = l - - _handle_BYDAY = _handle_BYWEEKDAY - - def _parse_rfc_rrule(self, line, - dtstart=None, - cache=False, - ignoretz=False, - tzinfos=None): - if line.find(':') != -1: - name, value = line.split(':') - if name != "RRULE": - raise ValueError("unknown parameter name") - else: - value = line - rrkwargs = {} - for pair in value.split(';'): - name, value = pair.split('=') - name = name.upper() - value = value.upper() - try: - getattr(self, "_handle_"+name)(rrkwargs, name, value, - ignoretz=ignoretz, - tzinfos=tzinfos) - except AttributeError: - raise ValueError("unknown parameter '%s'" % name) - except (KeyError, ValueError): - raise ValueError("invalid '%s': %s" % (name, value)) - return rrule(dtstart=dtstart, cache=cache, **rrkwargs) - - def _parse_date_value(self, date_value, parms, rule_tzids, - ignoretz, tzids, tzinfos): - global parser - if not parser: - from dateutil import parser - - datevals = [] - value_found = False - TZID = None - - for parm in parms: - if parm.startswith("TZID="): - try: - tzkey = rule_tzids[parm.split('TZID=')[-1]] - except KeyError: - continue - if tzids is None: - from . import tz - tzlookup = tz.gettz - elif callable(tzids): - tzlookup = tzids - else: - tzlookup = getattr(tzids, 'get', None) - if tzlookup is None: - msg = ('tzids must be a callable, mapping, or None, ' - 'not %s' % tzids) - raise ValueError(msg) - - TZID = tzlookup(tzkey) - continue - - # RFC 5445 3.8.2.4: The VALUE parameter is optional, but may be found - # only once. - if parm not in {"VALUE=DATE-TIME", "VALUE=DATE"}: - raise ValueError("unsupported parm: " + parm) - else: - if value_found: - msg = ("Duplicate value parameter found in: " + parm) - raise ValueError(msg) - value_found = True - - for datestr in date_value.split(','): - date = parser.parse(datestr, ignoretz=ignoretz, tzinfos=tzinfos) - if TZID is not None: - if date.tzinfo is None: - date = date.replace(tzinfo=TZID) - else: - raise ValueError('DTSTART/EXDATE specifies multiple timezone') - datevals.append(date) - - return datevals - - def _parse_rfc(self, s, - dtstart=None, - cache=False, - unfold=False, - forceset=False, - compatible=False, - ignoretz=False, - tzids=None, - tzinfos=None): - global parser - if compatible: - forceset = True - unfold = True - - TZID_NAMES = dict(map( - lambda x: (x.upper(), x), - re.findall('TZID=(?P[^:]+):', s) - )) - s = s.upper() - if not s.strip(): - raise ValueError("empty string") - if unfold: - lines = s.splitlines() - i = 0 - while i < len(lines): - line = lines[i].rstrip() - if not line: - del lines[i] - elif i > 0 and line[0] == " ": - lines[i-1] += line[1:] - del lines[i] - else: - i += 1 - else: - lines = s.split() - if (not forceset and len(lines) == 1 and (s.find(':') == -1 or - s.startswith('RRULE:'))): - return self._parse_rfc_rrule(lines[0], cache=cache, - dtstart=dtstart, ignoretz=ignoretz, - tzinfos=tzinfos) - else: - rrulevals = [] - rdatevals = [] - exrulevals = [] - exdatevals = [] - for line in lines: - if not line: - continue - if line.find(':') == -1: - name = "RRULE" - value = line - else: - name, value = line.split(':', 1) - parms = name.split(';') - if not parms: - raise ValueError("empty property name") - name = parms[0] - parms = parms[1:] - if name == "RRULE": - for parm in parms: - raise ValueError("unsupported RRULE parm: "+parm) - rrulevals.append(value) - elif name == "RDATE": - for parm in parms: - if parm != "VALUE=DATE-TIME": - raise ValueError("unsupported RDATE parm: "+parm) - rdatevals.append(value) - elif name == "EXRULE": - for parm in parms: - raise ValueError("unsupported EXRULE parm: "+parm) - exrulevals.append(value) - elif name == "EXDATE": - exdatevals.extend( - self._parse_date_value(value, parms, - TZID_NAMES, ignoretz, - tzids, tzinfos) - ) - elif name == "DTSTART": - dtvals = self._parse_date_value(value, parms, TZID_NAMES, - ignoretz, tzids, tzinfos) - if len(dtvals) != 1: - raise ValueError("Multiple DTSTART values specified:" + - value) - dtstart = dtvals[0] - else: - raise ValueError("unsupported property: "+name) - if (forceset or len(rrulevals) > 1 or rdatevals - or exrulevals or exdatevals): - if not parser and (rdatevals or exdatevals): - from dateutil import parser - rset = rruleset(cache=cache) - for value in rrulevals: - rset.rrule(self._parse_rfc_rrule(value, dtstart=dtstart, - ignoretz=ignoretz, - tzinfos=tzinfos)) - for value in rdatevals: - for datestr in value.split(','): - rset.rdate(parser.parse(datestr, - ignoretz=ignoretz, - tzinfos=tzinfos)) - for value in exrulevals: - rset.exrule(self._parse_rfc_rrule(value, dtstart=dtstart, - ignoretz=ignoretz, - tzinfos=tzinfos)) - for value in exdatevals: - rset.exdate(value) - if compatible and dtstart: - rset.rdate(dtstart) - return rset - else: - return self._parse_rfc_rrule(rrulevals[0], - dtstart=dtstart, - cache=cache, - ignoretz=ignoretz, - tzinfos=tzinfos) - - def __call__(self, s, **kwargs): - return self._parse_rfc(s, **kwargs) - - -rrulestr = _rrulestr() - -# vim:ts=4:sw=4:et diff --git a/.venv/Lib/site-packages/dateutil/tz/__init__.py b/.venv/Lib/site-packages/dateutil/tz/__init__.py deleted file mode 100644 index af1352c..0000000 --- a/.venv/Lib/site-packages/dateutil/tz/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -from .tz import * -from .tz import __doc__ - -__all__ = ["tzutc", "tzoffset", "tzlocal", "tzfile", "tzrange", - "tzstr", "tzical", "tzwin", "tzwinlocal", "gettz", - "enfold", "datetime_ambiguous", "datetime_exists", - "resolve_imaginary", "UTC", "DeprecatedTzFormatWarning"] - - -class DeprecatedTzFormatWarning(Warning): - """Warning raised when time zones are parsed from deprecated formats.""" diff --git a/.venv/Lib/site-packages/dateutil/tz/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/dateutil/tz/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index a48b8dc93a2354bb2f5fe5977ffc414fab58bf4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 864 zcmZ`%Piqu06i;?`yQP277E!7P=emOJ)}u%db+HONCPCa<= z8}uq36!9zgA$lx134-8lrJi~+neA2teUtg+<^A$r-h0W%`S}^-CHuaWe!&QR3yX=g zu9S;4ubd)|IF_g%=7vN$9$<_z#H06k&}g6y#G7vrZ$b1SLg=&q$1-U0sU6g5|M1aK z2Rr=0Lz_~r5=uKaUCUObP29AtRGJ#Fu5Bx+5+>c0tx_Q&7&I#~2wRQS!7c*tmxrQo zGxaofX=Pw-<))xWmE>-bGYeMaKv}*ovQm}C-MF^FkucV{1r0{Y1E3;jnJAb(cF}JC zsaxv7P($J)@P747>73a;rVCMI$)vV0hq8iPEP6OafCiYOL4)H##2dcwNZ;~AwSMIr zYbFfv`0ynZaY!w$Q~@St8sZ_-fl9T?V}5;joYrTXO;cJhUk`ONl;(<;GU#)Z zzAl*@GrH-|`-Cn$qRY3*W3p>N8v>d`9_OWD`(zuAY$8?3Nl(2hb0{p39b0ly=A`$0 zeUJ1Xb-P`%x*G4O)E@fWNOv{f*nL54AZS(!vU~u=0ofG$#0U!yhb(!;GB6~xx3og8 z*lLARQ3y-v^6M+&r5Meb-a<#_dkaHT>O&dcuogQu0uOMjK89Vv&lF|ch3GEqh>VQ!z1(uPuin7jJLe) Q-}tWmvu1w%hp*H64NVCBNdN!< diff --git a/.venv/Lib/site-packages/dateutil/tz/__pycache__/_common.cpython-311.pyc b/.venv/Lib/site-packages/dateutil/tz/__pycache__/_common.cpython-311.pyc deleted file mode 100644 index 4910bba3462dfcaf44465048351d024053fb9824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15302 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 diff --git a/.venv/Lib/site-packages/dateutil/tz/__pycache__/_factories.cpython-311.pyc b/.venv/Lib/site-packages/dateutil/tz/__pycache__/_factories.cpython-311.pyc deleted file mode 100644 index eb5af06978e060dda0508294e66217f82f151a31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5261 zcmdT|%WoUU8K31YB~qkB#*D33Xww$LimqOiEjw{kN2v@uZCnMZ90w5?EH>PwOlwK1 zvr9h&y4Arzi9#uaB8AnU0fZoRZMX-cm*$w({{Sg0AYuUn28tBOO{&zw$f@5q%UwQg z_|Qv+yWh^tH_z|&o8h0kySoUa#ee-Q<%Qfov0x{6HM92xWbP1|$ecBF33sJ)KcxMb)J_DEZ!{vO*R4Tso;ku~XEqP(_lH)djJS zt6JC_hRm;FvkF<@WU}BYk`yO%w>=9y%ef#Y6v+*4!3`7greD0YGM~;as*0Y=Cb_yH zQFsA(_bvnZJ%{2e5YcJiBDy0ILUh4lK&!j3ng{lZ$W^CZflHHu>r3vpOab%cJ~tN= z%tQ4{5XE#>)1_=uG2L2zS)sHOMm9ZIpVmbY+Ve?OGX;q*YG%jMb@ug&Vp5efO%yd; zNF)+j{q8r(Gl};#g=z@}#FvR=@|yH*|H~M;1j!dvgA4Q@Dz~xXAgRj2A$#NQQCVqfS}F_v^w&l8ryURa|;bDuHR?ai~yV+nK zj!TcQzPddYl&(7Y0$Jn=+!x%>iS4WqD7cjqZ>hRMvtZ(pWDZ=E=Fz?*`V~o!P({zv ztQL_XDXM5!BDM?1T&AGk1SiI|-sdf~_duRvVA0UZz*U(x#5Qm6RF!05X>) zHLoB}rE^({-ZTfBcUz0^8pQ>fhg(~Kapkg$Vp2+8QOu#|^F=MaqEOt7*$vSpmjnY9 z;j?7=tN~bohM_@&y;&i-zj<&cETbN^GeB0!lU9Cur=l&EIYGrI@+)GC8WU1O>^B63c~7mLr=$28haMVW=DOE zoyXZ5*WXxz8A#2}rU-{1eoz2|nfr^YaU6D9gd5?jH3IteLqd&kpeo@iQE{GPgl9KYO&cYb|A+YE$ z<1goyO=UeCAH&R{ zPv6`QMYlrHP3_*fawu+u;zduz7b^J%E4>4s{%X57zSSFlI8>RO`rF7~N50a(zFeNX zXiQ$*<+;8&Zl546zP;liJuj_^JH+ih%}6C0Gor6;N2j-<(_hVhJzS2yV?^I6&Kmy1 z8(P^v^q&qA46UCqLa&wsQ6mt&7cycqTY;HUV5Slb8Np-Q!Q)%O;}6}X;PGB1-{%ef13jU0~3amR5!%Td7XZb(TfhjE@NK$Dtu@Zh}qY$rxuJt6sv6+E*bRz z6?qP`hEDW2&Vw#iKM;es=OPrl968c<;OR9OP5Tj$7lfz5W5(b_d2rGgoJ73pE3t=J z!}<0Q^%=N3+#hOC0+U&36F9BuIZ)y>ZVzD)+)4Wz#|uG;U=Lq~5(loH0Z;9q#OYIo z5K8`*95Sg0gJzd7gW>nQ1_ z*!~9AAvui_Mba4C;Tqz`y9kn=AjbA*5G%mrNHM?Z!G9$1uOxQ9VDZlMC3C8(umgJa z1nvbZ7|Z0YDH=ORQ^Wvv?_`%FhB$0#O>6$nGi}|Y&(aIf1A~J0Um!a?$8i;MxYYPm zNY5(!Rmf1O@p(eRrN(Ec!^6Qvxs|M++{N1c8tV|xfm~Y2`pdgmyI*7Z2RV>iD_LLJ Z#oGNEYq}3xwvzRq?qcnJ8y1uM{{XEnSU3Ox diff --git a/.venv/Lib/site-packages/dateutil/tz/__pycache__/tz.cpython-311.pyc b/.venv/Lib/site-packages/dateutil/tz/__pycache__/tz.cpython-311.pyc deleted file mode 100644 index 999c1f7e67a710e3d6ce9e95486cfb4fdcff413e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70540 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 diff --git a/.venv/Lib/site-packages/dateutil/tz/__pycache__/win.cpython-311.pyc b/.venv/Lib/site-packages/dateutil/tz/__pycache__/win.cpython-311.pyc deleted file mode 100644 index dcf97d4f0bf3f20680939e4b12990ccd8b9f9508..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18450 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 cls.__strong_cache_size: - cls.__strong_cache.popitem(last=False) - - return instance - - -class _TzStrFactory(_TzFactory): - def __init__(cls, *args, **kwargs): - cls.__instances = weakref.WeakValueDictionary() - cls.__strong_cache = OrderedDict() - cls.__strong_cache_size = 8 - - cls.__cache_lock = _thread.allocate_lock() - - def __call__(cls, s, posix_offset=False): - key = (s, posix_offset) - instance = cls.__instances.get(key, None) - - if instance is None: - instance = cls.__instances.setdefault(key, - cls.instance(s, posix_offset)) - - # This lock may not be necessary in Python 3. See GH issue #901 - with cls.__cache_lock: - cls.__strong_cache[key] = cls.__strong_cache.pop(key, instance) - - # Remove an item if the strong cache is overpopulated - if len(cls.__strong_cache) > cls.__strong_cache_size: - cls.__strong_cache.popitem(last=False) - - return instance - diff --git a/.venv/Lib/site-packages/dateutil/tz/tz.py b/.venv/Lib/site-packages/dateutil/tz/tz.py deleted file mode 100644 index 6175914..0000000 --- a/.venv/Lib/site-packages/dateutil/tz/tz.py +++ /dev/null @@ -1,1849 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers timezone implementations subclassing the abstract -:py:class:`datetime.tzinfo` type. There are classes to handle tzfile format -files (usually are in :file:`/etc/localtime`, :file:`/usr/share/zoneinfo`, -etc), TZ environment string (in all known formats), given ranges (with help -from relative deltas), local machine timezone, fixed offset timezone, and UTC -timezone. -""" -import datetime -import struct -import time -import sys -import os -import bisect -import weakref -from collections import OrderedDict - -import six -from six import string_types -from six.moves import _thread -from ._common import tzname_in_python2, _tzinfo -from ._common import tzrangebase, enfold -from ._common import _validate_fromutc_inputs - -from ._factories import _TzSingleton, _TzOffsetFactory -from ._factories import _TzStrFactory -try: - from .win import tzwin, tzwinlocal -except ImportError: - tzwin = tzwinlocal = None - -# For warning about rounding tzinfo -from warnings import warn - -ZERO = datetime.timedelta(0) -EPOCH = datetime.datetime(1970, 1, 1, 0, 0) -EPOCHORDINAL = EPOCH.toordinal() - - -@six.add_metaclass(_TzSingleton) -class tzutc(datetime.tzinfo): - """ - This is a tzinfo object that represents the UTC time zone. - - **Examples:** - - .. doctest:: - - >>> from datetime import * - >>> from dateutil.tz import * - - >>> datetime.now() - datetime.datetime(2003, 9, 27, 9, 40, 1, 521290) - - >>> datetime.now(tzutc()) - datetime.datetime(2003, 9, 27, 12, 40, 12, 156379, tzinfo=tzutc()) - - >>> datetime.now(tzutc()).tzname() - 'UTC' - - .. versionchanged:: 2.7.0 - ``tzutc()`` is now a singleton, so the result of ``tzutc()`` will - always return the same object. - - .. doctest:: - - >>> from dateutil.tz import tzutc, UTC - >>> tzutc() is tzutc() - True - >>> tzutc() is UTC - True - """ - def utcoffset(self, dt): - return ZERO - - def dst(self, dt): - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - return "UTC" - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - return False - - @_validate_fromutc_inputs - def fromutc(self, dt): - """ - Fast track version of fromutc() returns the original ``dt`` object for - any valid :py:class:`datetime.datetime` object. - """ - return dt - - def __eq__(self, other): - if not isinstance(other, (tzutc, tzoffset)): - return NotImplemented - - return (isinstance(other, tzutc) or - (isinstance(other, tzoffset) and other._offset == ZERO)) - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s()" % self.__class__.__name__ - - __reduce__ = object.__reduce__ - - -#: Convenience constant providing a :class:`tzutc()` instance -#: -#: .. versionadded:: 2.7.0 -UTC = tzutc() - - -@six.add_metaclass(_TzOffsetFactory) -class tzoffset(datetime.tzinfo): - """ - A simple class for representing a fixed offset from UTC. - - :param name: - The timezone name, to be returned when ``tzname()`` is called. - :param offset: - The time zone offset in seconds, or (since version 2.6.0, represented - as a :py:class:`datetime.timedelta` object). - """ - def __init__(self, name, offset): - self._name = name - - try: - # Allow a timedelta - offset = offset.total_seconds() - except (TypeError, AttributeError): - pass - - self._offset = datetime.timedelta(seconds=_get_supported_offset(offset)) - - def utcoffset(self, dt): - return self._offset - - def dst(self, dt): - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - return self._name - - @_validate_fromutc_inputs - def fromutc(self, dt): - return dt + self._offset - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - return False - - def __eq__(self, other): - if not isinstance(other, tzoffset): - return NotImplemented - - return self._offset == other._offset - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s(%s, %s)" % (self.__class__.__name__, - repr(self._name), - int(self._offset.total_seconds())) - - __reduce__ = object.__reduce__ - - -class tzlocal(_tzinfo): - """ - A :class:`tzinfo` subclass built around the ``time`` timezone functions. - """ - def __init__(self): - super(tzlocal, self).__init__() - - self._std_offset = datetime.timedelta(seconds=-time.timezone) - if time.daylight: - self._dst_offset = datetime.timedelta(seconds=-time.altzone) - else: - self._dst_offset = self._std_offset - - self._dst_saved = self._dst_offset - self._std_offset - self._hasdst = bool(self._dst_saved) - self._tznames = tuple(time.tzname) - - def utcoffset(self, dt): - if dt is None and self._hasdst: - return None - - if self._isdst(dt): - return self._dst_offset - else: - return self._std_offset - - def dst(self, dt): - if dt is None and self._hasdst: - return None - - if self._isdst(dt): - return self._dst_offset - self._std_offset - else: - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - return self._tznames[self._isdst(dt)] - - def is_ambiguous(self, dt): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - naive_dst = self._naive_is_dst(dt) - return (not naive_dst and - (naive_dst != self._naive_is_dst(dt - self._dst_saved))) - - def _naive_is_dst(self, dt): - timestamp = _datetime_to_timestamp(dt) - return time.localtime(timestamp + time.timezone).tm_isdst - - def _isdst(self, dt, fold_naive=True): - # We can't use mktime here. It is unstable when deciding if - # the hour near to a change is DST or not. - # - # timestamp = time.mktime((dt.year, dt.month, dt.day, dt.hour, - # dt.minute, dt.second, dt.weekday(), 0, -1)) - # return time.localtime(timestamp).tm_isdst - # - # The code above yields the following result: - # - # >>> import tz, datetime - # >>> t = tz.tzlocal() - # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() - # 'BRDT' - # >>> datetime.datetime(2003,2,16,0,tzinfo=t).tzname() - # 'BRST' - # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() - # 'BRST' - # >>> datetime.datetime(2003,2,15,22,tzinfo=t).tzname() - # 'BRDT' - # >>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname() - # 'BRDT' - # - # Here is a more stable implementation: - # - if not self._hasdst: - return False - - # Check for ambiguous times: - dstval = self._naive_is_dst(dt) - fold = getattr(dt, 'fold', None) - - if self.is_ambiguous(dt): - if fold is not None: - return not self._fold(dt) - else: - return True - - return dstval - - def __eq__(self, other): - if isinstance(other, tzlocal): - return (self._std_offset == other._std_offset and - self._dst_offset == other._dst_offset) - elif isinstance(other, tzutc): - return (not self._hasdst and - self._tznames[0] in {'UTC', 'GMT'} and - self._std_offset == ZERO) - elif isinstance(other, tzoffset): - return (not self._hasdst and - self._tznames[0] == other._name and - self._std_offset == other._offset) - else: - return NotImplemented - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s()" % self.__class__.__name__ - - __reduce__ = object.__reduce__ - - -class _ttinfo(object): - __slots__ = ["offset", "delta", "isdst", "abbr", - "isstd", "isgmt", "dstoffset"] - - def __init__(self): - for attr in self.__slots__: - setattr(self, attr, None) - - def __repr__(self): - l = [] - for attr in self.__slots__: - value = getattr(self, attr) - if value is not None: - l.append("%s=%s" % (attr, repr(value))) - return "%s(%s)" % (self.__class__.__name__, ", ".join(l)) - - def __eq__(self, other): - if not isinstance(other, _ttinfo): - return NotImplemented - - return (self.offset == other.offset and - self.delta == other.delta and - self.isdst == other.isdst and - self.abbr == other.abbr and - self.isstd == other.isstd and - self.isgmt == other.isgmt and - self.dstoffset == other.dstoffset) - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __getstate__(self): - state = {} - for name in self.__slots__: - state[name] = getattr(self, name, None) - return state - - def __setstate__(self, state): - for name in self.__slots__: - if name in state: - setattr(self, name, state[name]) - - -class _tzfile(object): - """ - Lightweight class for holding the relevant transition and time zone - information read from binary tzfiles. - """ - attrs = ['trans_list', 'trans_list_utc', 'trans_idx', 'ttinfo_list', - 'ttinfo_std', 'ttinfo_dst', 'ttinfo_before', 'ttinfo_first'] - - def __init__(self, **kwargs): - for attr in self.attrs: - setattr(self, attr, kwargs.get(attr, None)) - - -class tzfile(_tzinfo): - """ - This is a ``tzinfo`` subclass that allows one to use the ``tzfile(5)`` - format timezone files to extract current and historical zone information. - - :param fileobj: - This can be an opened file stream or a file name that the time zone - information can be read from. - - :param filename: - This is an optional parameter specifying the source of the time zone - information in the event that ``fileobj`` is a file object. If omitted - and ``fileobj`` is a file stream, this parameter will be set either to - ``fileobj``'s ``name`` attribute or to ``repr(fileobj)``. - - See `Sources for Time Zone and Daylight Saving Time Data - `_ for more information. - Time zone files can be compiled from the `IANA Time Zone database files - `_ with the `zic time zone compiler - `_ - - .. note:: - - Only construct a ``tzfile`` directly if you have a specific timezone - file on disk that you want to read into a Python ``tzinfo`` object. - If you want to get a ``tzfile`` representing a specific IANA zone, - (e.g. ``'America/New_York'``), you should call - :func:`dateutil.tz.gettz` with the zone identifier. - - - **Examples:** - - Using the US Eastern time zone as an example, we can see that a ``tzfile`` - provides time zone information for the standard Daylight Saving offsets: - - .. testsetup:: tzfile - - from dateutil.tz import gettz - from datetime import datetime - - .. doctest:: tzfile - - >>> NYC = gettz('America/New_York') - >>> NYC - tzfile('/usr/share/zoneinfo/America/New_York') - - >>> print(datetime(2016, 1, 3, tzinfo=NYC)) # EST - 2016-01-03 00:00:00-05:00 - - >>> print(datetime(2016, 7, 7, tzinfo=NYC)) # EDT - 2016-07-07 00:00:00-04:00 - - - The ``tzfile`` structure contains a fully history of the time zone, - so historical dates will also have the right offsets. For example, before - the adoption of the UTC standards, New York used local solar mean time: - - .. doctest:: tzfile - - >>> print(datetime(1901, 4, 12, tzinfo=NYC)) # LMT - 1901-04-12 00:00:00-04:56 - - And during World War II, New York was on "Eastern War Time", which was a - state of permanent daylight saving time: - - .. doctest:: tzfile - - >>> print(datetime(1944, 2, 7, tzinfo=NYC)) # EWT - 1944-02-07 00:00:00-04:00 - - """ - - def __init__(self, fileobj, filename=None): - super(tzfile, self).__init__() - - file_opened_here = False - if isinstance(fileobj, string_types): - self._filename = fileobj - fileobj = open(fileobj, 'rb') - file_opened_here = True - elif filename is not None: - self._filename = filename - elif hasattr(fileobj, "name"): - self._filename = fileobj.name - else: - self._filename = repr(fileobj) - - if fileobj is not None: - if not file_opened_here: - fileobj = _nullcontext(fileobj) - - with fileobj as file_stream: - tzobj = self._read_tzfile(file_stream) - - self._set_tzdata(tzobj) - - def _set_tzdata(self, tzobj): - """ Set the time zone data of this object from a _tzfile object """ - # Copy the relevant attributes over as private attributes - for attr in _tzfile.attrs: - setattr(self, '_' + attr, getattr(tzobj, attr)) - - def _read_tzfile(self, fileobj): - out = _tzfile() - - # From tzfile(5): - # - # The time zone information files used by tzset(3) - # begin with the magic characters "TZif" to identify - # them as time zone information files, followed by - # sixteen bytes reserved for future use, followed by - # six four-byte values of type long, written in a - # ``standard'' byte order (the high-order byte - # of the value is written first). - if fileobj.read(4).decode() != "TZif": - raise ValueError("magic not found") - - fileobj.read(16) - - ( - # The number of UTC/local indicators stored in the file. - ttisgmtcnt, - - # The number of standard/wall indicators stored in the file. - ttisstdcnt, - - # The number of leap seconds for which data is - # stored in the file. - leapcnt, - - # The number of "transition times" for which data - # is stored in the file. - timecnt, - - # The number of "local time types" for which data - # is stored in the file (must not be zero). - typecnt, - - # The number of characters of "time zone - # abbreviation strings" stored in the file. - charcnt, - - ) = struct.unpack(">6l", fileobj.read(24)) - - # The above header is followed by tzh_timecnt four-byte - # values of type long, sorted in ascending order. - # These values are written in ``standard'' byte order. - # Each is used as a transition time (as returned by - # time(2)) at which the rules for computing local time - # change. - - if timecnt: - out.trans_list_utc = list(struct.unpack(">%dl" % timecnt, - fileobj.read(timecnt*4))) - else: - out.trans_list_utc = [] - - # Next come tzh_timecnt one-byte values of type unsigned - # char; each one tells which of the different types of - # ``local time'' types described in the file is associated - # with the same-indexed transition time. These values - # serve as indices into an array of ttinfo structures that - # appears next in the file. - - if timecnt: - out.trans_idx = struct.unpack(">%dB" % timecnt, - fileobj.read(timecnt)) - else: - out.trans_idx = [] - - # Each ttinfo structure is written as a four-byte value - # for tt_gmtoff of type long, in a standard byte - # order, followed by a one-byte value for tt_isdst - # and a one-byte value for tt_abbrind. In each - # structure, tt_gmtoff gives the number of - # seconds to be added to UTC, tt_isdst tells whether - # tm_isdst should be set by localtime(3), and - # tt_abbrind serves as an index into the array of - # time zone abbreviation characters that follow the - # ttinfo structure(s) in the file. - - ttinfo = [] - - for i in range(typecnt): - ttinfo.append(struct.unpack(">lbb", fileobj.read(6))) - - abbr = fileobj.read(charcnt).decode() - - # Then there are tzh_leapcnt pairs of four-byte - # values, written in standard byte order; the - # first value of each pair gives the time (as - # returned by time(2)) at which a leap second - # occurs; the second gives the total number of - # leap seconds to be applied after the given time. - # The pairs of values are sorted in ascending order - # by time. - - # Not used, for now (but seek for correct file position) - if leapcnt: - fileobj.seek(leapcnt * 8, os.SEEK_CUR) - - # Then there are tzh_ttisstdcnt standard/wall - # indicators, each stored as a one-byte value; - # they tell whether the transition times associated - # with local time types were specified as standard - # time or wall clock time, and are used when - # a time zone file is used in handling POSIX-style - # time zone environment variables. - - if ttisstdcnt: - isstd = struct.unpack(">%db" % ttisstdcnt, - fileobj.read(ttisstdcnt)) - - # Finally, there are tzh_ttisgmtcnt UTC/local - # indicators, each stored as a one-byte value; - # they tell whether the transition times associated - # with local time types were specified as UTC or - # local time, and are used when a time zone file - # is used in handling POSIX-style time zone envi- - # ronment variables. - - if ttisgmtcnt: - isgmt = struct.unpack(">%db" % ttisgmtcnt, - fileobj.read(ttisgmtcnt)) - - # Build ttinfo list - out.ttinfo_list = [] - for i in range(typecnt): - gmtoff, isdst, abbrind = ttinfo[i] - gmtoff = _get_supported_offset(gmtoff) - tti = _ttinfo() - tti.offset = gmtoff - tti.dstoffset = datetime.timedelta(0) - tti.delta = datetime.timedelta(seconds=gmtoff) - tti.isdst = isdst - tti.abbr = abbr[abbrind:abbr.find('\x00', abbrind)] - tti.isstd = (ttisstdcnt > i and isstd[i] != 0) - tti.isgmt = (ttisgmtcnt > i and isgmt[i] != 0) - out.ttinfo_list.append(tti) - - # Replace ttinfo indexes for ttinfo objects. - out.trans_idx = [out.ttinfo_list[idx] for idx in out.trans_idx] - - # Set standard, dst, and before ttinfos. before will be - # used when a given time is before any transitions, - # and will be set to the first non-dst ttinfo, or to - # the first dst, if all of them are dst. - out.ttinfo_std = None - out.ttinfo_dst = None - out.ttinfo_before = None - if out.ttinfo_list: - if not out.trans_list_utc: - out.ttinfo_std = out.ttinfo_first = out.ttinfo_list[0] - else: - for i in range(timecnt-1, -1, -1): - tti = out.trans_idx[i] - if not out.ttinfo_std and not tti.isdst: - out.ttinfo_std = tti - elif not out.ttinfo_dst and tti.isdst: - out.ttinfo_dst = tti - - if out.ttinfo_std and out.ttinfo_dst: - break - else: - if out.ttinfo_dst and not out.ttinfo_std: - out.ttinfo_std = out.ttinfo_dst - - for tti in out.ttinfo_list: - if not tti.isdst: - out.ttinfo_before = tti - break - else: - out.ttinfo_before = out.ttinfo_list[0] - - # Now fix transition times to become relative to wall time. - # - # I'm not sure about this. In my tests, the tz source file - # is setup to wall time, and in the binary file isstd and - # isgmt are off, so it should be in wall time. OTOH, it's - # always in gmt time. Let me know if you have comments - # about this. - lastdst = None - lastoffset = None - lastdstoffset = None - lastbaseoffset = None - out.trans_list = [] - - for i, tti in enumerate(out.trans_idx): - offset = tti.offset - dstoffset = 0 - - if lastdst is not None: - if tti.isdst: - if not lastdst: - dstoffset = offset - lastoffset - - if not dstoffset and lastdstoffset: - dstoffset = lastdstoffset - - tti.dstoffset = datetime.timedelta(seconds=dstoffset) - lastdstoffset = dstoffset - - # If a time zone changes its base offset during a DST transition, - # then you need to adjust by the previous base offset to get the - # transition time in local time. Otherwise you use the current - # base offset. Ideally, I would have some mathematical proof of - # why this is true, but I haven't really thought about it enough. - baseoffset = offset - dstoffset - adjustment = baseoffset - if (lastbaseoffset is not None and baseoffset != lastbaseoffset - and tti.isdst != lastdst): - # The base DST has changed - adjustment = lastbaseoffset - - lastdst = tti.isdst - lastoffset = offset - lastbaseoffset = baseoffset - - out.trans_list.append(out.trans_list_utc[i] + adjustment) - - out.trans_idx = tuple(out.trans_idx) - out.trans_list = tuple(out.trans_list) - out.trans_list_utc = tuple(out.trans_list_utc) - - return out - - def _find_last_transition(self, dt, in_utc=False): - # If there's no list, there are no transitions to find - if not self._trans_list: - return None - - timestamp = _datetime_to_timestamp(dt) - - # Find where the timestamp fits in the transition list - if the - # timestamp is a transition time, it's part of the "after" period. - trans_list = self._trans_list_utc if in_utc else self._trans_list - idx = bisect.bisect_right(trans_list, timestamp) - - # We want to know when the previous transition was, so subtract off 1 - return idx - 1 - - def _get_ttinfo(self, idx): - # For no list or after the last transition, default to _ttinfo_std - if idx is None or (idx + 1) >= len(self._trans_list): - return self._ttinfo_std - - # If there is a list and the time is before it, return _ttinfo_before - if idx < 0: - return self._ttinfo_before - - return self._trans_idx[idx] - - def _find_ttinfo(self, dt): - idx = self._resolve_ambiguous_time(dt) - - return self._get_ttinfo(idx) - - def fromutc(self, dt): - """ - The ``tzfile`` implementation of :py:func:`datetime.tzinfo.fromutc`. - - :param dt: - A :py:class:`datetime.datetime` object. - - :raises TypeError: - Raised if ``dt`` is not a :py:class:`datetime.datetime` object. - - :raises ValueError: - Raised if this is called with a ``dt`` which does not have this - ``tzinfo`` attached. - - :return: - Returns a :py:class:`datetime.datetime` object representing the - wall time in ``self``'s time zone. - """ - # These isinstance checks are in datetime.tzinfo, so we'll preserve - # them, even if we don't care about duck typing. - if not isinstance(dt, datetime.datetime): - raise TypeError("fromutc() requires a datetime argument") - - if dt.tzinfo is not self: - raise ValueError("dt.tzinfo is not self") - - # First treat UTC as wall time and get the transition we're in. - idx = self._find_last_transition(dt, in_utc=True) - tti = self._get_ttinfo(idx) - - dt_out = dt + datetime.timedelta(seconds=tti.offset) - - fold = self.is_ambiguous(dt_out, idx=idx) - - return enfold(dt_out, fold=int(fold)) - - def is_ambiguous(self, dt, idx=None): - """ - Whether or not the "wall time" of a given datetime is ambiguous in this - zone. - - :param dt: - A :py:class:`datetime.datetime`, naive or time zone aware. - - - :return: - Returns ``True`` if ambiguous, ``False`` otherwise. - - .. versionadded:: 2.6.0 - """ - if idx is None: - idx = self._find_last_transition(dt) - - # Calculate the difference in offsets from current to previous - timestamp = _datetime_to_timestamp(dt) - tti = self._get_ttinfo(idx) - - if idx is None or idx <= 0: - return False - - od = self._get_ttinfo(idx - 1).offset - tti.offset - tt = self._trans_list[idx] # Transition time - - return timestamp < tt + od - - def _resolve_ambiguous_time(self, dt): - idx = self._find_last_transition(dt) - - # If we have no transitions, return the index - _fold = self._fold(dt) - if idx is None or idx == 0: - return idx - - # If it's ambiguous and we're in a fold, shift to a different index. - idx_offset = int(not _fold and self.is_ambiguous(dt, idx)) - - return idx - idx_offset - - def utcoffset(self, dt): - if dt is None: - return None - - if not self._ttinfo_std: - return ZERO - - return self._find_ttinfo(dt).delta - - def dst(self, dt): - if dt is None: - return None - - if not self._ttinfo_dst: - return ZERO - - tti = self._find_ttinfo(dt) - - if not tti.isdst: - return ZERO - - # The documentation says that utcoffset()-dst() must - # be constant for every dt. - return tti.dstoffset - - @tzname_in_python2 - def tzname(self, dt): - if not self._ttinfo_std or dt is None: - return None - return self._find_ttinfo(dt).abbr - - def __eq__(self, other): - if not isinstance(other, tzfile): - return NotImplemented - return (self._trans_list == other._trans_list and - self._trans_idx == other._trans_idx and - self._ttinfo_list == other._ttinfo_list) - - __hash__ = None - - def __ne__(self, other): - return not (self == other) - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, repr(self._filename)) - - def __reduce__(self): - return self.__reduce_ex__(None) - - def __reduce_ex__(self, protocol): - return (self.__class__, (None, self._filename), self.__dict__) - - -class tzrange(tzrangebase): - """ - The ``tzrange`` object is a time zone specified by a set of offsets and - abbreviations, equivalent to the way the ``TZ`` variable can be specified - in POSIX-like systems, but using Python delta objects to specify DST - start, end and offsets. - - :param stdabbr: - The abbreviation for standard time (e.g. ``'EST'``). - - :param stdoffset: - An integer or :class:`datetime.timedelta` object or equivalent - specifying the base offset from UTC. - - If unspecified, +00:00 is used. - - :param dstabbr: - The abbreviation for DST / "Summer" time (e.g. ``'EDT'``). - - If specified, with no other DST information, DST is assumed to occur - and the default behavior or ``dstoffset``, ``start`` and ``end`` is - used. If unspecified and no other DST information is specified, it - is assumed that this zone has no DST. - - If this is unspecified and other DST information is *is* specified, - DST occurs in the zone but the time zone abbreviation is left - unchanged. - - :param dstoffset: - A an integer or :class:`datetime.timedelta` object or equivalent - specifying the UTC offset during DST. If unspecified and any other DST - information is specified, it is assumed to be the STD offset +1 hour. - - :param start: - A :class:`relativedelta.relativedelta` object or equivalent specifying - the time and time of year that daylight savings time starts. To - specify, for example, that DST starts at 2AM on the 2nd Sunday in - March, pass: - - ``relativedelta(hours=2, month=3, day=1, weekday=SU(+2))`` - - If unspecified and any other DST information is specified, the default - value is 2 AM on the first Sunday in April. - - :param end: - A :class:`relativedelta.relativedelta` object or equivalent - representing the time and time of year that daylight savings time - ends, with the same specification method as in ``start``. One note is - that this should point to the first time in the *standard* zone, so if - a transition occurs at 2AM in the DST zone and the clocks are set back - 1 hour to 1AM, set the ``hours`` parameter to +1. - - - **Examples:** - - .. testsetup:: tzrange - - from dateutil.tz import tzrange, tzstr - - .. doctest:: tzrange - - >>> tzstr('EST5EDT') == tzrange("EST", -18000, "EDT") - True - - >>> from dateutil.relativedelta import * - >>> range1 = tzrange("EST", -18000, "EDT") - >>> range2 = tzrange("EST", -18000, "EDT", -14400, - ... relativedelta(hours=+2, month=4, day=1, - ... weekday=SU(+1)), - ... relativedelta(hours=+1, month=10, day=31, - ... weekday=SU(-1))) - >>> tzstr('EST5EDT') == range1 == range2 - True - - """ - def __init__(self, stdabbr, stdoffset=None, - dstabbr=None, dstoffset=None, - start=None, end=None): - - global relativedelta - from dateutil import relativedelta - - self._std_abbr = stdabbr - self._dst_abbr = dstabbr - - try: - stdoffset = stdoffset.total_seconds() - except (TypeError, AttributeError): - pass - - try: - dstoffset = dstoffset.total_seconds() - except (TypeError, AttributeError): - pass - - if stdoffset is not None: - self._std_offset = datetime.timedelta(seconds=stdoffset) - else: - self._std_offset = ZERO - - if dstoffset is not None: - self._dst_offset = datetime.timedelta(seconds=dstoffset) - elif dstabbr and stdoffset is not None: - self._dst_offset = self._std_offset + datetime.timedelta(hours=+1) - else: - self._dst_offset = ZERO - - if dstabbr and start is None: - self._start_delta = relativedelta.relativedelta( - hours=+2, month=4, day=1, weekday=relativedelta.SU(+1)) - else: - self._start_delta = start - - if dstabbr and end is None: - self._end_delta = relativedelta.relativedelta( - hours=+1, month=10, day=31, weekday=relativedelta.SU(-1)) - else: - self._end_delta = end - - self._dst_base_offset_ = self._dst_offset - self._std_offset - self.hasdst = bool(self._start_delta) - - def transitions(self, year): - """ - For a given year, get the DST on and off transition times, expressed - always on the standard time side. For zones with no transitions, this - function returns ``None``. - - :param year: - The year whose transitions you would like to query. - - :return: - Returns a :class:`tuple` of :class:`datetime.datetime` objects, - ``(dston, dstoff)`` for zones with an annual DST transition, or - ``None`` for fixed offset zones. - """ - if not self.hasdst: - return None - - base_year = datetime.datetime(year, 1, 1) - - start = base_year + self._start_delta - end = base_year + self._end_delta - - return (start, end) - - def __eq__(self, other): - if not isinstance(other, tzrange): - return NotImplemented - - return (self._std_abbr == other._std_abbr and - self._dst_abbr == other._dst_abbr and - self._std_offset == other._std_offset and - self._dst_offset == other._dst_offset and - self._start_delta == other._start_delta and - self._end_delta == other._end_delta) - - @property - def _dst_base_offset(self): - return self._dst_base_offset_ - - -@six.add_metaclass(_TzStrFactory) -class tzstr(tzrange): - """ - ``tzstr`` objects are time zone objects specified by a time-zone string as - it would be passed to a ``TZ`` variable on POSIX-style systems (see - the `GNU C Library: TZ Variable`_ for more details). - - There is one notable exception, which is that POSIX-style time zones use an - inverted offset format, so normally ``GMT+3`` would be parsed as an offset - 3 hours *behind* GMT. The ``tzstr`` time zone object will parse this as an - offset 3 hours *ahead* of GMT. If you would like to maintain the POSIX - behavior, pass a ``True`` value to ``posix_offset``. - - The :class:`tzrange` object provides the same functionality, but is - specified using :class:`relativedelta.relativedelta` objects. rather than - strings. - - :param s: - A time zone string in ``TZ`` variable format. This can be a - :class:`bytes` (2.x: :class:`str`), :class:`str` (2.x: - :class:`unicode`) or a stream emitting unicode characters - (e.g. :class:`StringIO`). - - :param posix_offset: - Optional. If set to ``True``, interpret strings such as ``GMT+3`` or - ``UTC+3`` as being 3 hours *behind* UTC rather than ahead, per the - POSIX standard. - - .. caution:: - - Prior to version 2.7.0, this function also supported time zones - in the format: - - * ``EST5EDT,4,0,6,7200,10,0,26,7200,3600`` - * ``EST5EDT,4,1,0,7200,10,-1,0,7200,3600`` - - This format is non-standard and has been deprecated; this function - will raise a :class:`DeprecatedTZFormatWarning` until - support is removed in a future version. - - .. _`GNU C Library: TZ Variable`: - https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html - """ - def __init__(self, s, posix_offset=False): - global parser - from dateutil.parser import _parser as parser - - self._s = s - - res = parser._parsetz(s) - if res is None or res.any_unused_tokens: - raise ValueError("unknown string format") - - # Here we break the compatibility with the TZ variable handling. - # GMT-3 actually *means* the timezone -3. - if res.stdabbr in ("GMT", "UTC") and not posix_offset: - res.stdoffset *= -1 - - # We must initialize it first, since _delta() needs - # _std_offset and _dst_offset set. Use False in start/end - # to avoid building it two times. - tzrange.__init__(self, res.stdabbr, res.stdoffset, - res.dstabbr, res.dstoffset, - start=False, end=False) - - if not res.dstabbr: - self._start_delta = None - self._end_delta = None - else: - self._start_delta = self._delta(res.start) - if self._start_delta: - self._end_delta = self._delta(res.end, isend=1) - - self.hasdst = bool(self._start_delta) - - def _delta(self, x, isend=0): - from dateutil import relativedelta - kwargs = {} - if x.month is not None: - kwargs["month"] = x.month - if x.weekday is not None: - kwargs["weekday"] = relativedelta.weekday(x.weekday, x.week) - if x.week > 0: - kwargs["day"] = 1 - else: - kwargs["day"] = 31 - elif x.day: - kwargs["day"] = x.day - elif x.yday is not None: - kwargs["yearday"] = x.yday - elif x.jyday is not None: - kwargs["nlyearday"] = x.jyday - if not kwargs: - # Default is to start on first sunday of april, and end - # on last sunday of october. - if not isend: - kwargs["month"] = 4 - kwargs["day"] = 1 - kwargs["weekday"] = relativedelta.SU(+1) - else: - kwargs["month"] = 10 - kwargs["day"] = 31 - kwargs["weekday"] = relativedelta.SU(-1) - if x.time is not None: - kwargs["seconds"] = x.time - else: - # Default is 2AM. - kwargs["seconds"] = 7200 - if isend: - # Convert to standard time, to follow the documented way - # of working with the extra hour. See the documentation - # of the tzinfo class. - delta = self._dst_offset - self._std_offset - kwargs["seconds"] -= delta.seconds + delta.days * 86400 - return relativedelta.relativedelta(**kwargs) - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, repr(self._s)) - - -class _tzicalvtzcomp(object): - def __init__(self, tzoffsetfrom, tzoffsetto, isdst, - tzname=None, rrule=None): - self.tzoffsetfrom = datetime.timedelta(seconds=tzoffsetfrom) - self.tzoffsetto = datetime.timedelta(seconds=tzoffsetto) - self.tzoffsetdiff = self.tzoffsetto - self.tzoffsetfrom - self.isdst = isdst - self.tzname = tzname - self.rrule = rrule - - -class _tzicalvtz(_tzinfo): - def __init__(self, tzid, comps=[]): - super(_tzicalvtz, self).__init__() - - self._tzid = tzid - self._comps = comps - self._cachedate = [] - self._cachecomp = [] - self._cache_lock = _thread.allocate_lock() - - def _find_comp(self, dt): - if len(self._comps) == 1: - return self._comps[0] - - dt = dt.replace(tzinfo=None) - - try: - with self._cache_lock: - return self._cachecomp[self._cachedate.index( - (dt, self._fold(dt)))] - except ValueError: - pass - - lastcompdt = None - lastcomp = None - - for comp in self._comps: - compdt = self._find_compdt(comp, dt) - - if compdt and (not lastcompdt or lastcompdt < compdt): - lastcompdt = compdt - lastcomp = comp - - if not lastcomp: - # RFC says nothing about what to do when a given - # time is before the first onset date. We'll look for the - # first standard component, or the first component, if - # none is found. - for comp in self._comps: - if not comp.isdst: - lastcomp = comp - break - else: - lastcomp = comp[0] - - with self._cache_lock: - self._cachedate.insert(0, (dt, self._fold(dt))) - self._cachecomp.insert(0, lastcomp) - - if len(self._cachedate) > 10: - self._cachedate.pop() - self._cachecomp.pop() - - return lastcomp - - def _find_compdt(self, comp, dt): - if comp.tzoffsetdiff < ZERO and self._fold(dt): - dt -= comp.tzoffsetdiff - - compdt = comp.rrule.before(dt, inc=True) - - return compdt - - def utcoffset(self, dt): - if dt is None: - return None - - return self._find_comp(dt).tzoffsetto - - def dst(self, dt): - comp = self._find_comp(dt) - if comp.isdst: - return comp.tzoffsetdiff - else: - return ZERO - - @tzname_in_python2 - def tzname(self, dt): - return self._find_comp(dt).tzname - - def __repr__(self): - return "" % repr(self._tzid) - - __reduce__ = object.__reduce__ - - -class tzical(object): - """ - This object is designed to parse an iCalendar-style ``VTIMEZONE`` structure - as set out in `RFC 5545`_ Section 4.6.5 into one or more `tzinfo` objects. - - :param `fileobj`: - A file or stream in iCalendar format, which should be UTF-8 encoded - with CRLF endings. - - .. _`RFC 5545`: https://tools.ietf.org/html/rfc5545 - """ - def __init__(self, fileobj): - global rrule - from dateutil import rrule - - if isinstance(fileobj, string_types): - self._s = fileobj - # ical should be encoded in UTF-8 with CRLF - fileobj = open(fileobj, 'r') - else: - self._s = getattr(fileobj, 'name', repr(fileobj)) - fileobj = _nullcontext(fileobj) - - self._vtz = {} - - with fileobj as fobj: - self._parse_rfc(fobj.read()) - - def keys(self): - """ - Retrieves the available time zones as a list. - """ - return list(self._vtz.keys()) - - def get(self, tzid=None): - """ - Retrieve a :py:class:`datetime.tzinfo` object by its ``tzid``. - - :param tzid: - If there is exactly one time zone available, omitting ``tzid`` - or passing :py:const:`None` value returns it. Otherwise a valid - key (which can be retrieved from :func:`keys`) is required. - - :raises ValueError: - Raised if ``tzid`` is not specified but there are either more - or fewer than 1 zone defined. - - :returns: - Returns either a :py:class:`datetime.tzinfo` object representing - the relevant time zone or :py:const:`None` if the ``tzid`` was - not found. - """ - if tzid is None: - if len(self._vtz) == 0: - raise ValueError("no timezones defined") - elif len(self._vtz) > 1: - raise ValueError("more than one timezone available") - tzid = next(iter(self._vtz)) - - return self._vtz.get(tzid) - - def _parse_offset(self, s): - s = s.strip() - if not s: - raise ValueError("empty offset") - if s[0] in ('+', '-'): - signal = (-1, +1)[s[0] == '+'] - s = s[1:] - else: - signal = +1 - if len(s) == 4: - return (int(s[:2]) * 3600 + int(s[2:]) * 60) * signal - elif len(s) == 6: - return (int(s[:2]) * 3600 + int(s[2:4]) * 60 + int(s[4:])) * signal - else: - raise ValueError("invalid offset: " + s) - - def _parse_rfc(self, s): - lines = s.splitlines() - if not lines: - raise ValueError("empty string") - - # Unfold - i = 0 - while i < len(lines): - line = lines[i].rstrip() - if not line: - del lines[i] - elif i > 0 and line[0] == " ": - lines[i-1] += line[1:] - del lines[i] - else: - i += 1 - - tzid = None - comps = [] - invtz = False - comptype = None - for line in lines: - if not line: - continue - name, value = line.split(':', 1) - parms = name.split(';') - if not parms: - raise ValueError("empty property name") - name = parms[0].upper() - parms = parms[1:] - if invtz: - if name == "BEGIN": - if value in ("STANDARD", "DAYLIGHT"): - # Process component - pass - else: - raise ValueError("unknown component: "+value) - comptype = value - founddtstart = False - tzoffsetfrom = None - tzoffsetto = None - rrulelines = [] - tzname = None - elif name == "END": - if value == "VTIMEZONE": - if comptype: - raise ValueError("component not closed: "+comptype) - if not tzid: - raise ValueError("mandatory TZID not found") - if not comps: - raise ValueError( - "at least one component is needed") - # Process vtimezone - self._vtz[tzid] = _tzicalvtz(tzid, comps) - invtz = False - elif value == comptype: - if not founddtstart: - raise ValueError("mandatory DTSTART not found") - if tzoffsetfrom is None: - raise ValueError( - "mandatory TZOFFSETFROM not found") - if tzoffsetto is None: - raise ValueError( - "mandatory TZOFFSETFROM not found") - # Process component - rr = None - if rrulelines: - rr = rrule.rrulestr("\n".join(rrulelines), - compatible=True, - ignoretz=True, - cache=True) - comp = _tzicalvtzcomp(tzoffsetfrom, tzoffsetto, - (comptype == "DAYLIGHT"), - tzname, rr) - comps.append(comp) - comptype = None - else: - raise ValueError("invalid component end: "+value) - elif comptype: - if name == "DTSTART": - # DTSTART in VTIMEZONE takes a subset of valid RRULE - # values under RFC 5545. - for parm in parms: - if parm != 'VALUE=DATE-TIME': - msg = ('Unsupported DTSTART param in ' + - 'VTIMEZONE: ' + parm) - raise ValueError(msg) - rrulelines.append(line) - founddtstart = True - elif name in ("RRULE", "RDATE", "EXRULE", "EXDATE"): - rrulelines.append(line) - elif name == "TZOFFSETFROM": - if parms: - raise ValueError( - "unsupported %s parm: %s " % (name, parms[0])) - tzoffsetfrom = self._parse_offset(value) - elif name == "TZOFFSETTO": - if parms: - raise ValueError( - "unsupported TZOFFSETTO parm: "+parms[0]) - tzoffsetto = self._parse_offset(value) - elif name == "TZNAME": - if parms: - raise ValueError( - "unsupported TZNAME parm: "+parms[0]) - tzname = value - elif name == "COMMENT": - pass - else: - raise ValueError("unsupported property: "+name) - else: - if name == "TZID": - if parms: - raise ValueError( - "unsupported TZID parm: "+parms[0]) - tzid = value - elif name in ("TZURL", "LAST-MODIFIED", "COMMENT"): - pass - else: - raise ValueError("unsupported property: "+name) - elif name == "BEGIN" and value == "VTIMEZONE": - tzid = None - comps = [] - invtz = True - - def __repr__(self): - return "%s(%s)" % (self.__class__.__name__, repr(self._s)) - - -if sys.platform != "win32": - TZFILES = ["/etc/localtime", "localtime"] - TZPATHS = ["/usr/share/zoneinfo", - "/usr/lib/zoneinfo", - "/usr/share/lib/zoneinfo", - "/etc/zoneinfo"] -else: - TZFILES = [] - TZPATHS = [] - - -def __get_gettz(): - tzlocal_classes = (tzlocal,) - if tzwinlocal is not None: - tzlocal_classes += (tzwinlocal,) - - class GettzFunc(object): - """ - Retrieve a time zone object from a string representation - - This function is intended to retrieve the :py:class:`tzinfo` subclass - that best represents the time zone that would be used if a POSIX - `TZ variable`_ were set to the same value. - - If no argument or an empty string is passed to ``gettz``, local time - is returned: - - .. code-block:: python3 - - >>> gettz() - tzfile('/etc/localtime') - - This function is also the preferred way to map IANA tz database keys - to :class:`tzfile` objects: - - .. code-block:: python3 - - >>> gettz('Pacific/Kiritimati') - tzfile('/usr/share/zoneinfo/Pacific/Kiritimati') - - On Windows, the standard is extended to include the Windows-specific - zone names provided by the operating system: - - .. code-block:: python3 - - >>> gettz('Egypt Standard Time') - tzwin('Egypt Standard Time') - - Passing a GNU ``TZ`` style string time zone specification returns a - :class:`tzstr` object: - - .. code-block:: python3 - - >>> gettz('AEST-10AEDT-11,M10.1.0/2,M4.1.0/3') - tzstr('AEST-10AEDT-11,M10.1.0/2,M4.1.0/3') - - :param name: - A time zone name (IANA, or, on Windows, Windows keys), location of - a ``tzfile(5)`` zoneinfo file or ``TZ`` variable style time zone - specifier. An empty string, no argument or ``None`` is interpreted - as local time. - - :return: - Returns an instance of one of ``dateutil``'s :py:class:`tzinfo` - subclasses. - - .. versionchanged:: 2.7.0 - - After version 2.7.0, any two calls to ``gettz`` using the same - input strings will return the same object: - - .. code-block:: python3 - - >>> tz.gettz('America/Chicago') is tz.gettz('America/Chicago') - True - - In addition to improving performance, this ensures that - `"same zone" semantics`_ are used for datetimes in the same zone. - - - .. _`TZ variable`: - https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html - - .. _`"same zone" semantics`: - https://blog.ganssle.io/articles/2018/02/aware-datetime-arithmetic.html - """ - def __init__(self): - - self.__instances = weakref.WeakValueDictionary() - self.__strong_cache_size = 8 - self.__strong_cache = OrderedDict() - self._cache_lock = _thread.allocate_lock() - - def __call__(self, name=None): - with self._cache_lock: - rv = self.__instances.get(name, None) - - if rv is None: - rv = self.nocache(name=name) - if not (name is None - or isinstance(rv, tzlocal_classes) - or rv is None): - # tzlocal is slightly more complicated than the other - # time zone providers because it depends on environment - # at construction time, so don't cache that. - # - # We also cannot store weak references to None, so we - # will also not store that. - self.__instances[name] = rv - else: - # No need for strong caching, return immediately - return rv - - self.__strong_cache[name] = self.__strong_cache.pop(name, rv) - - if len(self.__strong_cache) > self.__strong_cache_size: - self.__strong_cache.popitem(last=False) - - return rv - - def set_cache_size(self, size): - with self._cache_lock: - self.__strong_cache_size = size - while len(self.__strong_cache) > size: - self.__strong_cache.popitem(last=False) - - def cache_clear(self): - with self._cache_lock: - self.__instances = weakref.WeakValueDictionary() - self.__strong_cache.clear() - - @staticmethod - def nocache(name=None): - """A non-cached version of gettz""" - tz = None - if not name: - try: - name = os.environ["TZ"] - except KeyError: - pass - if name is None or name in ("", ":"): - for filepath in TZFILES: - if not os.path.isabs(filepath): - filename = filepath - for path in TZPATHS: - filepath = os.path.join(path, filename) - if os.path.isfile(filepath): - break - else: - continue - if os.path.isfile(filepath): - try: - tz = tzfile(filepath) - break - except (IOError, OSError, ValueError): - pass - else: - tz = tzlocal() - else: - try: - if name.startswith(":"): - name = name[1:] - except TypeError as e: - if isinstance(name, bytes): - new_msg = "gettz argument should be str, not bytes" - six.raise_from(TypeError(new_msg), e) - else: - raise - if os.path.isabs(name): - if os.path.isfile(name): - tz = tzfile(name) - else: - tz = None - else: - for path in TZPATHS: - filepath = os.path.join(path, name) - if not os.path.isfile(filepath): - filepath = filepath.replace(' ', '_') - if not os.path.isfile(filepath): - continue - try: - tz = tzfile(filepath) - break - except (IOError, OSError, ValueError): - pass - else: - tz = None - if tzwin is not None: - try: - tz = tzwin(name) - except (WindowsError, UnicodeEncodeError): - # UnicodeEncodeError is for Python 2.7 compat - tz = None - - if not tz: - from dateutil.zoneinfo import get_zonefile_instance - tz = get_zonefile_instance().get(name) - - if not tz: - for c in name: - # name is not a tzstr unless it has at least - # one offset. For short values of "name", an - # explicit for loop seems to be the fastest way - # To determine if a string contains a digit - if c in "0123456789": - try: - tz = tzstr(name) - except ValueError: - pass - break - else: - if name in ("GMT", "UTC"): - tz = UTC - elif name in time.tzname: - tz = tzlocal() - return tz - - return GettzFunc() - - -gettz = __get_gettz() -del __get_gettz - - -def datetime_exists(dt, tz=None): - """ - Given a datetime and a time zone, determine whether or not a given datetime - would fall in a gap. - - :param dt: - A :class:`datetime.datetime` (whose time zone will be ignored if ``tz`` - is provided.) - - :param tz: - A :class:`datetime.tzinfo` with support for the ``fold`` attribute. If - ``None`` or not provided, the datetime's own time zone will be used. - - :return: - Returns a boolean value whether or not the "wall time" exists in - ``tz``. - - .. versionadded:: 2.7.0 - """ - if tz is None: - if dt.tzinfo is None: - raise ValueError('Datetime is naive and no time zone provided.') - tz = dt.tzinfo - - dt = dt.replace(tzinfo=None) - - # This is essentially a test of whether or not the datetime can survive - # a round trip to UTC. - dt_rt = dt.replace(tzinfo=tz).astimezone(UTC).astimezone(tz) - dt_rt = dt_rt.replace(tzinfo=None) - - return dt == dt_rt - - -def datetime_ambiguous(dt, tz=None): - """ - Given a datetime and a time zone, determine whether or not a given datetime - is ambiguous (i.e if there are two times differentiated only by their DST - status). - - :param dt: - A :class:`datetime.datetime` (whose time zone will be ignored if ``tz`` - is provided.) - - :param tz: - A :class:`datetime.tzinfo` with support for the ``fold`` attribute. If - ``None`` or not provided, the datetime's own time zone will be used. - - :return: - Returns a boolean value whether or not the "wall time" is ambiguous in - ``tz``. - - .. versionadded:: 2.6.0 - """ - if tz is None: - if dt.tzinfo is None: - raise ValueError('Datetime is naive and no time zone provided.') - - tz = dt.tzinfo - - # If a time zone defines its own "is_ambiguous" function, we'll use that. - is_ambiguous_fn = getattr(tz, 'is_ambiguous', None) - if is_ambiguous_fn is not None: - try: - return tz.is_ambiguous(dt) - except Exception: - pass - - # If it doesn't come out and tell us it's ambiguous, we'll just check if - # the fold attribute has any effect on this particular date and time. - dt = dt.replace(tzinfo=tz) - wall_0 = enfold(dt, fold=0) - wall_1 = enfold(dt, fold=1) - - same_offset = wall_0.utcoffset() == wall_1.utcoffset() - same_dst = wall_0.dst() == wall_1.dst() - - return not (same_offset and same_dst) - - -def resolve_imaginary(dt): - """ - Given a datetime that may be imaginary, return an existing datetime. - - This function assumes that an imaginary datetime represents what the - wall time would be in a zone had the offset transition not occurred, so - it will always fall forward by the transition's change in offset. - - .. doctest:: - - >>> from dateutil import tz - >>> from datetime import datetime - >>> NYC = tz.gettz('America/New_York') - >>> print(tz.resolve_imaginary(datetime(2017, 3, 12, 2, 30, tzinfo=NYC))) - 2017-03-12 03:30:00-04:00 - - >>> KIR = tz.gettz('Pacific/Kiritimati') - >>> print(tz.resolve_imaginary(datetime(1995, 1, 1, 12, 30, tzinfo=KIR))) - 1995-01-02 12:30:00+14:00 - - As a note, :func:`datetime.astimezone` is guaranteed to produce a valid, - existing datetime, so a round-trip to and from UTC is sufficient to get - an extant datetime, however, this generally "falls back" to an earlier time - rather than falling forward to the STD side (though no guarantees are made - about this behavior). - - :param dt: - A :class:`datetime.datetime` which may or may not exist. - - :return: - Returns an existing :class:`datetime.datetime`. If ``dt`` was not - imaginary, the datetime returned is guaranteed to be the same object - passed to the function. - - .. versionadded:: 2.7.0 - """ - if dt.tzinfo is not None and not datetime_exists(dt): - - curr_offset = (dt + datetime.timedelta(hours=24)).utcoffset() - old_offset = (dt - datetime.timedelta(hours=24)).utcoffset() - - dt += curr_offset - old_offset - - return dt - - -def _datetime_to_timestamp(dt): - """ - Convert a :class:`datetime.datetime` object to an epoch timestamp in - seconds since January 1, 1970, ignoring the time zone. - """ - return (dt.replace(tzinfo=None) - EPOCH).total_seconds() - - -if sys.version_info >= (3, 6): - def _get_supported_offset(second_offset): - return second_offset -else: - def _get_supported_offset(second_offset): - # For python pre-3.6, round to full-minutes if that's not the case. - # Python's datetime doesn't accept sub-minute timezones. Check - # http://python.org/sf/1447945 or https://bugs.python.org/issue5288 - # for some information. - old_offset = second_offset - calculated_offset = 60 * ((second_offset + 30) // 60) - return calculated_offset - - -try: - # Python 3.7 feature - from contextlib import nullcontext as _nullcontext -except ImportError: - class _nullcontext(object): - """ - Class for wrapping contexts so that they are passed through in a - with statement. - """ - def __init__(self, context): - self.context = context - - def __enter__(self): - return self.context - - def __exit__(*args, **kwargs): - pass - -# vim:ts=4:sw=4:et diff --git a/.venv/Lib/site-packages/dateutil/tz/win.py b/.venv/Lib/site-packages/dateutil/tz/win.py deleted file mode 100644 index cde07ba..0000000 --- a/.venv/Lib/site-packages/dateutil/tz/win.py +++ /dev/null @@ -1,370 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module provides an interface to the native time zone data on Windows, -including :py:class:`datetime.tzinfo` implementations. - -Attempting to import this module on a non-Windows platform will raise an -:py:obj:`ImportError`. -""" -# This code was originally contributed by Jeffrey Harris. -import datetime -import struct - -from six.moves import winreg -from six import text_type - -try: - import ctypes - from ctypes import wintypes -except ValueError: - # ValueError is raised on non-Windows systems for some horrible reason. - raise ImportError("Running tzwin on non-Windows system") - -from ._common import tzrangebase - -__all__ = ["tzwin", "tzwinlocal", "tzres"] - -ONEWEEK = datetime.timedelta(7) - -TZKEYNAMENT = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones" -TZKEYNAME9X = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Time Zones" -TZLOCALKEYNAME = r"SYSTEM\CurrentControlSet\Control\TimeZoneInformation" - - -def _settzkeyname(): - handle = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) - try: - winreg.OpenKey(handle, TZKEYNAMENT).Close() - TZKEYNAME = TZKEYNAMENT - except WindowsError: - TZKEYNAME = TZKEYNAME9X - handle.Close() - return TZKEYNAME - - -TZKEYNAME = _settzkeyname() - - -class tzres(object): - """ - Class for accessing ``tzres.dll``, which contains timezone name related - resources. - - .. versionadded:: 2.5.0 - """ - p_wchar = ctypes.POINTER(wintypes.WCHAR) # Pointer to a wide char - - def __init__(self, tzres_loc='tzres.dll'): - # Load the user32 DLL so we can load strings from tzres - user32 = ctypes.WinDLL('user32') - - # Specify the LoadStringW function - user32.LoadStringW.argtypes = (wintypes.HINSTANCE, - wintypes.UINT, - wintypes.LPWSTR, - ctypes.c_int) - - self.LoadStringW = user32.LoadStringW - self._tzres = ctypes.WinDLL(tzres_loc) - self.tzres_loc = tzres_loc - - def load_name(self, offset): - """ - Load a timezone name from a DLL offset (integer). - - >>> from dateutil.tzwin import tzres - >>> tzr = tzres() - >>> print(tzr.load_name(112)) - 'Eastern Standard Time' - - :param offset: - A positive integer value referring to a string from the tzres dll. - - .. note:: - - Offsets found in the registry are generally of the form - ``@tzres.dll,-114``. The offset in this case is 114, not -114. - - """ - resource = self.p_wchar() - lpBuffer = ctypes.cast(ctypes.byref(resource), wintypes.LPWSTR) - nchar = self.LoadStringW(self._tzres._handle, offset, lpBuffer, 0) - return resource[:nchar] - - def name_from_string(self, tzname_str): - """ - Parse strings as returned from the Windows registry into the time zone - name as defined in the registry. - - >>> from dateutil.tzwin import tzres - >>> tzr = tzres() - >>> print(tzr.name_from_string('@tzres.dll,-251')) - 'Dateline Daylight Time' - >>> print(tzr.name_from_string('Eastern Standard Time')) - 'Eastern Standard Time' - - :param tzname_str: - A timezone name string as returned from a Windows registry key. - - :return: - Returns the localized timezone string from tzres.dll if the string - is of the form `@tzres.dll,-offset`, else returns the input string. - """ - if not tzname_str.startswith('@'): - return tzname_str - - name_splt = tzname_str.split(',-') - try: - offset = int(name_splt[1]) - except: - raise ValueError("Malformed timezone string.") - - return self.load_name(offset) - - -class tzwinbase(tzrangebase): - """tzinfo class based on win32's timezones available in the registry.""" - def __init__(self): - raise NotImplementedError('tzwinbase is an abstract base class') - - def __eq__(self, other): - # Compare on all relevant dimensions, including name. - if not isinstance(other, tzwinbase): - return NotImplemented - - return (self._std_offset == other._std_offset and - self._dst_offset == other._dst_offset and - self._stddayofweek == other._stddayofweek and - self._dstdayofweek == other._dstdayofweek and - self._stdweeknumber == other._stdweeknumber and - self._dstweeknumber == other._dstweeknumber and - self._stdhour == other._stdhour and - self._dsthour == other._dsthour and - self._stdminute == other._stdminute and - self._dstminute == other._dstminute and - self._std_abbr == other._std_abbr and - self._dst_abbr == other._dst_abbr) - - @staticmethod - def list(): - """Return a list of all time zones known to the system.""" - with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: - with winreg.OpenKey(handle, TZKEYNAME) as tzkey: - result = [winreg.EnumKey(tzkey, i) - for i in range(winreg.QueryInfoKey(tzkey)[0])] - return result - - def display(self): - """ - Return the display name of the time zone. - """ - return self._display - - def transitions(self, year): - """ - For a given year, get the DST on and off transition times, expressed - always on the standard time side. For zones with no transitions, this - function returns ``None``. - - :param year: - The year whose transitions you would like to query. - - :return: - Returns a :class:`tuple` of :class:`datetime.datetime` objects, - ``(dston, dstoff)`` for zones with an annual DST transition, or - ``None`` for fixed offset zones. - """ - - if not self.hasdst: - return None - - dston = picknthweekday(year, self._dstmonth, self._dstdayofweek, - self._dsthour, self._dstminute, - self._dstweeknumber) - - dstoff = picknthweekday(year, self._stdmonth, self._stddayofweek, - self._stdhour, self._stdminute, - self._stdweeknumber) - - # Ambiguous dates default to the STD side - dstoff -= self._dst_base_offset - - return dston, dstoff - - def _get_hasdst(self): - return self._dstmonth != 0 - - @property - def _dst_base_offset(self): - return self._dst_base_offset_ - - -class tzwin(tzwinbase): - """ - Time zone object created from the zone info in the Windows registry - - These are similar to :py:class:`dateutil.tz.tzrange` objects in that - the time zone data is provided in the format of a single offset rule - for either 0 or 2 time zone transitions per year. - - :param: name - The name of a Windows time zone key, e.g. "Eastern Standard Time". - The full list of keys can be retrieved with :func:`tzwin.list`. - """ - - def __init__(self, name): - self._name = name - - with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: - tzkeyname = text_type("{kn}\\{name}").format(kn=TZKEYNAME, name=name) - with winreg.OpenKey(handle, tzkeyname) as tzkey: - keydict = valuestodict(tzkey) - - self._std_abbr = keydict["Std"] - self._dst_abbr = keydict["Dlt"] - - self._display = keydict["Display"] - - # See http://ww_winreg.jsiinc.com/SUBA/tip0300/rh0398.htm - tup = struct.unpack("=3l16h", keydict["TZI"]) - stdoffset = -tup[0]-tup[1] # Bias + StandardBias * -1 - dstoffset = stdoffset-tup[2] # + DaylightBias * -1 - self._std_offset = datetime.timedelta(minutes=stdoffset) - self._dst_offset = datetime.timedelta(minutes=dstoffset) - - # for the meaning see the win32 TIME_ZONE_INFORMATION structure docs - # http://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx - (self._stdmonth, - self._stddayofweek, # Sunday = 0 - self._stdweeknumber, # Last = 5 - self._stdhour, - self._stdminute) = tup[4:9] - - (self._dstmonth, - self._dstdayofweek, # Sunday = 0 - self._dstweeknumber, # Last = 5 - self._dsthour, - self._dstminute) = tup[12:17] - - self._dst_base_offset_ = self._dst_offset - self._std_offset - self.hasdst = self._get_hasdst() - - def __repr__(self): - return "tzwin(%s)" % repr(self._name) - - def __reduce__(self): - return (self.__class__, (self._name,)) - - -class tzwinlocal(tzwinbase): - """ - Class representing the local time zone information in the Windows registry - - While :class:`dateutil.tz.tzlocal` makes system calls (via the :mod:`time` - module) to retrieve time zone information, ``tzwinlocal`` retrieves the - rules directly from the Windows registry and creates an object like - :class:`dateutil.tz.tzwin`. - - Because Windows does not have an equivalent of :func:`time.tzset`, on - Windows, :class:`dateutil.tz.tzlocal` instances will always reflect the - time zone settings *at the time that the process was started*, meaning - changes to the machine's time zone settings during the run of a program - on Windows will **not** be reflected by :class:`dateutil.tz.tzlocal`. - Because ``tzwinlocal`` reads the registry directly, it is unaffected by - this issue. - """ - def __init__(self): - with winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) as handle: - with winreg.OpenKey(handle, TZLOCALKEYNAME) as tzlocalkey: - keydict = valuestodict(tzlocalkey) - - self._std_abbr = keydict["StandardName"] - self._dst_abbr = keydict["DaylightName"] - - try: - tzkeyname = text_type('{kn}\\{sn}').format(kn=TZKEYNAME, - sn=self._std_abbr) - with winreg.OpenKey(handle, tzkeyname) as tzkey: - _keydict = valuestodict(tzkey) - self._display = _keydict["Display"] - except OSError: - self._display = None - - stdoffset = -keydict["Bias"]-keydict["StandardBias"] - dstoffset = stdoffset-keydict["DaylightBias"] - - self._std_offset = datetime.timedelta(minutes=stdoffset) - self._dst_offset = datetime.timedelta(minutes=dstoffset) - - # For reasons unclear, in this particular key, the day of week has been - # moved to the END of the SYSTEMTIME structure. - tup = struct.unpack("=8h", keydict["StandardStart"]) - - (self._stdmonth, - self._stdweeknumber, # Last = 5 - self._stdhour, - self._stdminute) = tup[1:5] - - self._stddayofweek = tup[7] - - tup = struct.unpack("=8h", keydict["DaylightStart"]) - - (self._dstmonth, - self._dstweeknumber, # Last = 5 - self._dsthour, - self._dstminute) = tup[1:5] - - self._dstdayofweek = tup[7] - - self._dst_base_offset_ = self._dst_offset - self._std_offset - self.hasdst = self._get_hasdst() - - def __repr__(self): - return "tzwinlocal()" - - def __str__(self): - # str will return the standard name, not the daylight name. - return "tzwinlocal(%s)" % repr(self._std_abbr) - - def __reduce__(self): - return (self.__class__, ()) - - -def picknthweekday(year, month, dayofweek, hour, minute, whichweek): - """ dayofweek == 0 means Sunday, whichweek 5 means last instance """ - first = datetime.datetime(year, month, 1, hour, minute) - - # This will work if dayofweek is ISO weekday (1-7) or Microsoft-style (0-6), - # Because 7 % 7 = 0 - weekdayone = first.replace(day=((dayofweek - first.isoweekday()) % 7) + 1) - wd = weekdayone + ((whichweek - 1) * ONEWEEK) - if (wd.month != month): - wd -= ONEWEEK - - return wd - - -def valuestodict(key): - """Convert a registry key's values to a dictionary.""" - dout = {} - size = winreg.QueryInfoKey(key)[1] - tz_res = None - - for i in range(size): - key_name, value, dtype = winreg.EnumValue(key, i) - if dtype == winreg.REG_DWORD or dtype == winreg.REG_DWORD_LITTLE_ENDIAN: - # If it's a DWORD (32-bit integer), it's stored as unsigned - convert - # that to a proper signed integer - if value & (1 << 31): - value = value - (1 << 32) - elif dtype == winreg.REG_SZ: - # If it's a reference to the tzres DLL, load the actual string - if value.startswith('@tzres'): - tz_res = tz_res or tzres() - value = tz_res.name_from_string(value) - - value = value.rstrip('\x00') # Remove trailing nulls - - dout[key_name] = value - - return dout diff --git a/.venv/Lib/site-packages/dateutil/tzwin.py b/.venv/Lib/site-packages/dateutil/tzwin.py deleted file mode 100644 index cebc673..0000000 --- a/.venv/Lib/site-packages/dateutil/tzwin.py +++ /dev/null @@ -1,2 +0,0 @@ -# tzwin has moved to dateutil.tz.win -from .tz.win import * diff --git a/.venv/Lib/site-packages/dateutil/utils.py b/.venv/Lib/site-packages/dateutil/utils.py deleted file mode 100644 index dd2d245..0000000 --- a/.venv/Lib/site-packages/dateutil/utils.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module offers general convenience and utility functions for dealing with -datetimes. - -.. versionadded:: 2.7.0 -""" -from __future__ import unicode_literals - -from datetime import datetime, time - - -def today(tzinfo=None): - """ - Returns a :py:class:`datetime` representing the current day at midnight - - :param tzinfo: - The time zone to attach (also used to determine the current day). - - :return: - A :py:class:`datetime.datetime` object representing the current day - at midnight. - """ - - dt = datetime.now(tzinfo) - return datetime.combine(dt.date(), time(0, tzinfo=tzinfo)) - - -def default_tzinfo(dt, tzinfo): - """ - Sets the ``tzinfo`` parameter on naive datetimes only - - This is useful for example when you are provided a datetime that may have - either an implicit or explicit time zone, such as when parsing a time zone - string. - - .. doctest:: - - >>> from dateutil.tz import tzoffset - >>> from dateutil.parser import parse - >>> from dateutil.utils import default_tzinfo - >>> dflt_tz = tzoffset("EST", -18000) - >>> print(default_tzinfo(parse('2014-01-01 12:30 UTC'), dflt_tz)) - 2014-01-01 12:30:00+00:00 - >>> print(default_tzinfo(parse('2014-01-01 12:30'), dflt_tz)) - 2014-01-01 12:30:00-05:00 - - :param dt: - The datetime on which to replace the time zone - - :param tzinfo: - The :py:class:`datetime.tzinfo` subclass instance to assign to - ``dt`` if (and only if) it is naive. - - :return: - Returns an aware :py:class:`datetime.datetime`. - """ - if dt.tzinfo is not None: - return dt - else: - return dt.replace(tzinfo=tzinfo) - - -def within_delta(dt1, dt2, delta): - """ - Useful for comparing two datetimes that may have a negligible difference - to be considered equal. - """ - delta = abs(delta) - difference = dt1 - dt2 - return -delta <= difference <= delta diff --git a/.venv/Lib/site-packages/dateutil/zoneinfo/__init__.py b/.venv/Lib/site-packages/dateutil/zoneinfo/__init__.py deleted file mode 100644 index 34f11ad..0000000 --- a/.venv/Lib/site-packages/dateutil/zoneinfo/__init__.py +++ /dev/null @@ -1,167 +0,0 @@ -# -*- coding: utf-8 -*- -import warnings -import json - -from tarfile import TarFile -from pkgutil import get_data -from io import BytesIO - -from dateutil.tz import tzfile as _tzfile - -__all__ = ["get_zonefile_instance", "gettz", "gettz_db_metadata"] - -ZONEFILENAME = "dateutil-zoneinfo.tar.gz" -METADATA_FN = 'METADATA' - - -class tzfile(_tzfile): - def __reduce__(self): - return (gettz, (self._filename,)) - - -def getzoneinfofile_stream(): - try: - return BytesIO(get_data(__name__, ZONEFILENAME)) - except IOError as e: # TODO switch to FileNotFoundError? - warnings.warn("I/O error({0}): {1}".format(e.errno, e.strerror)) - return None - - -class ZoneInfoFile(object): - def __init__(self, zonefile_stream=None): - if zonefile_stream is not None: - with TarFile.open(fileobj=zonefile_stream) as tf: - self.zones = {zf.name: tzfile(tf.extractfile(zf), filename=zf.name) - for zf in tf.getmembers() - if zf.isfile() and zf.name != METADATA_FN} - # deal with links: They'll point to their parent object. Less - # waste of memory - links = {zl.name: self.zones[zl.linkname] - for zl in tf.getmembers() if - zl.islnk() or zl.issym()} - self.zones.update(links) - try: - metadata_json = tf.extractfile(tf.getmember(METADATA_FN)) - metadata_str = metadata_json.read().decode('UTF-8') - self.metadata = json.loads(metadata_str) - except KeyError: - # no metadata in tar file - self.metadata = None - else: - self.zones = {} - self.metadata = None - - def get(self, name, default=None): - """ - Wrapper for :func:`ZoneInfoFile.zones.get`. This is a convenience method - for retrieving zones from the zone dictionary. - - :param name: - The name of the zone to retrieve. (Generally IANA zone names) - - :param default: - The value to return in the event of a missing key. - - .. versionadded:: 2.6.0 - - """ - return self.zones.get(name, default) - - -# The current API has gettz as a module function, although in fact it taps into -# a stateful class. So as a workaround for now, without changing the API, we -# will create a new "global" class instance the first time a user requests a -# timezone. Ugly, but adheres to the api. -# -# TODO: Remove after deprecation period. -_CLASS_ZONE_INSTANCE = [] - - -def get_zonefile_instance(new_instance=False): - """ - This is a convenience function which provides a :class:`ZoneInfoFile` - instance using the data provided by the ``dateutil`` package. By default, it - caches a single instance of the ZoneInfoFile object and returns that. - - :param new_instance: - If ``True``, a new instance of :class:`ZoneInfoFile` is instantiated and - used as the cached instance for the next call. Otherwise, new instances - are created only as necessary. - - :return: - Returns a :class:`ZoneInfoFile` object. - - .. versionadded:: 2.6 - """ - if new_instance: - zif = None - else: - zif = getattr(get_zonefile_instance, '_cached_instance', None) - - if zif is None: - zif = ZoneInfoFile(getzoneinfofile_stream()) - - get_zonefile_instance._cached_instance = zif - - return zif - - -def gettz(name): - """ - This retrieves a time zone from the local zoneinfo tarball that is packaged - with dateutil. - - :param name: - An IANA-style time zone name, as found in the zoneinfo file. - - :return: - Returns a :class:`dateutil.tz.tzfile` time zone object. - - .. warning:: - It is generally inadvisable to use this function, and it is only - provided for API compatibility with earlier versions. This is *not* - equivalent to ``dateutil.tz.gettz()``, which selects an appropriate - time zone based on the inputs, favoring system zoneinfo. This is ONLY - for accessing the dateutil-specific zoneinfo (which may be out of - date compared to the system zoneinfo). - - .. deprecated:: 2.6 - If you need to use a specific zoneinfofile over the system zoneinfo, - instantiate a :class:`dateutil.zoneinfo.ZoneInfoFile` object and call - :func:`dateutil.zoneinfo.ZoneInfoFile.get(name)` instead. - - Use :func:`get_zonefile_instance` to retrieve an instance of the - dateutil-provided zoneinfo. - """ - warnings.warn("zoneinfo.gettz() will be removed in future versions, " - "to use the dateutil-provided zoneinfo files, instantiate a " - "ZoneInfoFile object and use ZoneInfoFile.zones.get() " - "instead. See the documentation for details.", - DeprecationWarning) - - if len(_CLASS_ZONE_INSTANCE) == 0: - _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) - return _CLASS_ZONE_INSTANCE[0].zones.get(name) - - -def gettz_db_metadata(): - """ Get the zonefile metadata - - See `zonefile_metadata`_ - - :returns: - A dictionary with the database metadata - - .. deprecated:: 2.6 - See deprecation warning in :func:`zoneinfo.gettz`. To get metadata, - query the attribute ``zoneinfo.ZoneInfoFile.metadata``. - """ - warnings.warn("zoneinfo.gettz_db_metadata() will be removed in future " - "versions, to use the dateutil-provided zoneinfo files, " - "ZoneInfoFile object and query the 'metadata' attribute " - "instead. See the documentation for details.", - DeprecationWarning) - - if len(_CLASS_ZONE_INSTANCE) == 0: - _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream())) - return _CLASS_ZONE_INSTANCE[0].metadata diff --git a/.venv/Lib/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index a657e213bd35e95b421b2f92c23e5b40521f19f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8516 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 D8Dch= diff --git a/.venv/Lib/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-311.pyc b/.venv/Lib/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-311.pyc deleted file mode 100644 index 7f8d301d1b5be98d7397f6536c00af178ffe42c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4686 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

  • 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 z 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 int: ... - @property - def creation_date(self) -> datetime.datetime | None: ... - @property - def copyright(self) -> str | None: ... - @property - def target(self) -> str | None: ... - @property - def manufacturer(self) -> str | None: ... - @property - def model(self) -> str | None: ... - @property - def profile_description(self) -> str | None: ... - @property - def screening_description(self) -> str | None: ... - @property - def viewing_condition(self) -> str | None: ... - @property - def version(self) -> float: ... - @property - def icc_version(self) -> int: ... - @property - def attributes(self) -> int: ... - @property - def header_flags(self) -> int: ... - @property - def header_manufacturer(self) -> str: ... - @property - def header_model(self) -> str: ... - @property - def device_class(self) -> str: ... - @property - def connection_space(self) -> str: ... - @property - def xcolor_space(self) -> str: ... - @property - def profile_id(self) -> bytes: ... - @property - def is_matrix_shaper(self) -> bool: ... - @property - def technology(self) -> str | None: ... - @property - def colorimetric_intent(self) -> str | None: ... - @property - def perceptual_rendering_intent_gamut(self) -> str | None: ... - @property - def saturation_rendering_intent_gamut(self) -> str | None: ... - @property - def red_colorant(self) -> _Tuple2x3f | None: ... - @property - def green_colorant(self) -> _Tuple2x3f | None: ... - @property - def blue_colorant(self) -> _Tuple2x3f | None: ... - @property - def red_primary(self) -> _Tuple2x3f | None: ... - @property - def green_primary(self) -> _Tuple2x3f | None: ... - @property - def blue_primary(self) -> _Tuple2x3f | None: ... - @property - def media_white_point_temperature(self) -> float | None: ... - @property - def media_white_point(self) -> _Tuple2x3f | None: ... - @property - def media_black_point(self) -> _Tuple2x3f | None: ... - @property - def luminance(self) -> _Tuple2x3f | None: ... - @property - def chromatic_adaptation(self) -> tuple[_Tuple3x3f, _Tuple3x3f] | None: ... - @property - def chromaticity(self) -> _Tuple3x3f | None: ... - @property - def colorant_table(self) -> list[str] | None: ... - @property - def colorant_table_out(self) -> list[str] | None: ... - @property - def intent_supported(self) -> dict[int, tuple[bool, bool, bool]] | None: ... - @property - def clut(self) -> dict[int, tuple[bool, bool, bool]] | None: ... - @property - def icc_measurement_condition(self) -> _IccMeasurementCondition | None: ... - @property - def icc_viewing_condition(self) -> _IccViewingCondition | None: ... - def is_intent_supported(self, intent: int, direction: int, /) -> int: ... - -class CmsTransform: - def apply(self, id_in: int, id_out: int) -> int: ... - -def profile_open(profile: str, /) -> CmsProfile: ... -def profile_frombytes(profile: bytes, /) -> CmsProfile: ... -def profile_tobytes(profile: CmsProfile, /) -> bytes: ... -def buildTransform( - input_profile: CmsProfile, - output_profile: CmsProfile, - in_mode: str, - out_mode: str, - rendering_intent: int = 0, - cms_flags: int = 0, - /, -) -> CmsTransform: ... -def buildProofTransform( - input_profile: CmsProfile, - output_profile: CmsProfile, - proof_profile: CmsProfile, - in_mode: str, - out_mode: str, - rendering_intent: int = 0, - proof_intent: int = 0, - cms_flags: int = 0, - /, -) -> CmsTransform: ... -def createProfile( - color_space: Literal["LAB", "XYZ", "sRGB"], color_temp: SupportsFloat = 0.0, / -) -> CmsProfile: ... - -if sys.platform == "win32": - def get_display_profile_win32(handle: int = 0, is_dc: int = 0, /) -> str | None: ... diff --git a/.venv/Lib/site-packages/PIL/_imagingft.cp311-win_amd64.pyd b/.venv/Lib/site-packages/PIL/_imagingft.cp311-win_amd64.pyd deleted file mode 100644 index 5e42b1841796ded5e2c69a7cdab07ee2e5ebac63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1819136 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 z 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 neIluQyuv-dw>@sNmv&U&;yKEgx}N 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