From eded79487f42e7094a2bbc2f47bd33fd710bde66 Mon Sep 17 00:00:00 2001
From: Jason Jackson <jake1164@hotmail.com>
Date: Sat, 30 Nov 2024 09:31:57 -0500
Subject: [PATCH 1/2] Updated to work with Circuitpython 9.2.x

---
 src/code.py                                   |   2 +-
 src/lib/adafruit_bitmap_font/bdf.py           |   2 +-
 src/lib/adafruit_bitmap_font/bitmap_font.py   |   2 +-
 src/lib/adafruit_bitmap_font/glyph_cache.py   |   2 +-
 src/lib/adafruit_bus_device/i2c_device.py     |   2 +-
 src/lib/adafruit_bus_device/spi_device.py     |   4 +-
 src/lib/adafruit_connection_manager.mpy       | Bin 0 -> 3541 bytes
 src/lib/adafruit_display_text/__init__.py     |  10 +-
 src/lib/adafruit_display_text/bitmap_label.py |  19 +-
 src/lib/adafruit_display_text/label.py        |   2 +-
 .../adafruit_display_text/outlined_label.py   | 188 ++++++++
 .../adafruit_display_text/scrolling_label.py  |  30 +-
 src/lib/adafruit_display_text/text_box.py     | 435 ++++++++++++++++++
 src/lib/adafruit_ds3231.mpy                   | Bin 1229 -> 1225 bytes
 src/lib/adafruit_imageload/__init__.py        |  25 +-
 src/lib/adafruit_imageload/bmp/__init__.py    |  18 +-
 src/lib/adafruit_imageload/bmp/indexed.py     |  24 +-
 src/lib/adafruit_imageload/bmp/truecolor.py   |  26 +-
 src/lib/adafruit_imageload/displayio_types.py |   6 +-
 src/lib/adafruit_imageload/gif.py             |  34 +-
 src/lib/adafruit_imageload/jpg.py             |  57 +++
 src/lib/adafruit_imageload/png.py             | 112 ++++-
 src/lib/adafruit_imageload/pnm/__init__.py    |  29 +-
 src/lib/adafruit_imageload/pnm/pbm_ascii.py   |   7 +-
 src/lib/adafruit_imageload/pnm/pbm_binary.py  |   8 +-
 .../adafruit_imageload/pnm/pgm/__init__.py    |  12 +-
 src/lib/adafruit_imageload/pnm/pgm/ascii.py   |  13 +-
 src/lib/adafruit_imageload/pnm/pgm/binary.py  |  13 +-
 src/lib/adafruit_imageload/pnm/ppm_ascii.py   |  14 +-
 src/lib/adafruit_imageload/pnm/ppm_binary.py  |  12 +-
 .../adafruit_imageload/tilegrid_inflator.py   |  13 +-
 src/lib/adafruit_irremote.mpy                 | Bin 3069 -> 2977 bytes
 src/lib/adafruit_ntp.mpy                      | Bin 855 -> 1245 bytes
 src/lib/adafruit_register/i2c_bcd_alarm.py    |  10 +-
 src/lib/adafruit_register/i2c_bcd_datetime.py |   2 +-
 src/lib/adafruit_register/i2c_bit.py          |   2 +-
 src/lib/adafruit_register/i2c_bits.py         |   2 +-
 src/lib/adafruit_register/i2c_struct.py       |   2 +-
 src/lib/adafruit_register/i2c_struct_array.py |   2 +-
 src/lib/adafruit_requests.mpy                 | Bin 8578 -> 6944 bytes
 src/lib/adafruit_ticks.mpy                    | Bin 0 -> 694 bytes
 src/network.py                                |  27 +-
 42 files changed, 969 insertions(+), 199 deletions(-)
 create mode 100644 src/lib/adafruit_connection_manager.mpy
 create mode 100644 src/lib/adafruit_display_text/outlined_label.py
 create mode 100644 src/lib/adafruit_display_text/text_box.py
 create mode 100644 src/lib/adafruit_imageload/jpg.py
 create mode 100644 src/lib/adafruit_ticks.mpy

diff --git a/src/code.py b/src/code.py
index be86a7f..aea4432 100644
--- a/src/code.py
+++ b/src/code.py
@@ -1,6 +1,6 @@
 # UPDATE the settings.toml file before starting!
 
-# Following are imported from circuitpython 8.x
+# Following are imported from circuitpython 9.x
 import os
 import gc
 import board
diff --git a/src/lib/adafruit_bitmap_font/bdf.py b/src/lib/adafruit_bitmap_font/bdf.py
index c27175e..4ff14f0 100644
--- a/src/lib/adafruit_bitmap_font/bdf.py
+++ b/src/lib/adafruit_bitmap_font/bdf.py
@@ -33,7 +33,7 @@
 from fontio import Glyph
 from .glyph_cache import GlyphCache
 
-__version__ = "2.1.0"
+__version__ = "2.1.3"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font.git"
 
 
diff --git a/src/lib/adafruit_bitmap_font/bitmap_font.py b/src/lib/adafruit_bitmap_font/bitmap_font.py
index da11e5d..640b041 100644
--- a/src/lib/adafruit_bitmap_font/bitmap_font.py
+++ b/src/lib/adafruit_bitmap_font/bitmap_font.py
@@ -31,7 +31,7 @@
 except ImportError:
     pass
 
-__version__ = "2.1.0"
+__version__ = "2.1.3"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font.git"
 
 
diff --git a/src/lib/adafruit_bitmap_font/glyph_cache.py b/src/lib/adafruit_bitmap_font/glyph_cache.py
index 6a8f1a0..2933f89 100644
--- a/src/lib/adafruit_bitmap_font/glyph_cache.py
+++ b/src/lib/adafruit_bitmap_font/glyph_cache.py
@@ -30,7 +30,7 @@
 
 import gc
 
-__version__ = "2.1.0"
+__version__ = "2.1.3"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font.git"
 
 
diff --git a/src/lib/adafruit_bus_device/i2c_device.py b/src/lib/adafruit_bus_device/i2c_device.py
index 8f6172b..c605290 100644
--- a/src/lib/adafruit_bus_device/i2c_device.py
+++ b/src/lib/adafruit_bus_device/i2c_device.py
@@ -20,7 +20,7 @@
     pass
 
 
-__version__ = "5.2.7"
+__version__ = "5.2.10"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BusDevice.git"
 
 
diff --git a/src/lib/adafruit_bus_device/spi_device.py b/src/lib/adafruit_bus_device/spi_device.py
index 1c599e0..60954e0 100644
--- a/src/lib/adafruit_bus_device/spi_device.py
+++ b/src/lib/adafruit_bus_device/spi_device.py
@@ -22,7 +22,7 @@
     pass
 
 
-__version__ = "5.2.7"
+__version__ = "5.2.10"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BusDevice.git"
 
 
@@ -89,7 +89,7 @@ def __init__(
         self.chip_select = chip_select
         self.cs_active_value = cs_active_value
         if self.chip_select:
-            self.chip_select.switch_to_output(value=True)
+            self.chip_select.switch_to_output(value=not self.cs_active_value)
 
     def __enter__(self) -> SPI:
         while not self.spi.try_lock():
diff --git a/src/lib/adafruit_connection_manager.mpy b/src/lib/adafruit_connection_manager.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..002d5cd8538342456ab2f6a200fa11ca3a85fb73
GIT binary patch
literal 3541
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%0DWa1r0|7+=sc*&}i)
zfU@~pN9?^m%Utn+(T+>n0o3pL;)71@I|9Ppje7>Bi>?P}ZU?<C=ZMP%M78sP5~Fy*
z(WN$0LxTg5KA4Fo5YR||n1R6Xk8}*4<bpaXFc!f<Y!R^f?cO)RsF6#0<d?Vq^wpjm
zjK_-~30rrd1`j-PkHcAXIb9>6!LoDE8FjnDgJrj)JnSsHLkILUUOs>l*Bko>p7!UD
zfWwb;0iKW2-#^xf%xOd(1Chrp@V1cd{dyzN2K4u_#4#OOe)^D}Jqkxbp=ZFT)_J+!
zkl{@@1MPD9hZ#yCV_(-BhYybe9p5YD%%jHvBY<gT#S5Oc7c>h4K1bhF$V*V&H%I4T
z_<y(lZ`t6vc$0fjkj;+i=<vvJbk-4aJ4Rv(J*|uyo`j-!h8znZRZolGz<PW?5iovx
zpv_pp(Fp_($V=Ge<-iWg*2AGtKfXfxKy=?7(#!ZN={tmQn4Q)l15VWvQa%OQRr`A<
aZa(<pwrfPeGtkEvPQs|+86^Y1H2Xj2199X4

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_display_text/__init__.py b/src/lib/adafruit_display_text/__init__.py
index 39a83cf..7a46cba 100644
--- a/src/lib/adafruit_display_text/__init__.py
+++ b/src/lib/adafruit_display_text/__init__.py
@@ -7,7 +7,7 @@
 =======================
 """
 
-__version__ = "3.0.5"
+__version__ = "3.2.0"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git"
 
 from displayio import Group, Palette
@@ -246,7 +246,6 @@ def __init__(
         tab_replacement: Tuple[int, str] = (4, " "),
         label_direction: str = "LTR",
         verbose: bool = False,
-        **kwargs,  # pylint: disable=unused-argument
     ) -> None:
         # pylint: disable=too-many-arguments, too-many-locals
 
@@ -271,9 +270,6 @@ def __init__(
         self._tab_text = self._tab_replacement[1] * self._tab_replacement[0]
         self._verbose = verbose
 
-        if "max_glyphs" in kwargs:
-            print("Please update your code: 'max_glyphs' is not needed anymore.")
-
         self._ascent, self._descent = self._get_ascent_descent()
         self._bounding_box = None
 
@@ -428,12 +424,12 @@ def bounding_box(self) -> Tuple[int, int]:
     @property
     def height(self) -> int:
         """The height of the label determined from the bounding box."""
-        return self._bounding_box[3] - self._bounding_box[1]
+        return self._bounding_box[3]
 
     @property
     def width(self) -> int:
         """The width of the label determined from the bounding box."""
-        return self._bounding_box[2] - self._bounding_box[0]
+        return self._bounding_box[2]
 
     @property
     def line_spacing(self) -> float:
diff --git a/src/lib/adafruit_display_text/bitmap_label.py b/src/lib/adafruit_display_text/bitmap_label.py
index 8b78661..514ae69 100644
--- a/src/lib/adafruit_display_text/bitmap_label.py
+++ b/src/lib/adafruit_display_text/bitmap_label.py
@@ -23,7 +23,7 @@
 
 """
 
-__version__ = "3.0.5"
+__version__ = "3.2.0"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git"
 
 import displayio
@@ -183,6 +183,10 @@ def _reset_text(
             if self._background_tight:
                 box_y = tight_box_y
                 y_offset = tight_y_offset
+                self._padding_left = 0
+                self._padding_right = 0
+                self._padding_top = 0
+                self._padding_bottom = 0
 
             else:  # calculate the box size for a loose background
                 box_y = loose_box_y
@@ -288,15 +292,18 @@ def _line_spacing_ypixels(font: FontProtocol, line_spacing: float) -> int:
     def _text_bounding_box(
         self, text: str, font: FontProtocol
     ) -> Tuple[int, int, int, int, int, int]:
-        # pylint: disable=too-many-locals
+        # pylint: disable=too-many-locals,too-many-branches
 
-        ascender_max, descender_max = self._ascent, self._descent
+        bbox = font.get_bounding_box()
+        if len(bbox) == 4:
+            ascender_max, descender_max = bbox[1], -bbox[3]
+        else:
+            ascender_max, descender_max = self._ascent, self._descent
 
         lines = 1
 
-        xposition = (
-            x_start
-        ) = yposition = y_start = 0  # starting x and y position (left margin)
+        # starting x and y position (left margin)
+        xposition = x_start = yposition = y_start = 0
 
         left = None
         right = x_start
diff --git a/src/lib/adafruit_display_text/label.py b/src/lib/adafruit_display_text/label.py
index 09e6d22..7dd64a2 100644
--- a/src/lib/adafruit_display_text/label.py
+++ b/src/lib/adafruit_display_text/label.py
@@ -22,7 +22,7 @@
 
 """
 
-__version__ = "3.0.5"
+__version__ = "3.2.0"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git"
 
 
diff --git a/src/lib/adafruit_display_text/outlined_label.py b/src/lib/adafruit_display_text/outlined_label.py
new file mode 100644
index 0000000..050ceb9
--- /dev/null
+++ b/src/lib/adafruit_display_text/outlined_label.py
@@ -0,0 +1,188 @@
+# SPDX-FileCopyrightText: 2023 Tim C
+#
+# SPDX-License-Identifier: MIT
+
+"""
+`adafruit_display_text.outlined_label`
+====================================================
+
+Subclass of BitmapLabel that adds outline color and stroke size
+functionalities.
+
+* Author(s): Tim Cocks
+
+Implementation Notes
+--------------------
+
+**Hardware:**
+
+**Software and Dependencies:**
+
+* Adafruit CircuitPython firmware for the supported boards:
+  https://circuitpython.org/downloads
+
+"""
+__version__ = "3.2.0"
+__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git"
+
+import bitmaptools
+from displayio import Palette, Bitmap
+from adafruit_display_text import bitmap_label
+
+try:
+    from typing import Optional, Tuple, Union
+    from fontio import FontProtocol
+except ImportError:
+    pass
+
+
+class OutlinedLabel(bitmap_label.Label):
+    """
+    OutlinedLabel - A BitmapLabel subclass that includes arguments and properties for specifying
+    outline_size and outline_color to get drawn as a stroke around the text.
+
+    :param Union[Tuple, int] outline_color: The color of the outline stroke as RGB tuple, or hex.
+    :param int outline_size: The size in pixels of the outline stroke.
+
+    """
+
+    # pylint: disable=too-many-arguments
+    def __init__(
+        self,
+        font,
+        outline_color: Union[int, Tuple] = 0x999999,
+        outline_size: int = 1,
+        padding_top: Optional[int] = None,
+        padding_bottom: Optional[int] = None,
+        padding_left: Optional[int] = None,
+        padding_right: Optional[int] = None,
+        **kwargs
+    ):
+        if padding_top is None:
+            padding_top = outline_size + 0
+        if padding_bottom is None:
+            padding_bottom = outline_size + 2
+        if padding_left is None:
+            padding_left = outline_size + 0
+        if padding_right is None:
+            padding_right = outline_size + 0
+
+        super().__init__(
+            font,
+            padding_top=padding_top,
+            padding_bottom=padding_bottom,
+            padding_left=padding_left,
+            padding_right=padding_right,
+            **kwargs
+        )
+
+        _background_color = self._palette[0]
+        _foreground_color = self._palette[1]
+        _background_is_transparent = self._palette.is_transparent(0)
+        self._palette = Palette(3)
+        self._palette[0] = _background_color
+        self._palette[1] = _foreground_color
+        self._palette[2] = outline_color
+        if _background_is_transparent:
+            self._palette.make_transparent(0)
+
+        self._outline_size = outline_size
+        self._stamp_source = Bitmap((outline_size * 2) + 1, (outline_size * 2) + 1, 3)
+        self._stamp_source.fill(2)
+
+        self._bitmap = None
+
+        self._reset_text(
+            font=font,
+            text=self._text,
+            line_spacing=self._line_spacing,
+            scale=self.scale,
+        )
+
+    def _add_outline(self):
+        """
+        Blit the outline into the labels Bitmap. We will stamp self._stamp_source for each
+        pixel of the foreground color but skip the foreground color when we blit.
+        :return: None
+        """
+        if hasattr(self, "_stamp_source"):
+            for y in range(self.bitmap.height):
+                for x in range(self.bitmap.width):
+                    if self.bitmap[x, y] == 1:
+                        try:
+                            bitmaptools.blit(
+                                self.bitmap,
+                                self._stamp_source,
+                                x - self._outline_size,
+                                y - self._outline_size,
+                                skip_dest_index=1,
+                            )
+                        except ValueError as value_error:
+                            raise ValueError(
+                                "Padding must be big enough to fit outline_size "
+                                "all the way around the text. "
+                                "Try using either larger padding sizes, or smaller outline_size."
+                            ) from value_error
+
+    def _place_text(
+        self,
+        bitmap: Bitmap,
+        text: str,
+        font: FontProtocol,
+        xposition: int,
+        yposition: int,
+        skip_index: int = 0,  # set to None to write all pixels, other wise skip this palette index
+        # when copying glyph bitmaps (this is important for slanted text
+        # where rectangular glyph boxes overlap)
+    ) -> Tuple[int, int, int, int]:
+        """
+        Copy the glpyphs that represent the value of the string into the labels Bitmap.
+        :param bitmap: The bitmap to place text into
+        :param text: The text to render
+        :param font: The font to render the text in
+        :param xposition: x location of the starting point within the bitmap
+        :param yposition: y location of the starting point within the bitmap
+        :param skip_index: Color index to skip during rendering instead of covering up
+        :return Tuple bounding_box: tuple with x, y, width, height values of the bitmap
+        """
+        parent_result = super()._place_text(
+            bitmap, text, font, xposition, yposition, skip_index=skip_index
+        )
+
+        self._add_outline()
+
+        return parent_result
+
+    @property
+    def outline_color(self):
+        """Color of the outline to draw around the text."""
+        return self._palette[2]
+
+    @outline_color.setter
+    def outline_color(self, new_outline_color):
+        self._palette[2] = new_outline_color
+
+    @property
+    def outline_size(self):
+        """Stroke size of the outline to draw around the text."""
+        return self._outline_size
+
+    @outline_size.setter
+    def outline_size(self, new_outline_size):
+        self._outline_size = new_outline_size
+
+        self._padding_top = new_outline_size + 0
+        self._padding_bottom = new_outline_size + 2
+        self._padding_left = new_outline_size + 0
+        self._padding_right = new_outline_size + 0
+
+        self._stamp_source = Bitmap(
+            (new_outline_size * 2) + 1, (new_outline_size * 2) + 1, 3
+        )
+        self._stamp_source.fill(2)
+        self._reset_text(
+            font=self._font,
+            text=self._text,
+            line_spacing=self._line_spacing,
+            scale=self.scale,
+        )
diff --git a/src/lib/adafruit_display_text/scrolling_label.py b/src/lib/adafruit_display_text/scrolling_label.py
index f65125d..b4e4e0a 100644
--- a/src/lib/adafruit_display_text/scrolling_label.py
+++ b/src/lib/adafruit_display_text/scrolling_label.py
@@ -23,10 +23,10 @@
 
 """
 
-__version__ = "3.0.5"
+__version__ = "3.2.0"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git"
 
-import time
+import adafruit_ticks
 from adafruit_display_text import bitmap_label
 
 try:
@@ -66,7 +66,7 @@ def __init__(
         self._last_animate_time = -1
         self.max_characters = max_characters
 
-        if text[-1] != " ":
+        if text and text[-1] != " ":
             text = "{} ".format(text)
         self._full_text = text
 
@@ -81,10 +81,13 @@ def update(self, force: bool = False) -> None:
          Default is False.
         :return: None
         """
-        _now = time.monotonic()
-        if force or self._last_animate_time + self.animate_time <= _now:
+        _now = adafruit_ticks.ticks_ms()
+        if force or adafruit_ticks.ticks_less(
+            self._last_animate_time + int(self.animate_time * 1000), _now
+        ):
             if len(self.full_text) <= self.max_characters:
-                super()._set_text(self.full_text, self.scale)
+                if self._text != self.full_text:
+                    super()._set_text(self.full_text, self.scale)
                 self._last_animate_time = _now
                 return
 
@@ -120,10 +123,10 @@ def current_index(self) -> int:
 
     @current_index.setter
     def current_index(self, new_index: int) -> None:
-        if new_index < len(self.full_text):
-            self._current_index = new_index
-        else:
+        if self.full_text:
             self._current_index = new_index % len(self.full_text)
+        else:
+            self._current_index = 0
 
     @property
     def full_text(self) -> str:
@@ -136,11 +139,12 @@ def full_text(self) -> str:
 
     @full_text.setter
     def full_text(self, new_text: str) -> None:
-        if new_text[-1] != " ":
+        if new_text and new_text[-1] != " ":
             new_text = "{} ".format(new_text)
-        self._full_text = new_text
-        self.current_index = 0
-        self.update()
+        if new_text != self._full_text:
+            self._full_text = new_text
+            self.current_index = 0
+            self.update(True)
 
     @property
     def text(self):
diff --git a/src/lib/adafruit_display_text/text_box.py b/src/lib/adafruit_display_text/text_box.py
new file mode 100644
index 0000000..58f668b
--- /dev/null
+++ b/src/lib/adafruit_display_text/text_box.py
@@ -0,0 +1,435 @@
+# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+
+"""
+`adafruit_display_text.text_box`
+================================================================================
+
+Text graphics handling for CircuitPython, including text boxes
+
+
+* Author(s): Tim Cocks
+
+Implementation Notes
+--------------------
+
+**Hardware:**
+
+**Software and Dependencies:**
+
+* Adafruit CircuitPython firmware for the supported boards:
+  https://circuitpython.org/downloads
+
+"""
+
+__version__ = "3.2.0"
+__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git"
+
+import displayio
+from micropython import const
+
+from adafruit_display_text import wrap_text_to_pixels
+from adafruit_display_text import bitmap_label
+
+try:
+    from typing import Optional, Tuple
+    from fontio import FontProtocol
+except ImportError:
+    pass
+
+
+# pylint: disable=too-many-instance-attributes, duplicate-code
+class TextBox(bitmap_label.Label):
+    """
+    TextBox has a constrained width and optionally height.
+    You set the desired size when it's initialized it
+    will automatically wrap text to fit it within the allotted
+    size.
+
+    Left, Right, and Center alignment of the text within the
+    box are supported.
+
+    :param font: The font to use for the TextBox.
+    :param width: The width of the TextBox in pixels.
+    :param height: The height of the TextBox in pixels.
+    :param align: How to align the text within the box,
+      valid values are ``ALIGN_LEFT``, ``ALIGN_CENTER``, ``ALIGN_RIGHT``.
+    """
+
+    ALIGN_LEFT = const(0)
+    ALIGN_CENTER = const(1)
+    ALIGN_RIGHT = const(2)
+
+    DYNAMIC_HEIGHT = const(-1)
+
+    def __init__(
+        self, font: FontProtocol, width: int, height: int, align=ALIGN_LEFT, **kwargs
+    ) -> None:
+        self._bitmap = None
+        self._tilegrid = None
+        self._prev_label_direction = None
+        self._width = width
+
+        if height != TextBox.DYNAMIC_HEIGHT:
+            self._height = height
+            self.dynamic_height = False
+        else:
+            self.dynamic_height = True
+
+        if align not in (TextBox.ALIGN_LEFT, TextBox.ALIGN_CENTER, TextBox.ALIGN_RIGHT):
+            raise ValueError(
+                "Align must be one of: ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT"
+            )
+        self._align = align
+
+        self._padding_left = kwargs.get("padding_left", 0)
+        self._padding_right = kwargs.get("padding_right", 0)
+
+        self.lines = wrap_text_to_pixels(
+            kwargs.get("text", ""),
+            self._width - self._padding_left - self._padding_right,
+            font,
+        )
+
+        super(bitmap_label.Label, self).__init__(font, **kwargs)
+
+        print(f"before reset: {self._text}")
+
+        self._text = "\n".join(self.lines)
+        self._text = self._replace_tabs(self._text)
+        self._original_text = self._text
+
+        # call the text updater with all the arguments.
+        self._reset_text(
+            font=font,
+            text=self._text,
+            line_spacing=self._line_spacing,
+            scale=self.scale,
+        )
+        print(f"after reset: {self._text}")
+
+    def _place_text(
+        self,
+        bitmap: displayio.Bitmap,
+        text: str,
+        font: FontProtocol,
+        xposition: int,
+        yposition: int,
+        skip_index: int = 0,  # set to None to write all pixels, other wise skip this palette index
+        # when copying glyph bitmaps (this is important for slanted text
+        # where rectangular glyph boxes overlap)
+    ) -> Tuple[int, int, int, int]:
+        # pylint: disable=too-many-arguments, too-many-locals, too-many-statements, too-many-branches
+
+        # placeText - Writes text into a bitmap at the specified location.
+        #
+        # Note: scale is pushed up to Group level
+        original_xposition = xposition
+        cur_line_index = 0
+        cur_line_width = self._text_bounding_box(self.lines[0], self.font)[0]
+
+        if self.align == self.ALIGN_LEFT:
+            x_start = original_xposition  # starting x position (left margin)
+        if self.align == self.ALIGN_CENTER:
+            unused_space = self._width - cur_line_width
+            x_start = original_xposition + unused_space // 2
+        if self.align == self.ALIGN_RIGHT:
+            unused_space = self._width - cur_line_width
+            x_start = original_xposition + unused_space - self._padding_right
+
+        xposition = x_start  # pylint: disable=used-before-assignment
+
+        y_start = yposition
+        # print(f"start loc {x_start}, {y_start}")
+
+        left = None
+        right = x_start
+        top = bottom = y_start
+        line_spacing = self._line_spacing
+
+        # print(f"cur_line width: {cur_line_width}")
+        for char in text:
+            if char == "\n":  # newline
+                cur_line_index += 1
+                cur_line_width = self._text_bounding_box(
+                    self.lines[cur_line_index], self.font
+                )[0]
+                # print(f"cur_line width: {cur_line_width}")
+                if self.align == self.ALIGN_LEFT:
+                    x_start = original_xposition  # starting x position (left margin)
+                if self.align == self.ALIGN_CENTER:
+                    unused_space = self._width - cur_line_width
+                    x_start = original_xposition + unused_space // 2
+                if self.align == self.ALIGN_RIGHT:
+                    unused_space = self._width - cur_line_width
+                    x_start = original_xposition + unused_space - self._padding_right
+                xposition = x_start
+
+                yposition = yposition + self._line_spacing_ypixels(
+                    font, line_spacing
+                )  # Add a newline
+
+            else:
+                my_glyph = font.get_glyph(ord(char))
+
+                if my_glyph is None:  # Error checking: no glyph found
+                    print("Glyph not found: {}".format(repr(char)))
+                else:
+                    if xposition == x_start:
+                        if left is None:
+                            left = 0
+                        else:
+                            left = min(left, my_glyph.dx)
+
+                    right = max(
+                        right,
+                        xposition + my_glyph.shift_x,
+                        xposition + my_glyph.width + my_glyph.dx,
+                    )
+                    if yposition == y_start:  # first line, find the Ascender height
+                        top = min(top, -my_glyph.height - my_glyph.dy)
+                    bottom = max(bottom, yposition - my_glyph.dy)
+
+                    glyph_offset_x = (
+                        my_glyph.tile_index * my_glyph.width
+                    )  # for type BuiltinFont, this creates the x-offset in the glyph bitmap.
+                    # for BDF loaded fonts, this should equal 0
+
+                    y_blit_target = yposition - my_glyph.height - my_glyph.dy
+
+                    # Clip glyph y-direction if outside the font ascent/descent metrics.
+                    # Note: bitmap.blit will automatically clip the bottom of the glyph.
+                    y_clip = 0
+                    if y_blit_target < 0:
+                        y_clip = -y_blit_target  # clip this amount from top of bitmap
+                        y_blit_target = 0  # draw the clipped bitmap at y=0
+                        if self._verbose:
+                            print(
+                                'Warning: Glyph clipped, exceeds Ascent property: "{}"'.format(
+                                    char
+                                )
+                            )
+
+                    if (y_blit_target + my_glyph.height) > bitmap.height:
+                        if self._verbose:
+                            print(
+                                'Warning: Glyph clipped, exceeds descent property: "{}"'.format(
+                                    char
+                                )
+                            )
+                    try:
+                        self._blit(
+                            bitmap,
+                            max(xposition + my_glyph.dx, 0),
+                            y_blit_target,
+                            my_glyph.bitmap,
+                            x_1=glyph_offset_x,
+                            y_1=y_clip,
+                            x_2=glyph_offset_x + my_glyph.width,
+                            y_2=my_glyph.height,
+                            skip_index=skip_index,  # do not copy over any 0 background pixels
+                        )
+                    except ValueError:
+                        # ignore index out of bounds error
+                        break
+
+                    xposition = xposition + my_glyph.shift_x
+
+        # bounding_box
+        return left, top, right - left, bottom - top
+
+    def _reset_text(
+        self,
+        font: Optional[FontProtocol] = None,
+        text: Optional[str] = None,
+        line_spacing: Optional[float] = None,
+        scale: Optional[int] = None,
+    ) -> None:
+        # pylint: disable=too-many-branches, too-many-statements, too-many-locals
+
+        # Store all the instance variables
+        if font is not None:
+            self._font = font
+        if line_spacing is not None:
+            self._line_spacing = line_spacing
+
+        # if text is not provided as a parameter (text is None), use the previous value.
+        if text is None:
+            text = self._text
+
+        self._text = self._replace_tabs(text)
+        print(f"inside reset_text text: {text}")
+
+        # Check for empty string
+        if (text == "") or (
+            text is None
+        ):  # If empty string, just create a zero-sized bounding box and that's it.
+            self._bounding_box = (
+                0,
+                0,
+                0,  # zero width with text == ""
+                0,  # zero height with text == ""
+            )
+            # Clear out any items in the self._local_group Group, in case this is an
+            # update to the bitmap_label
+            for _ in self._local_group:
+                self._local_group.pop(0)
+
+            # Free the bitmap and tilegrid since they are removed
+            self._bitmap = None
+            self._tilegrid = None
+
+        else:  # The text string is not empty, so create the Bitmap and TileGrid and
+            # append to the self Group
+
+            # Calculate the text bounding box
+
+            # Calculate both "tight" and "loose" bounding box dimensions to match label for
+            # anchor_position calculations
+            (
+                box_x,
+                tight_box_y,
+                x_offset,
+                tight_y_offset,
+                loose_box_y,
+                loose_y_offset,
+            ) = self._text_bounding_box(
+                text,
+                self._font,
+            )  # calculate the box size for a tight and loose backgrounds
+
+            if self._background_tight:
+                box_y = tight_box_y
+                y_offset = tight_y_offset
+                self._padding_left = 0
+                self._padding_right = 0
+                self._padding_top = 0
+                self._padding_bottom = 0
+
+            else:  # calculate the box size for a loose background
+                box_y = loose_box_y
+                y_offset = loose_y_offset
+
+            # Calculate the background size including padding
+            tight_box_x = box_x
+            box_x = box_x + self._padding_left + self._padding_right
+            box_y = box_y + self._padding_top + self._padding_bottom
+
+            if self.dynamic_height:
+                print(f"dynamic height, box_y: {box_y}")
+                self._height = box_y
+
+            # Create the Bitmap unless it can be reused
+            new_bitmap = None
+            if (
+                self._bitmap is None
+                or self._bitmap.width != self._width
+                or self._bitmap.height != self._height
+            ):
+                new_bitmap = displayio.Bitmap(
+                    self._width, self._height, len(self._palette)
+                )
+                self._bitmap = new_bitmap
+            else:
+                self._bitmap.fill(0)
+
+            # Place the text into the Bitmap
+            self._place_text(
+                self._bitmap,
+                text,
+                self._font,
+                self._padding_left - x_offset,
+                self._padding_top + y_offset,
+            )
+
+            if self._base_alignment:
+                label_position_yoffset = 0
+            else:
+                label_position_yoffset = self._ascent // 2
+
+            # Create the TileGrid if not created bitmap unchanged
+            if self._tilegrid is None or new_bitmap:
+                self._tilegrid = displayio.TileGrid(
+                    self._bitmap,
+                    pixel_shader=self._palette,
+                    width=1,
+                    height=1,
+                    tile_width=self._width,
+                    tile_height=self._height,
+                    default_tile=0,
+                    x=-self._padding_left + x_offset,
+                    y=label_position_yoffset - y_offset - self._padding_top,
+                )
+                # Clear out any items in the local_group Group, in case this is an update to
+                # the bitmap_label
+                for _ in self._local_group:
+                    self._local_group.pop(0)
+                self._local_group.append(
+                    self._tilegrid
+                )  # add the bitmap's tilegrid to the group
+
+            self._bounding_box = (
+                self._tilegrid.x + self._padding_left,
+                self._tilegrid.y + self._padding_top,
+                tight_box_x,
+                tight_box_y,
+            )
+            print(f"end of reset_text bounding box: {self._bounding_box}")
+
+        if (
+            scale is not None
+        ):  # Scale will be defined in local_group (Note: self should have scale=1)
+            self.scale = scale  # call the setter
+
+        # set the anchored_position with setter after bitmap is created, sets the
+        # x,y positions of the label
+        self.anchored_position = self._anchored_position
+
+    @property
+    def height(self) -> int:
+        """The height of the label determined from the bounding box."""
+        return self._height
+
+    @property
+    def width(self) -> int:
+        """The width of the label determined from the bounding box."""
+        return self._width
+
+    @width.setter
+    def width(self, width: int) -> None:
+        self._width = width
+        self.text = self._text
+
+    @height.setter
+    def height(self, height: int) -> None:
+        if height != TextBox.DYNAMIC_HEIGHT:
+            self._height = height
+            self.dynamic_height = False
+        else:
+            self.dynamic_height = True
+        self.text = self._text
+
+    @bitmap_label.Label.text.setter
+    def text(self, text: str) -> None:
+        self.lines = wrap_text_to_pixels(
+            text, self._width - self._padding_left - self._padding_right, self.font
+        )
+        self._text = self._replace_tabs(text)
+        self._original_text = self._text
+        self._text = "\n".join(self.lines)
+
+        self._set_text(self._text, self.scale)
+
+    @property
+    def align(self):
+        """Alignment of the text within the TextBox"""
+        return self._align
+
+    @align.setter
+    def align(self, align: int) -> None:
+        if align not in (TextBox.ALIGN_LEFT, TextBox.ALIGN_CENTER, TextBox.ALIGN_RIGHT):
+            raise ValueError(
+                "Align must be one of: ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT"
+            )
+        self._align = align
diff --git a/src/lib/adafruit_ds3231.mpy b/src/lib/adafruit_ds3231.mpy
index 2767c0f9db0ce83e2d3ce1f82db6b912f7d615f4..215d53d28bcefae1fc179d71727e42e86fda0e11 100644
GIT binary patch
literal 1225
zcmZXSTW{k;6vxMDnu{@w-Gm{e>DKEyVK=l1b-iK5f|PB71QnO0ELtLgCeGMxjM6x=
zC%cNogA*;g6-X4s6HmPCGs?d4ZTJ|xa>h-nA{;sMJLml8T*lK(pq=*w-LkDyf8sJ?
z2ZzStL3KPunaxj(X3KfvQU`r-9q&&9Vn@!ZYtSX44bFX+A?;e|J7;dd93RQcSbz!<
zQJYvp%Rfiz%Cs%!F!$U+5}S_Q(HTlWWh6o=*F!j9{)93T2~t-wqiR--10=P+<jo@S
z<na;IE*~{pElBkUQk|@--vQ@CUhY3$Jg@>1IMf^20g|Haum<kg$gxpz)jE0V+H8O}
zhe4m5x_-c*(igmv6gZ5JwwvQ4Tpb6JugB0<L{^!QZo7fiA3DSfs5=~5%=1xh=mm_7
zy{C`~Gv|El_!gV^4$708*8Nk@r_N0mfxe$OKAg@7i3E;m3JdokOs%2YhcrBtCpWFn
zFd@rLgdmwfZ(|Rrwtr8GzQ+MluU6uYU^ss=W~i|A1PnTZ6N*e@DK!2kG{{mYk9`lu
zVN*2ECg6<F{G;^`2aJt__iME?mklQUD)r85tJ_k0xVnE$*Qam~+fz31M&#-PS78Ub
z_<m0pdX2EM2hXQR<-M<(x~+zCtRif!6=OKo4dpoSdNGdUz=?<xI02lDIEj<MsfbfJ
z)%{ovJ6ma-4rLL1uN6fsLR<oVy(nR+dn`Uy-u}DQ>>dl>${YC3F2Z*o8A#5UF`Vg8
z;qsgI=b4LUSgJHCjl1yU>puVQwI_|ru|4R0*BkVnr7uLKg5Qxdcu$Gv<jWWJ7~bLZ
zGpAchDyM{X0dFhG+~x~_{U{bftQzS#)p+nHIoqz!1^jL#n1TBs5^yq<L@synOE{C?
zIH}L$xXkSze|;|Fx%_6EJD;!N+aS+h&OyE#rT76zHxMo;hlXGZxTqAfZyB+O4vjTf
zRU?iyh^_;dloCV}oH{f)Q#G+*-U}}`W3RMuV8#~ttq%P<Ef&r2x5gs7O=tHD8%47o
z{;un<7WwV=B7Y0soemu+qH2bJfavzKf9PCRa+(>wRJD?>m5#u>+k9}c$m<;S=7U96
grM<LNGQ&T6y+yW6XKDegdiWPlTVCX}I_h@lzo&v#EdT%j

literal 1229
zcmZuwU2hsk6rBaHU2Gifz-mKrs!%&PQEKC`LG(k3N(>Keq^g)&jV!gAU6!$#2-wxm
z;0X1hW2?@$>{fm1Q>CiU6?yBw>CdS8);qh4i>iRcFz4QL=H7E>ntJMb>1?pIg_dr(
zJ@+siGeLU%u6?&!2_{ZM-o68$cJtPqZ(5tQgrt%C+-|n$G4tqcZSCGAr#t4P7r_-~
zd&%ExX-hkh#ubHhnE=B2B_X6oj0+kjIYyGhAxTfLVuX1;;tt$!I2S0*0zFqy!G@}o
znDp5PNbap=#Ux;(BTJLUB9sf!WvGw&iLS*(IQ9fdnD3}H3O!s!k1*Q&tF<5x9%|@Y
zBWqV`mFmZqMaVG?L19G52C@u7LK^sl?Aw}=ZGENes--M#&(k!1zb{0<KiSziVxm9p
zRy=>WGwXWi!OY_(3qA0<JrR8njU_6;cp=(fYwy2q%JOz&yRijdwN}-yv;SRV`wRNm
z89I-hv&_q7gwa(Cs!3a@h~G1pJCAmmxOi4iS?0j!f&~5(8e-kl&lPr~$GF=aP~vls
z4F<08Lm+MLHd`%laUVSBBqNb^&03#X3!TP;!e#RoBtKBIn9qI&+1Y49Rg6u1F5#?F
zyeDh~6As6LP*q&0NHK|U;fgWGtLEw}!|J=7aO(M^9&guAXL7cRo}XOG+5eMMkyy?q
ziQI=~HZp-f|52V8S<a3|wAZPhE?5QPxdYY>T>(SHOXkwcpPm}mX1$RotS9=XMsC2n
z<dB72w2hTc{b?F_f(`=;ym3fz9!&mHnS2UoFB7;_6X@*f`B}7u299lHA&iY6^noNM
zwpP<DW9B8+@>xy=cw(mjPh;Iq!)nbPVJ}!89r~e1=g%cdIlg~D(G_LB8!f+LFDkt~
z4=p+CR}g;7Tb36n_ut!nvo8C!)U;r#mlVHSAS3i*5rBIcBcG8!H_$ZyX#@tvoUY4X
z%4PIsTF~3m!dvbVpmVn_7DK<au<>q2{;H(PKl~kuoz!q~O_#ryHg1+TZlYZzr}>TM
tKi_wzh3nBqgUvL*5+ye>xwVY^!*M{M8X->6fLi{HOPQLhb#yR0>|cu8XjlLM

diff --git a/src/lib/adafruit_imageload/__init__.py b/src/lib/adafruit_imageload/__init__.py
index d1e6d5f..1abb630 100644
--- a/src/lib/adafruit_imageload/__init__.py
+++ b/src/lib/adafruit_imageload/__init__.py
@@ -12,24 +12,25 @@
 * Author(s): Scott Shawcroft, Matt Land
 
 """
-# pylint: disable=import-outside-toplevel
 
 try:
+    from io import BufferedReader
     from typing import (
-        Tuple,
+        Iterable,
         Iterator,
-        Optional,
         List,
-        Iterable,
+        Optional,
+        Tuple,
         Union,
     )
-    from io import BufferedReader
-    from displayio import Palette, Bitmap
-    from .displayio_types import PaletteConstructor, BitmapConstructor
+
+    from displayio import Bitmap, ColorConverter, Palette
+
+    from .displayio_types import BitmapConstructor, PaletteConstructor
 except ImportError:
     pass
 
-__version__ = "1.20.1"
+__version__ = "1.23.5"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
@@ -37,8 +38,8 @@ def load(
     file_or_filename: Union[str, BufferedReader],
     *,
     bitmap: Optional[BitmapConstructor] = None,
-    palette: Optional[PaletteConstructor] = None
-) -> Tuple[Bitmap, Optional[Palette]]:
+    palette: Optional[PaletteConstructor] = None,
+) -> Tuple[Bitmap, Optional[Union[Palette, ColorConverter]]]:
     """Load pixel values (indices or colors) into a bitmap and colors into a palette.
 
     bitmap is the desired type. It must take width, height and color_depth in the constructor. It
@@ -89,4 +90,8 @@ def load(
             from . import png
 
             return png.load(file, bitmap=bitmap, palette=palette)
+        if header.startswith(b"\xff\xd8"):
+            from . import jpg
+
+            return jpg.load(file, bitmap=bitmap)
         raise RuntimeError("Unsupported image format")
diff --git a/src/lib/adafruit_imageload/bmp/__init__.py b/src/lib/adafruit_imageload/bmp/__init__.py
index 096c5ed..00487b2 100644
--- a/src/lib/adafruit_imageload/bmp/__init__.py
+++ b/src/lib/adafruit_imageload/bmp/__init__.py
@@ -12,17 +12,18 @@
 * Author(s): Scott Shawcroft, Matt Land
 
 """
-# pylint: disable=import-outside-toplevel
 
 try:
-    from typing import Tuple, Optional, Set, List
     from io import BufferedReader
-    from displayio import Palette, Bitmap
-    from ..displayio_types import PaletteConstructor, BitmapConstructor
+    from typing import List, Optional, Set, Tuple, Union
+
+    from displayio import Bitmap, ColorConverter, Palette
+
+    from ..displayio_types import BitmapConstructor, PaletteConstructor
 except ImportError:
     pass
 
-__version__ = "1.20.1"
+__version__ = "1.23.5"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
@@ -30,11 +31,12 @@ def load(
     file: BufferedReader,
     *,
     bitmap: Optional[BitmapConstructor] = None,
-    palette: Optional[PaletteConstructor] = None
-) -> Tuple[Optional[Bitmap], Optional[Palette]]:
+    palette: Optional[PaletteConstructor] = None,
+) -> Tuple[Optional[Bitmap], Optional[Union[Palette, ColorConverter]]]:
     """Loads a bmp image from the open ``file``.
 
-    Returns tuple of bitmap object and palette object.
+    Returns tuple of `displayio.Bitmap` object and
+    `displayio.Palette` object, or `displayio.ColorConverter` object.
 
     :param io.BufferedReader file: Open file handle or compatible (like `io.BytesIO`)
       with the data of a BMP file.
diff --git a/src/lib/adafruit_imageload/bmp/indexed.py b/src/lib/adafruit_imageload/bmp/indexed.py
index 7789924..044cd51 100644
--- a/src/lib/adafruit_imageload/bmp/indexed.py
+++ b/src/lib/adafruit_imageload/bmp/indexed.py
@@ -13,28 +13,29 @@
 
 """
 
-
 import sys
 
 try:
-    from typing import Tuple, Optional
     from io import BufferedReader
-    from displayio import Palette, Bitmap
-    from ..displayio_types import PaletteConstructor, BitmapConstructor
+    from typing import Optional, Tuple
+
+    from displayio import Bitmap, Palette
+
+    from ..displayio_types import BitmapConstructor, PaletteConstructor
 except ImportError:
     pass
 
 try:
     from bitmaptools import readinto as _bitmap_readinto
 except ImportError:
-    _bitmap_readinto = None  # pylint: disable=invalid-name  # type: Callable
+    _bitmap_readinto = None
 
 
-__version__ = "1.20.1"
+__version__ = "1.23.5"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
-def load(
+def load(  # noqa:  PLR0913, PLR0912, Too many arguments in function definition, Too many branches
     file: BufferedReader,
     width: int,
     height: int,
@@ -58,7 +59,6 @@ def load(
     :param BitmapConstructor bitmap: a function that returns a displayio.Bitmap
     :param PaletteConstructor palette: a function that returns a displayio.Palette
     """
-    # pylint: disable=too-many-arguments,too-many-locals,too-many-branches
     palette_obj = None
     if palette:
         palette_obj = palette(colors)
@@ -78,7 +78,6 @@ def load(
             minimum_color_depth *= 2
 
         if sys.maxsize > 1073741823:
-            # pylint: disable=import-outside-toplevel, relative-beyond-top-level
             from .negative_height_check import negative_height_check
 
             # convert unsigned int to signed int when height is negative
@@ -121,9 +120,7 @@ def load(
 
                     for x in range(width):
                         i = x // pixels_per_byte
-                        pixel = (
-                            chunk[i] >> (8 - color_depth * (x % pixels_per_byte + 1))
-                        ) & mask
+                        pixel = (chunk[i] >> (8 - color_depth * (x % pixels_per_byte + 1))) & mask
                         bitmap_obj[offset + x] = pixel
         elif compression in (1, 2):
             decode_rle(
@@ -137,7 +134,7 @@ def load(
     return bitmap_obj, palette_obj
 
 
-def decode_rle(
+def decode_rle(  # noqa: PLR0912 Too many branches
     bitmap: Bitmap,
     file: BufferedReader,
     compression: int,
@@ -145,7 +142,6 @@ def decode_rle(
     width: int,
 ) -> None:
     """Helper to decode RLE images"""
-    # pylint: disable=too-many-locals,too-many-nested-blocks,too-many-branches
 
     # RLE algorithm, either 8-bit (1) or 4-bit (2)
     #
diff --git a/src/lib/adafruit_imageload/bmp/truecolor.py b/src/lib/adafruit_imageload/bmp/truecolor.py
index 0d4af56..8f17b79 100644
--- a/src/lib/adafruit_imageload/bmp/truecolor.py
+++ b/src/lib/adafruit_imageload/bmp/truecolor.py
@@ -16,15 +16,16 @@
 import sys
 
 try:
-    from typing import Union, Optional, Tuple
     from io import BufferedReader
+    from typing import Optional, Tuple, Union
+
     from ..displayio_types import BitmapConstructor
 except ImportError:
     pass
 
-from displayio import ColorConverter, Colorspace, Bitmap
+from displayio import Bitmap, ColorConverter, Colorspace
 
-__version__ = "1.20.1"
+__version__ = "1.23.5"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 bitfield_colorspaces = (
@@ -52,7 +53,7 @@ def bitfield_format(bitfield_mask):
     return None
 
 
-def load(
+def load(  # noqa: PLR0912, PLR0913, Too many branches, Too many arguments in function definition
     file: BufferedReader,
     width: int,
     height: int,
@@ -73,7 +74,6 @@ def load(
     :param dict bitfield_masks: The bitfield masks for each color if using bitfield compression
     :param BitmapConstructor bitmap: a function that returns a displayio.Bitmap
     """
-    # pylint: disable=too-many-arguments,too-many-locals,too-many-branches
     converter_obj = None
     bitmap_obj = None
     if bitmap:
@@ -90,12 +90,11 @@ def load(
             input_colorspace = Colorspace.RGB555
         converter_obj = ColorConverter(input_colorspace=input_colorspace)
         if sys.maxsize > 1073741823:
-            # pylint: disable=import-outside-toplevel, relative-beyond-top-level
             from .negative_height_check import negative_height_check
 
             # convert unsigned int to signed int when height is negative
             height = negative_height_check(height)
-        bitmap_obj = Bitmap(width, abs(height), 65535)
+        bitmap_obj = bitmap(width, abs(height), 65535)
         file.seek(data_start)
         line_size = width * (color_depth // 8)
         # Set the seek direction based on whether the height value is negative or positive
@@ -119,19 +118,14 @@ def load(
                     color = 0
                     for byte in range(bytes_per_pixel):
                         color |= chunk[i + byte] << (8 * byte)
-                    mask = (
-                        bitfield_masks["red"]
-                        | bitfield_masks["green"]
-                        | bitfield_masks["blue"]
-                    )
+                    mask = bitfield_masks["red"] | bitfield_masks["green"] | bitfield_masks["blue"]
                     if color_depth in (24, 32):
                         mask = mask >> 8
                     pixel = color & mask
+                elif color_depth == 16:
+                    pixel = chunk[i] | chunk[i + 1] << 8
                 else:
-                    if color_depth == 16:
-                        pixel = chunk[i] | chunk[i + 1] << 8
-                    else:
-                        pixel = chunk[i + 2] << 16 | chunk[i + 1] << 8 | chunk[i]
+                    pixel = chunk[i + 2] << 16 | chunk[i + 1] << 8 | chunk[i]
                 bitmap_obj[offset + x] = converter_obj.convert(pixel)
 
     return bitmap_obj, ColorConverter(input_colorspace=Colorspace.RGB565)
diff --git a/src/lib/adafruit_imageload/displayio_types.py b/src/lib/adafruit_imageload/displayio_types.py
index 5a15243..bed5efe 100644
--- a/src/lib/adafruit_imageload/displayio_types.py
+++ b/src/lib/adafruit_imageload/displayio_types.py
@@ -13,14 +13,16 @@
 * Author(s): Matt Land
 
 """
+
 try:
     from typing import Callable
-    from displayio import Palette, Bitmap
+
+    from displayio import Bitmap, Palette
 
     PaletteConstructor = Callable[[int], Palette]
     BitmapConstructor = Callable[[int, int, int], Bitmap]
 except ImportError:
     pass
 
-__version__ = "1.20.1"
+__version__ = "1.23.5"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
diff --git a/src/lib/adafruit_imageload/gif.py b/src/lib/adafruit_imageload/gif.py
index f9a07c2..c3099fe 100644
--- a/src/lib/adafruit_imageload/gif.py
+++ b/src/lib/adafruit_imageload/gif.py
@@ -17,22 +17,21 @@
 import struct
 
 try:
-    from typing import Tuple, Iterator, Optional, List
     from io import BufferedReader
-    from displayio import Palette, Bitmap
-    from .displayio_types import PaletteConstructor, BitmapConstructor
+    from typing import Iterator, List, Optional, Tuple
+
+    from displayio import Bitmap, Palette
+
+    from .displayio_types import BitmapConstructor, PaletteConstructor
 except ImportError:
     pass
 
-__version__ = "1.20.1"
+__version__ = "1.23.5"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
 def load(
-    file: BufferedReader,
-    *,
-    bitmap: BitmapConstructor,
-    palette: Optional[PaletteConstructor] = None
+    file: BufferedReader, *, bitmap: BitmapConstructor, palette: Optional[PaletteConstructor] = None
 ) -> Tuple[Bitmap, Optional[Palette]]:
     """Loads a GIF image from the open ``file``.
 
@@ -47,9 +46,7 @@ def load(
     header = file.read(6)
     if header not in {b"GIF87a", b"GIF89a"}:
         raise ValueError("Not a GIF file")
-    width, height, flags, _, _ = struct.unpack(  # pylint: disable=no-member
-        "<HHBBB", file.read(7)
-    )
+    width, height, flags, _, _ = struct.unpack("<HHBBB", file.read(7))
     if (flags & 0x80) != 0:
         if not palette:
             raise RuntimeError("palette argument required")
@@ -78,9 +75,7 @@ def load(
 
 def _read_frame(file: BufferedReader, bitmap: Bitmap) -> None:
     """Read a single frame and apply it to the bitmap."""
-    ddx, ddy, width, _, flags = struct.unpack(  # pylint: disable=no-member
-        "<HHHHB", file.read(9)
-    )
+    ddx, ddy, width, _, flags = struct.unpack("<HHHHB", file.read(9))
     if (flags & 0x40) != 0:
         raise NotImplementedError("Interlacing not supported")
     if (flags & 0x80) != 0:
@@ -145,10 +140,7 @@ def decode(self, code: int) -> bytes:
             value = self.last + self.last[0:1]
         if self.last:
             self.codes.append(self.last + value[0:1])
-        if (
-            len(self.codes) + self.end_code + 1 >= 1 << self.code_len
-            and self.code_len < 12
-        ):
+        if len(self.codes) + self.end_code + 1 >= 1 << self.code_len and self.code_len < 12:
             self.code_len += 1
         self.last = value
         return value
@@ -159,7 +151,7 @@ def lzw_decode(data: Iterator[int], code_size: int) -> Iterator[bytes]:
     dictionary = LZWDict(code_size)
     bit = 0
     try:
-        byte = next(data)  # pylint: disable=stop-iteration-return
+        byte = next(data)
         try:
             while True:
                 code = 0
@@ -168,10 +160,10 @@ def lzw_decode(data: Iterator[int], code_size: int) -> Iterator[bytes]:
                     bit += 1
                     if bit >= 8:
                         bit = 0
-                        byte = next(data)  # pylint: disable=stop-iteration-return
+                        byte = next(data)
                 yield dictionary.decode(code)
         except EndOfData:
             while True:
-                next(data)  # pylint: disable=stop-iteration-return
+                next(data)
     except StopIteration:
         pass
diff --git a/src/lib/adafruit_imageload/jpg.py b/src/lib/adafruit_imageload/jpg.py
new file mode 100644
index 0000000..0f5d07d
--- /dev/null
+++ b/src/lib/adafruit_imageload/jpg.py
@@ -0,0 +1,57 @@
+# SPDX-FileCopyrightText: 2024  Channing Ramos
+#
+# SPDX-License-Identifier: MIT
+
+"""
+`adafruit_imageload.jpg`
+====================================================
+
+Load a JPG into a bitmap by calling the jpegio class.
+
+* Author(s): Channing Ramos
+
+"""
+
+# A separate try for jpegio. Not every board supports it and this import may fail.
+# If that happens an ImportError with a proper message needs to be raised
+try:
+    from jpegio import JpegDecoder
+except ImportError:
+    print("jpegio not supported on this board.")
+
+try:
+    from io import BufferedReader
+    from typing import Optional, Tuple
+
+    from .displayio_types import BitmapConstructor
+except ImportError:
+    pass
+
+from displayio import Bitmap, ColorConverter, Colorspace
+
+__version__ = "1.23.5"
+__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
+
+
+def load(
+    file: BufferedReader,
+    *,
+    bitmap: BitmapConstructor,
+) -> Tuple[Bitmap, Optional[ColorConverter]]:
+    """
+    Loads a JPG image from the open ''file''.
+    The JPG must be a Baseline JPG, Progressive and Lossless JPG formats are not supported.
+
+    Returns tuple of bitmap object and ColorConverter object.
+
+    :param io.BufferedReader file: Open file handle or compatible (like 'io.BytesIO')
+    :param object bitmap: Type to store bitmap data.
+     Must have API similar to 'displayio.Bitmap'. Will be skipped if None.
+     Will be skipped if None.
+    """
+    decoder = JpegDecoder()
+    width, height = decoder.open(file)
+    bitmap_obj = bitmap(width, height, 65535)
+    decoder.decode(bitmap_obj)
+
+    return bitmap_obj, ColorConverter(input_colorspace=Colorspace.RGB565_SWAPPED)
diff --git a/src/lib/adafruit_imageload/png.py b/src/lib/adafruit_imageload/png.py
index 587bf9d..55f6226 100644
--- a/src/lib/adafruit_imageload/png.py
+++ b/src/lib/adafruit_imageload/png.py
@@ -1,5 +1,6 @@
 # SPDX-FileCopyrightText: 2022 Radomir Dopieralski
 # SPDX-FileCopyrightText: 2023 Matt Land
+# SPDX-FileCopyrightText: 2024 Channing Ramos
 #
 # SPDX-License-Identifier: MIT
 
@@ -10,30 +11,29 @@
 Load pixel values (indices or colors) into a bitmap and colors into a palette
 from a PNG file.
 
-* Author(s): Radomir Dopieralski, Matt Land
+* Author(s): Radomir Dopieralski, Matt Land, Channing Ramos
 
 """
 
 try:
     from io import BufferedReader
     from typing import Optional, Tuple
-    from displayio import Palette, Bitmap
-    from .displayio_types import PaletteConstructor, BitmapConstructor
+
+    from displayio import Bitmap, Palette
+
+    from .displayio_types import BitmapConstructor, PaletteConstructor
 except ImportError:
     pass
 
 import struct
 import zlib
 
-__version__ = "1.20.1"
+__version__ = "1.23.5"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
-def load(
-    file: BufferedReader,
-    *,
-    bitmap: BitmapConstructor,
-    palette: Optional[PaletteConstructor] = None
+def load(  # noqa: PLR0912, PLR0915, Too many branches, Too many statements
+    file: BufferedReader, *, bitmap: BitmapConstructor, palette: Optional[PaletteConstructor] = None
 ) -> Tuple[Bitmap, Optional[Palette]]:
     """
     Loads a PNG image from the open ``file``.
@@ -48,7 +48,6 @@ def load(
     :param object palette: Type to store the palette. Must have API similar to
       `displayio.Palette`. Will be skipped if None.
     """
-    # pylint: disable=too-many-locals,too-many-branches
     header = file.read(8)
     if header != b"\x89PNG\r\n\x1a\n":
         raise ValueError("Not a PNG file")
@@ -86,6 +85,14 @@ def load(
                 pal = palette(pal_size)
                 for i in range(pal_size):
                     pal[i] = file.read(3)
+        elif chunk == b"tRNS":
+            if size > len(pal):
+                raise ValueError("More transparency entries than palette entries")
+            trns_data = file.read(size)
+            for i in range(len(trns_data)):
+                if trns_data[i] == 0:
+                    pal.make_transparent(i)
+            del trns_data
         elif chunk == b"IDAT":
             data.extend(file.read(size))
         elif chunk == b"IEND":
@@ -94,15 +101,84 @@ def load(
             file.seek(size, 1)  # skip unknown chunks
         file.seek(4, 1)  # skip CRC
     data_bytes = zlib.decompress(data)
-    bmp = bitmap(width, height, 1 << depth)
-    scanline = (width * depth + 7) // 8
-    mem = memoryview(bmp)
+    unit = (1, 0, 3, 1, 2, 0, 4)[mode]
+    scanline = (width * depth * unit + 7) // 8
+    if mode == 3:  # indexed
+        bmp = bitmap(width, height, 1 << depth)
+        pixels_per_byte = 8 // depth
+        src = 1
+        src_b = 1
+        pixmask = (1 << depth) - 1
+        for y in range(height):
+            for x in range(0, width, pixels_per_byte):
+                byte = data_bytes[src_b]
+                for pixel in range(pixels_per_byte):
+                    bmp[x + pixel, y] = (byte >> ((pixels_per_byte - pixel - 1) * depth)) & pixmask
+                src_b += 1
+            src += scanline + 1
+            src_b = src
+        return bmp, pal
+    # RGB, RGBA or Grayscale
+    import displayio
+
+    if depth != 8:
+        raise ValueError("Must be 8bit depth.")
+    pal = displayio.ColorConverter(input_colorspace=displayio.Colorspace.RGB888)
+    bmp = bitmap(width, height, 65536)
+    prev = bytearray(scanline)
+    line = bytearray(scanline)
     for y in range(height):
-        dst = y * scanline
-        src = y * (scanline + 1) + 1
-        filter_ = data_bytes[src - 1]
+        src = y * (scanline + 1)
+        filter_ = data_bytes[src]
+        src += 1
         if filter_ == 0:
-            mem[dst : dst + scanline] = data_bytes[src : src + scanline]
+            line[0:scanline] = data_bytes[src : src + scanline]
+        elif filter_ == 1:  # sub
+            for i in range(scanline):
+                a = line[i - unit] if i >= unit else 0
+                line[i] = (data_bytes[src] + a) & 0xFF
+                src += 1
+        elif filter_ == 2:  # up
+            for i in range(scanline):
+                b = prev[i]
+                line[i] = (data_bytes[src] + b) & 0xFF
+                src += 1
+        elif filter_ == 3:  # average
+            for i in range(scanline):
+                a = line[i - unit] if i >= unit else 0
+                b = prev[i]
+                line[i] = (data_bytes[src] + ((a + b) >> 1)) & 0xFF
+                src += 1
+        elif filter_ == 4:  # paeth
+            for i in range(scanline):
+                a = line[i - unit] if i >= unit else 0
+                b = prev[i]
+                c = prev[i - unit] if i >= unit else 0
+                p = a + b - c
+                pa = abs(p - a)
+                pb = abs(p - b)
+                pc = abs(p - c)
+                if pa <= pb and pa <= pc:
+                    p = a
+                elif pb <= pc:
+                    p = b
+                else:
+                    p = c
+                line[i] = (data_bytes[src] + p) & 0xFF
+                src += 1
+        else:
+            raise ValueError("Wrong filter.")
+        prev, line = line, prev
+        if mode in (0, 4):  # grayscale
+            for x in range(width):
+                c = line[x * unit]
+                bmp[x, y] = pal.convert((c << 16) | (c << 8) | c)
+        elif mode in {2, 6}:  # rgb
+            for x in range(width):
+                bmp[x, y] = pal.convert(
+                    (line[x * unit + 0] << 16) | (line[x * unit + 1] << 8) | line[x * unit + 2]
+                )
         else:
-            raise NotImplementedError("Filters not supported")
+            raise ValueError("Unsupported color mode.")
+    pal = displayio.ColorConverter(input_colorspace=displayio.Colorspace.RGB565)
     return bmp, pal
diff --git a/src/lib/adafruit_imageload/pnm/__init__.py b/src/lib/adafruit_imageload/pnm/__init__.py
index d78e9aa..971da14 100644
--- a/src/lib/adafruit_imageload/pnm/__init__.py
+++ b/src/lib/adafruit_imageload/pnm/__init__.py
@@ -14,34 +14,35 @@
 * Author(s): Matt Land, Brooke Storm, Sam McGahan
 
 """
-# pylint: disable=import-outside-toplevel
 
 try:
+    from io import BufferedReader
     from typing import (
-        Tuple,
+        Callable,
+        Iterable,
         Iterator,
-        Optional,
         List,
-        Iterable,
+        Optional,
+        Tuple,
         Union,
-        Callable,
     )
-    from io import BufferedReader
-    from displayio import Palette, Bitmap
-    from ..displayio_types import PaletteConstructor, BitmapConstructor
+
+    from displayio import Bitmap, Palette
+
+    from ..displayio_types import BitmapConstructor, PaletteConstructor
 except ImportError:
     pass
 
-__version__ = "1.20.1"
+__version__ = "1.23.5"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
-def load(
+def load(  # noqa: PLR0912 Too many branches
     file: BufferedReader,
     header: bytes,
     *,
     bitmap: Optional[BitmapConstructor] = None,
-    palette: Optional[PaletteConstructor] = None
+    palette: Optional[PaletteConstructor] = None,
 ) -> Tuple[Optional[Bitmap], Optional[Palette]]:
     """
     Scan for netpbm format info, skip over comments, and delegate to a submodule
@@ -50,7 +51,6 @@ def load(
     All other formats have three: width, height, and max color value.
     This load function will move the file stream pointer to the start of data in all cases.
     """
-    # pylint: disable=too-many-branches
     magic_number = header[:2]
     file.seek(2)
     pnm_header = []  # type: List[int]
@@ -100,7 +100,7 @@ def load(
             palette_obj = None
             if palette:
                 palette_obj = palette(1)
-                palette_obj[0] = b"\xFF\xFF\xFF"
+                palette_obj[0] = b"\xff\xff\xff"
             if magic_number.startswith(b"P1"):
                 from . import pbm_ascii
 
@@ -124,7 +124,8 @@ def load(
 
         next_byte = file.read(1)
         if next_byte == b"":
-            raise RuntimeError("Unsupported image format {!r}".format(magic_number))
+            # mpy-cross does not support !r in f-string substitution, so ignore ruff rule
+            raise RuntimeError("Unsupported image format {!r}".format(magic_number))  # noqa: UP032, f-string
         if next_byte == b"#":  # comment found, seek until a newline or EOF is found
             while file.read(1) not in [b"", b"\n"]:  # EOF or NL
                 pass
diff --git a/src/lib/adafruit_imageload/pnm/pbm_ascii.py b/src/lib/adafruit_imageload/pnm/pbm_ascii.py
index e777f1d..72eefd4 100644
--- a/src/lib/adafruit_imageload/pnm/pbm_ascii.py
+++ b/src/lib/adafruit_imageload/pnm/pbm_ascii.py
@@ -17,13 +17,14 @@
 """
 
 try:
-    from typing import Tuple, Optional
     from io import BufferedReader
-    from displayio import Palette, Bitmap
+    from typing import Optional, Tuple
+
+    from displayio import Bitmap, Palette
 except ImportError:
     pass
 
-__version__ = "1.20.1"
+__version__ = "1.23.5"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
diff --git a/src/lib/adafruit_imageload/pnm/pbm_binary.py b/src/lib/adafruit_imageload/pnm/pbm_binary.py
index 18beec4..1d52a8e 100644
--- a/src/lib/adafruit_imageload/pnm/pbm_binary.py
+++ b/src/lib/adafruit_imageload/pnm/pbm_binary.py
@@ -15,14 +15,16 @@
 * Author(s):  Matt Land, Brooke Storm, Sam McGahan
 
 """
+
 try:
-    from typing import Tuple, Optional, Iterator
     from io import BufferedReader
-    from displayio import Palette, Bitmap
+    from typing import Iterator, Optional, Tuple
+
+    from displayio import Bitmap, Palette
 except ImportError:
     pass
 
-__version__ = "1.20.1"
+__version__ = "1.23.5"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
diff --git a/src/lib/adafruit_imageload/pnm/pgm/__init__.py b/src/lib/adafruit_imageload/pnm/pgm/__init__.py
index 3ed43f7..8acefb5 100644
--- a/src/lib/adafruit_imageload/pnm/pgm/__init__.py
+++ b/src/lib/adafruit_imageload/pnm/pgm/__init__.py
@@ -14,12 +14,14 @@
 * Author(s): Matt Land, Brooke Storm, Sam McGahan
 
 """
-# pylint: disable=import-outside-toplevel
+
 try:
-    from typing import Tuple, Optional, Set, List
     from io import BufferedReader
-    from displayio import Palette, Bitmap
-    from ...displayio_types import PaletteConstructor, BitmapConstructor
+    from typing import List, Optional, Set, Tuple
+
+    from displayio import Bitmap, Palette
+
+    from ...displayio_types import BitmapConstructor, PaletteConstructor
 except ImportError:
     pass
 
@@ -30,7 +32,7 @@ def load(
     header: List[int],
     *,
     bitmap: Optional[BitmapConstructor] = None,
-    palette: Optional[PaletteConstructor] = None
+    palette: Optional[PaletteConstructor] = None,
 ) -> Tuple[Optional[Bitmap], Optional[Palette]]:
     """
     Perform the load of Netpbm greyscale images (P2, P5)
diff --git a/src/lib/adafruit_imageload/pnm/pgm/ascii.py b/src/lib/adafruit_imageload/pnm/pgm/ascii.py
index 097665f..7c597ca 100644
--- a/src/lib/adafruit_imageload/pnm/pgm/ascii.py
+++ b/src/lib/adafruit_imageload/pnm/pgm/ascii.py
@@ -14,11 +14,14 @@
 * Author(s): Matt Land, Brooke Storm, Sam McGahan
 
 """
+
 try:
-    from typing import Tuple, Set, Optional
     from io import BufferedReader
-    from displayio import Palette, Bitmap
-    from ...displayio_types import PaletteConstructor, BitmapConstructor
+    from typing import Optional, Set, Tuple
+
+    from displayio import Bitmap, Palette
+
+    from ...displayio_types import BitmapConstructor, PaletteConstructor
 except ImportError:
     pass
 
@@ -66,9 +69,7 @@ def load(
     return bitmap_obj, palette_obj
 
 
-def build_palette(
-    palette_class: PaletteConstructor, palette_colors: Set[int]
-) -> Palette:  # pylint: disable=duplicate-code
+def build_palette(palette_class: PaletteConstructor, palette_colors: Set[int]) -> Palette:
     """
     construct the Palette, and populate it with the set of palette_colors
     """
diff --git a/src/lib/adafruit_imageload/pnm/pgm/binary.py b/src/lib/adafruit_imageload/pnm/pgm/binary.py
index 7e8c56b..700b563 100644
--- a/src/lib/adafruit_imageload/pnm/pgm/binary.py
+++ b/src/lib/adafruit_imageload/pnm/pgm/binary.py
@@ -14,11 +14,14 @@
 * Author(s): Matt Land, Brooke Storm, Sam McGahan
 
 """
+
 try:
-    from typing import Tuple, Optional, Set
     from io import BufferedReader
-    from displayio import Palette, Bitmap
-    from ...displayio_types import PaletteConstructor, BitmapConstructor
+    from typing import Optional, Set, Tuple
+
+    from displayio import Bitmap, Palette
+
+    from ...displayio_types import BitmapConstructor, PaletteConstructor
 except ImportError:
     pass
 
@@ -54,9 +57,7 @@ def load(
     return bitmap_obj, palette_obj
 
 
-def build_palette(
-    palette_class: PaletteConstructor, palette_colors: Set[int]
-) -> Palette:
+def build_palette(palette_class: PaletteConstructor, palette_colors: Set[int]) -> Palette:
     """
     construct the Palette, and populate it with the set of palette_colors
     """
diff --git a/src/lib/adafruit_imageload/pnm/ppm_ascii.py b/src/lib/adafruit_imageload/pnm/ppm_ascii.py
index 2ba7e9f..ac8ea8a 100644
--- a/src/lib/adafruit_imageload/pnm/ppm_ascii.py
+++ b/src/lib/adafruit_imageload/pnm/ppm_ascii.py
@@ -16,20 +16,22 @@
 
 """
 
-__version__ = "1.20.1"
+__version__ = "1.23.5"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 try:
+    from io import BufferedReader
     from typing import (
-        Tuple,
         Iterator,
-        Optional,
         List,
+        Optional,
         Set,
+        Tuple,
     )
-    from io import BufferedReader
-    from displayio import Palette, Bitmap
-    from ..displayio_types import PaletteConstructor, BitmapConstructor
+
+    from displayio import Bitmap, Palette
+
+    from ..displayio_types import BitmapConstructor, PaletteConstructor
 except ImportError:
     pass
 
diff --git a/src/lib/adafruit_imageload/pnm/ppm_binary.py b/src/lib/adafruit_imageload/pnm/ppm_binary.py
index 44af03b..cada568 100644
--- a/src/lib/adafruit_imageload/pnm/ppm_binary.py
+++ b/src/lib/adafruit_imageload/pnm/ppm_binary.py
@@ -15,15 +15,18 @@
 * Author(s):  Matt Land, Brooke Storm, Sam McGahan
 
 """
+
 try:
-    from typing import Tuple, Optional, Set
     from io import BufferedReader
-    from displayio import Palette, Bitmap
-    from ..displayio_types import PaletteConstructor, BitmapConstructor
+    from typing import Optional, Set, Tuple
+
+    from displayio import Bitmap, Palette
+
+    from ..displayio_types import BitmapConstructor, PaletteConstructor
 except ImportError:
     pass
 
-__version__ = "1.20.1"
+__version__ = "1.23.5"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
@@ -38,7 +41,6 @@ def load(
     Load pixel values (indices or colors) into a bitmap and for a binary
     ppm, return None for pallet.
     """
-    # pylint: disable=too-many-locals
 
     data_start = file.tell()
     palette_colors = set()  # type: Set[Tuple[int, int, int]]
diff --git a/src/lib/adafruit_imageload/tilegrid_inflator.py b/src/lib/adafruit_imageload/tilegrid_inflator.py
index ee6ce21..8df1a22 100644
--- a/src/lib/adafruit_imageload/tilegrid_inflator.py
+++ b/src/lib/adafruit_imageload/tilegrid_inflator.py
@@ -13,20 +13,23 @@
 * Author(s): Tim Cocks, Matt Land
 
 """
+
 import displayio
+
 import adafruit_imageload
 
 try:
-    from typing import Tuple, Optional, List, Union
-    from displayio import Palette, Bitmap, OnDiskBitmap, TileGrid
+    from typing import List, Optional, Tuple, Union
+
+    from displayio import Bitmap, OnDiskBitmap, Palette, TileGrid
 except ImportError:
     pass
 
-__version__ = "1.20.1"
+__version__ = "1.23.5"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
-def inflate_tilegrid(
+def inflate_tilegrid(  # noqa: PLR0913, PLR0912, Too many arguments in function definition, Too many branches
     bmp_path: Optional[str] = None,
     target_size: Tuple[int, int] = (3, 3),
     tile_size: Optional[List[int]] = None,
@@ -48,8 +51,6 @@ def inflate_tilegrid(
     :param Optional[Palette] bmp_palette: Already loaded spritesheet Palette
     """
 
-    # pylint: disable=too-many-arguments, too-many-locals, too-many-branches
-
     if bmp_path is None and (bmp_obj is None and bmp_palette is None):
         raise AttributeError("Must pass either bmp_path or bmp_obj and bmp_palette")
 
diff --git a/src/lib/adafruit_irremote.mpy b/src/lib/adafruit_irremote.mpy
index 8bfcc8f22b3e2a8c1d6f7aba7b4ae6aa4d1784b9..4f1634a9635f3dc09084a3a11bdfc4c3184ee1ab 100644
GIT binary patch
literal 2977
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

literal 3069
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
DXF$XM

diff --git a/src/lib/adafruit_ntp.mpy b/src/lib/adafruit_ntp.mpy
index d7a91766ec6b8005bc9bfd5acd0868bb383d6827..95130dc1f9f0aca3e0dc77ef5820dbd4088df172 100644
GIT binary patch
literal 1245
zcmaJ<O;FoL6kf^3CdM(cqzE-Q#MlM`7+J9$)iCW0#D>(#@Z(^T(rIV0Wf|OJ$s?^Z
zp<HB#&d^@lYi2srOOJw(^#73lH*L@Dq0?JWy+MYV-nue&NH5h$``$i%?|tukyJ;7=
zc*QwTC>6?jy@H^MYC>%b^m+}X*JT8{QKhPYhQG1yNeBtyGH@;Amw?w$^gD_Ux@($_
z0FB;;TDfc}2m}mGeoH~n&eG}#oR<soh5`*m*3^;#!X8-Dv`yf{kyZhFk1Gtoc3z=W
z(iOwNfLg&W1Xy@l{28iKJplh(ei&9YRYRIuk)eSKI+kMqT2<~MXl$u62*G--R6t6r
zy^|2Pt{|JVqLwu*tJOX5&CJ2<!fYO}%Zuq7FmvtZ%sgPRz78>e%7Yp3G}IE(0Ie(X
z9avGZ%hgp|04(cT6*vd40&jajuEA^;P<9io!P1+WT-a>6-a3-)emMy7XpM@dLI@}b
zb)}|ZFNEg~^NVn0A^R$vU0O`P0=T7_^o`j(T+Y5W3t|&jsG6?T6di4WCc~acX-&I9
zG+uU93wJ@+)CNK|V=5L~ub_>3QINH2taJ3Sna&+ZS9BTQg{3XDft$d*0)_*(Cmt75
zlc`in6ubIFp_3=r9D;psG<_YTlJUvpr1WBZQrhuSJh2uu{ljyckxZmy=K4vF#H)jI
zn3Qvj=<f<RIp-?n;x2^&HyS3mv5?4(=i`8KCrQqolZl-YA8_x6*QVv*ws~P^V%O)7
zaubxB6PBYOOj6y&khx8rDVmh0_#V}Rt+$u}+}Sw6@%~txOcLA>whnAZa<cQCOHX#q
z-RbCA@pAVWPmkA(n>`Wyj0%xbFtcazzI}`DePHoa&f@)aJR~Lwi>K+tLFlEY__cS;
zLyKo0S^PQE;yL{F<>dGI`_vRKn)7QTC^$S6OOB32E7xz1&nJxW`SI#>@J);H=l;y(
zEyl;bU@^TGLrJ8$va^C&KC&3vyw$jR{q|!MyL-19f87p=zoo@h8+{%xOuxMZB=VZ@
z^*(#SVpxe-r5)^m1ism4FXALzULsfb*&z0x{rfie`WrOK4pJc;rNT|Ai7CIMlg)?!
zSj@R3`TfD8(7iwY{s25Z#41|INDKKPMvCMQKRy@wxE1>8$tU#KQ9J3=whcRu4}bpb
zH2(Q>@n61paP;ND(P8uW*RL#wIi=%r^1aj`JtUgj)6sHJKT%^beZObsES8r*Tc5>n
ehbLLbk1=L=Pa@=I%1@1m=DTab=-mJ1$^QbB3W2-;

literal 855
zcmY+B-%ry}6vuBn6=Vx^ZBr^6Ft&g{hFck<4A2A^6BZ*d83;zbY^8$+*4wmqMAXDG
zU%>e2f8ak*e*FQW{tfcrt4}_d05S2+TLv0$?!(FVe9yg~b58m)-5%P+Oc2zy6_yGm
zv!Y?BV<Tp4EQW0Vjft*|3hZ3KXJNCVV1XiWJ=V&qKrz1Fm=x>j5d;X=RnyXt4q*fc
z41}g?AQDqTcrrf?^HXqkGCL15(^Kh*e1c}K5H(2)R8FBOYj6c)!y1gomo>anDaI63
zj$e?(M=p@knyC=9=?%O>z9IE7V%HiH2`M#@N~I*J8We+6)4TS?VI}m+7J(l$3xvfZ
zfR>qV5CM$OQcZ$c4BIc6dIOobXfrH+0a2-Bskr!-30g>5RWWqCLls=?r3B#jGlq!_
z)x;YKI!Ou4QUR;3A*WEZ)hxv>NMi;<YcY3l$Xu>Y9NPBQa2WWT?A!L$&d$!Lq=qtJ
z#}ON#Yut6jMp)z7t7#@?!EjhgQf|g5xF9TewjaK8O0KK&@Gt9uBeuc+VQohY!7|bj
zM!Kdz3l~gGG*(xiV`y#YN=^X)Z1c4$7onY;?Rr&iZM8Ft()D=HP_%EgyI;E57YTJ_
z%Uytt^5VZ2bxQ^g#~qCw*&iG(V9&8&)#0clwK?jwAAPh*yfe4?eg5&+^v~A|3l7)8
z`)Z##oQG>1xd*e8nY<hGGgImNaBTeH$OD-km%-sK&yxk5Pu<}nGPSTvidB6HBZq5p
zxG1@|XqhH*i>WH>B@>mQrn}iXVrBz;Kn9<3PoA<vyin2I=|R`ST<REgI4|R?t+*;z
zX?ynbUUmO>_|3N;@4@M@BSu&+?<K~pYxJHq<w;UoCuiO-2M*VN%-%iOs}=k@al`?(
anP=CKQdo0|Sr30r2IpCVb1YM5gZ=|@7!jcW

diff --git a/src/lib/adafruit_register/i2c_bcd_alarm.py b/src/lib/adafruit_register/i2c_bcd_alarm.py
index 292aa23..178d8e1 100644
--- a/src/lib/adafruit_register/i2c_bcd_alarm.py
+++ b/src/lib/adafruit_register/i2c_bcd_alarm.py
@@ -2,6 +2,7 @@
 #
 # SPDX-License-Identifier: MIT
 # pylint: disable=too-few-public-methods
+# pylint: disable=too-many-branches
 
 """
 `adafruit_register.i2c_bcd_alarm`
@@ -12,7 +13,7 @@
 * Author(s): Scott Shawcroft
 """
 
-__version__ = "1.9.17"
+__version__ = "1.10.1"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git"
 
 import time
@@ -23,7 +24,7 @@
     from circuitpython_typing.device_drivers import I2CDeviceDriver
 
     FREQUENCY_T = Literal[
-        "monthly", "weekly", "daily", "hourly", "secondly", "minutely"
+        "monthly", "weekly", "daily", "hourly", "minutely", "secondly"
     ]
 except ImportError:
     pass
@@ -115,6 +116,9 @@ def __get__(
                 frequency = "minutely"
                 seconds = _bcd2bin(self.buffer[1] & 0x7F)
             i = 2
+        else:
+            frequency = "minutely"
+            seconds = _bcd2bin(self.buffer[i] & 0x7F)
         minute = 0
         if (self.buffer[i] & 0x80) == 0:
             frequency = "hourly"
@@ -169,7 +173,7 @@ def __set__(
             raise ValueError(error_message)
 
         frequency = FREQUENCY.index(frequency_name)
-        if frequency <= 1 and not self.has_seconds:
+        if frequency < 1 and not self.has_seconds:
             raise ValueError(error_message)
 
         # i is the index of the minute byte
diff --git a/src/lib/adafruit_register/i2c_bcd_datetime.py b/src/lib/adafruit_register/i2c_bcd_datetime.py
index d9ab4cf..0a23ffe 100644
--- a/src/lib/adafruit_register/i2c_bcd_datetime.py
+++ b/src/lib/adafruit_register/i2c_bcd_datetime.py
@@ -12,7 +12,7 @@
 * Author(s): Scott Shawcroft
 """
 
-__version__ = "1.9.17"
+__version__ = "1.10.1"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git"
 
 import time
diff --git a/src/lib/adafruit_register/i2c_bit.py b/src/lib/adafruit_register/i2c_bit.py
index b9c926d..e518957 100644
--- a/src/lib/adafruit_register/i2c_bit.py
+++ b/src/lib/adafruit_register/i2c_bit.py
@@ -12,7 +12,7 @@
 * Author(s): Scott Shawcroft
 """
 
-__version__ = "1.9.17"
+__version__ = "1.10.1"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git"
 
 try:
diff --git a/src/lib/adafruit_register/i2c_bits.py b/src/lib/adafruit_register/i2c_bits.py
index 7ba9eae..08bf5be 100644
--- a/src/lib/adafruit_register/i2c_bits.py
+++ b/src/lib/adafruit_register/i2c_bits.py
@@ -12,7 +12,7 @@
 * Author(s): Scott Shawcroft
 """
 
-__version__ = "1.9.17"
+__version__ = "1.10.1"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git"
 
 try:
diff --git a/src/lib/adafruit_register/i2c_struct.py b/src/lib/adafruit_register/i2c_struct.py
index ea4e42c..a097e3c 100644
--- a/src/lib/adafruit_register/i2c_struct.py
+++ b/src/lib/adafruit_register/i2c_struct.py
@@ -12,7 +12,7 @@
 * Author(s): Scott Shawcroft
 """
 
-__version__ = "1.9.17"
+__version__ = "1.10.1"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git"
 
 import struct
diff --git a/src/lib/adafruit_register/i2c_struct_array.py b/src/lib/adafruit_register/i2c_struct_array.py
index 8822159..65470c6 100644
--- a/src/lib/adafruit_register/i2c_struct_array.py
+++ b/src/lib/adafruit_register/i2c_struct_array.py
@@ -12,7 +12,7 @@
 * Author(s): Scott Shawcroft
 """
 
-__version__ = "1.9.17"
+__version__ = "1.10.1"
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git"
 
 import struct
diff --git a/src/lib/adafruit_requests.mpy b/src/lib/adafruit_requests.mpy
index 0af3a76356f94e76d99aefed3387c698e25afa92..c2a1cc28e66ec0892ff2b4d91388b3decc411988 100644
GIT binary patch
literal 6944
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
S6>fh{Sf>d8pbB?Xh5rw4Y>r9*

literal 8578
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

diff --git a/src/lib/adafruit_ticks.mpy b/src/lib/adafruit_ticks.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..6167b2f161ca616c28220d7ab71cab204e04c254
GIT binary patch
literal 694
zcmYLEQE$>v7`-j)C<WPV$1XTXB;6hi7@9RrjEfp%NS294Vhq;BR94Dp1WIU`AwGDE
z#3l33z}|h?FYrko_Y+JuV|>F)J23Yq_nhy1=iKkxTLpJgv{<Xx8oj>hXpX6Wuyfr3
zSaW&znA^#b1E5#c+BS&U{jSkFF>R{{SjTJ|AknrumSc5HUF+CDSTZ2^rdquYVm_>!
zjm84E4BG}s(@u<@ZCV{o15nd?M%N<f`JpQb{v`81H??Kx{0lAip9A+1=Vb$~ZnT^l
z&?6q*0sbok=3&!uy7sOl9h*+Gf0Wa$wzSw*da_u1&+O@B{g(r$Nrv$<a>M|bxQEkb
z$02LiT4{?6+-O-J!ME)n^e**2jbr8QQBst$r59fXvHbLuzgIpJM!^w_A)TR;ffS8s
z6|SILTL4A(qZl%zx|(7TqaGYp`86J9=*!|ytl~;Ch=M%N2O(2Y0#zgwOEN%AVXz;^
zkR`5Qibd-xzpemPrVw+G_UwEt6SyqCQZWp9Jt4HA$~2LwcjU?e#K|itEHfxl(O2CB
z%Q5&djtYVTM0Ylueg37p`FZg*DUxXM`zZfssl0(iF^PhN4WgYke=F2N{Bl=>Ts(n4
zr5|L)8O9h)s)y53NOb3TS}43#i_gZBD{(mIe|6#Z7Nt<euq(pwW)ctc+56+k^-bEv
dxo^9=;Xb>*IM-cPj6_KPSzZW_Ckl<H`aeUl*}wn*

literal 0
HcmV?d00001

diff --git a/src/network.py b/src/network.py
index 1fbfbc8..01c92fe 100644
--- a/src/network.py
+++ b/src/network.py
@@ -1,11 +1,11 @@
 ## Class for handling networking. 
 import os
 import gc
-import ssl
+import time
 import wifi
-import socketpool
 import adafruit_ntp
 import adafruit_requests
+import adafruit_connection_manager
 
 class WifiNetwork:
     def __init__(self) -> None:
@@ -28,6 +28,10 @@ def __init__(self) -> None:
         self._last_ntp_sync = None
         self.connect()
 
+        self._pool = adafruit_connection_manager.get_radio_socketpool(wifi.radio)
+        self._requests = adafruit_requests.Session(self._pool, adafruit_connection_manager.get_radio_socketpool(wifi.radio))
+        self._connection_manager = adafruit_connection_manager.get_connection_manager(self._pool)
+
 
     def connect(self) -> bool:
         """ If not connected connect to the network."""
@@ -41,18 +45,18 @@ def connect(self) -> bool:
                 return True
             except Exception as e:
                 print(e)
-            attempt += 1
+                attempt += 1
+                time.sleep(4)
         
         raise Exception('Unable to connect')
 
 
 
     def get_time(self):
-        pool = socketpool.SocketPool(wifi.radio)
         ntp_try = 0
         while ntp_try < len(self.NTP_HOST):
             try:
-                ntp = adafruit_ntp.NTP(pool, tz_offset=self.TZ, server=self.NTP_HOST[ntp_try])
+                ntp = adafruit_ntp.NTP(self._pool, tz_offset=self.TZ, server=self.NTP_HOST[ntp_try])
                 self._last_ntp_sync = ntp.datetime
                 return ntp.datetime
             except Exception as ex:
@@ -63,20 +67,15 @@ def get_time(self):
 
     def getJson(self, url):
         try:
-            pool = socketpool.SocketPool(wifi.radio)
-            context = ssl.create_default_context()
-            #requests = adafruit_requests.Session(pool, context)
-            requests = adafruit_requests.Session(pool, ssl.create_default_context())
             print(f'getting url: {url}')
             gc.collect()
             print('free memory', gc.mem_free())
-
-            #response = requests.get(url, stream=True) 
-            response = requests.get(url) 
-            print('free memory after', gc.mem_free())
-            return response.json()
+            with self._requests.get(url) as response:
+                print(f'free memory after: {gc.mem_free()} socket count: {self._connection_manager.managed_socket_count}: available: {self._connection_manager.available_socket_count}')
+                return response.json()
         except Exception as e:
             print('response.json Exception:', e)
+            print(f'free memory: {gc.mem_free()} socket count: {self._connection_manager.managed_socket_count}: available: {self._connection_manager.available_socket_count}')
             gc.collect()
         return {}        
 

From 8734f5dd368a3862819d6a37dddd97ece2493094 Mon Sep 17 00:00:00 2001
From: Jason Jackson <jake1164@hotmail.com>
Date: Sat, 30 Nov 2024 09:39:53 -0500
Subject: [PATCH 2/2] Updated to .NET 9.2 release

---
 .github/workflows/release.yml                 |   8 +-
 README.md                                     |   2 +-
 src/lib/adafruit_bitmap_font/bdf.mpy          | Bin 0 -> 2315 bytes
 src/lib/adafruit_bitmap_font/bdf.py           |   4 +
 src/lib/adafruit_bitmap_font/bitmap_font.mpy  | Bin 0 -> 586 bytes
 src/lib/adafruit_bitmap_font/bitmap_font.py   |   4 +
 src/lib/adafruit_bitmap_font/glyph_cache.mpy  | Bin 0 -> 491 bytes
 src/lib/adafruit_bitmap_font/glyph_cache.py   |   4 +
 src/lib/adafruit_bitmap_font/pcf.mpy          | Bin 0 -> 3874 bytes
 src/lib/adafruit_bitmap_font/pcf.py           | 412 ------------------
 src/lib/adafruit_bitmap_font/ttf.mpy          | Bin 0 -> 822 bytes
 src/lib/adafruit_bitmap_font/ttf.py           |  65 ---
 src/lib/adafruit_bus_device/i2c_device.mpy    | Bin 0 -> 1172 bytes
 src/lib/adafruit_bus_device/i2c_device.py     |   4 +
 src/lib/adafruit_bus_device/spi_device.mpy    | Bin 0 -> 845 bytes
 src/lib/adafruit_bus_device/spi_device.py     |   4 +
 src/lib/adafruit_display_text/__init__.mpy    | Bin 0 -> 4258 bytes
 src/lib/adafruit_display_text/__init__.py     |   4 +
 .../adafruit_display_text/bitmap_label.mpy    | Bin 0 -> 3923 bytes
 src/lib/adafruit_display_text/bitmap_label.py |   4 +
 src/lib/adafruit_display_text/label.mpy       | Bin 0 -> 3597 bytes
 src/lib/adafruit_display_text/label.py        |   4 +
 .../adafruit_display_text/outlined_label.py   |   4 +
 .../adafruit_display_text/scrolling_label.mpy | Bin 0 -> 1126 bytes
 .../adafruit_display_text/scrolling_label.py  |   4 +
 src/lib/adafruit_imageload/__init__.mpy       | Bin 0 -> 921 bytes
 src/lib/adafruit_imageload/__init__.py        |   4 +
 src/lib/adafruit_imageload/bmp/__init__.mpy   | Bin 0 -> 1034 bytes
 src/lib/adafruit_imageload/bmp/__init__.py    |   4 +
 src/lib/adafruit_imageload/bmp/indexed.mpy    | Bin 0 -> 1666 bytes
 src/lib/adafruit_imageload/bmp/indexed.py     |   4 +
 .../bmp/negative_height_check.mpy             | Bin 0 -> 150 bytes
 .../bmp/negative_height_check.py              |  19 -
 src/lib/adafruit_imageload/bmp/truecolor.mpy  | Bin 0 -> 1353 bytes
 src/lib/adafruit_imageload/bmp/truecolor.py   |   4 +
 .../adafruit_imageload/displayio_types.mpy    | Bin 0 -> 331 bytes
 src/lib/adafruit_imageload/displayio_types.py |   4 +
 src/lib/adafruit_imageload/gif.mpy            | Bin 0 -> 1712 bytes
 src/lib/adafruit_imageload/gif.py             |   4 +
 src/lib/adafruit_imageload/png.mpy            | Bin 0 -> 1063 bytes
 src/lib/adafruit_imageload/png.py             |   4 +
 src/lib/adafruit_imageload/pnm/__init__.mpy   | Bin 0 -> 1211 bytes
 src/lib/adafruit_imageload/pnm/__init__.py    |   4 +
 src/lib/adafruit_imageload/pnm/pbm_ascii.mpy  | Bin 0 -> 465 bytes
 src/lib/adafruit_imageload/pnm/pbm_ascii.py   |   4 +
 src/lib/adafruit_imageload/pnm/pbm_binary.mpy | Bin 0 -> 615 bytes
 src/lib/adafruit_imageload/pnm/pbm_binary.py  |   4 +
 .../adafruit_imageload/pnm/pgm/__init__.mpy   | Bin 0 -> 577 bytes
 src/lib/adafruit_imageload/pnm/pgm/ascii.mpy  | Bin 0 -> 807 bytes
 src/lib/adafruit_imageload/pnm/pgm/binary.mpy | Bin 0 -> 669 bytes
 src/lib/adafruit_imageload/pnm/ppm_ascii.mpy  | Bin 0 -> 909 bytes
 src/lib/adafruit_imageload/pnm/ppm_ascii.py   |   4 +
 src/lib/adafruit_imageload/pnm/ppm_binary.mpy | Bin 0 -> 736 bytes
 src/lib/adafruit_imageload/pnm/ppm_binary.py  |   4 +
 .../adafruit_imageload/tilegrid_inflator.mpy  | Bin 0 -> 1019 bytes
 .../adafruit_imageload/tilegrid_inflator.py   |   4 +
 src/lib/adafruit_register/i2c_bcd_alarm.mpy   | Bin 0 -> 1740 bytes
 src/lib/adafruit_register/i2c_bcd_alarm.py    |   4 +
 .../adafruit_register/i2c_bcd_datetime.mpy    | Bin 0 -> 1141 bytes
 src/lib/adafruit_register/i2c_bcd_datetime.py |   4 +
 src/lib/adafruit_register/i2c_bit.mpy         | Bin 0 -> 801 bytes
 src/lib/adafruit_register/i2c_bit.py          |   4 +
 src/lib/adafruit_register/i2c_bits.mpy        | Bin 0 -> 1053 bytes
 src/lib/adafruit_register/i2c_bits.py         |   4 +
 src/lib/adafruit_register/i2c_struct.mpy      | Bin 0 -> 1040 bytes
 src/lib/adafruit_register/i2c_struct.py       |   4 +
 .../adafruit_register/i2c_struct_array.mpy    | Bin 0 -> 1008 bytes
 src/lib/adafruit_register/i2c_struct_array.py |   4 +
 68 files changed, 121 insertions(+), 501 deletions(-)
 create mode 100644 src/lib/adafruit_bitmap_font/bdf.mpy
 create mode 100644 src/lib/adafruit_bitmap_font/bitmap_font.mpy
 create mode 100644 src/lib/adafruit_bitmap_font/glyph_cache.mpy
 create mode 100644 src/lib/adafruit_bitmap_font/pcf.mpy
 delete mode 100644 src/lib/adafruit_bitmap_font/pcf.py
 create mode 100644 src/lib/adafruit_bitmap_font/ttf.mpy
 delete mode 100644 src/lib/adafruit_bitmap_font/ttf.py
 create mode 100644 src/lib/adafruit_bus_device/i2c_device.mpy
 create mode 100644 src/lib/adafruit_bus_device/spi_device.mpy
 create mode 100644 src/lib/adafruit_display_text/__init__.mpy
 create mode 100644 src/lib/adafruit_display_text/bitmap_label.mpy
 create mode 100644 src/lib/adafruit_display_text/label.mpy
 create mode 100644 src/lib/adafruit_display_text/scrolling_label.mpy
 create mode 100644 src/lib/adafruit_imageload/__init__.mpy
 create mode 100644 src/lib/adafruit_imageload/bmp/__init__.mpy
 create mode 100644 src/lib/adafruit_imageload/bmp/indexed.mpy
 create mode 100644 src/lib/adafruit_imageload/bmp/negative_height_check.mpy
 delete mode 100644 src/lib/adafruit_imageload/bmp/negative_height_check.py
 create mode 100644 src/lib/adafruit_imageload/bmp/truecolor.mpy
 create mode 100644 src/lib/adafruit_imageload/displayio_types.mpy
 create mode 100644 src/lib/adafruit_imageload/gif.mpy
 create mode 100644 src/lib/adafruit_imageload/png.mpy
 create mode 100644 src/lib/adafruit_imageload/pnm/__init__.mpy
 create mode 100644 src/lib/adafruit_imageload/pnm/pbm_ascii.mpy
 create mode 100644 src/lib/adafruit_imageload/pnm/pbm_binary.mpy
 create mode 100644 src/lib/adafruit_imageload/pnm/pgm/__init__.mpy
 create mode 100644 src/lib/adafruit_imageload/pnm/pgm/ascii.mpy
 create mode 100644 src/lib/adafruit_imageload/pnm/pgm/binary.mpy
 create mode 100644 src/lib/adafruit_imageload/pnm/ppm_ascii.mpy
 create mode 100644 src/lib/adafruit_imageload/pnm/ppm_binary.mpy
 create mode 100644 src/lib/adafruit_imageload/tilegrid_inflator.mpy
 create mode 100644 src/lib/adafruit_register/i2c_bcd_alarm.mpy
 create mode 100644 src/lib/adafruit_register/i2c_bcd_datetime.mpy
 create mode 100644 src/lib/adafruit_register/i2c_bit.mpy
 create mode 100644 src/lib/adafruit_register/i2c_bits.mpy
 create mode 100644 src/lib/adafruit_register/i2c_struct.mpy
 create mode 100644 src/lib/adafruit_register/i2c_struct_array.mpy

diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index cb602b8..9214264 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -18,12 +18,12 @@ jobs:
         echo '{ "version":"${{ github.event.release.tag_name }}" }' > src/.version
     
     - name: Run MPY Action
-      uses: jake1164/build-mpy@fetch-submodules-fix
+      uses: adafruit/build-mpy@v1
       with:
         github-token: ${{ secrets.GITHUB_TOKEN }}
-        circuitpy-tag: "8.2.0"
+        circuitpy-tag: "8.0.0"
         mpy-directory: "src"
         mpy-manifest-file: "mpy-manifest.txt"
         mpy-manifest-type: "exclude"
-        zip-directory: "."
-        zip-filename: "weather-matrix-${{ github.event.release.tag_name }}.zip"
\ No newline at end of file
+        zip-directory: "src"
+        zip-filename: "weather-matrix-${{ github.event.release.tag_name }}.zip"
diff --git a/README.md b/README.md
index 2f6ea4c..1ae706a 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 # Pico-RGB-Matrix-Clock
 LED Matrix Clock with Open Weather Map enabled weather running on a Raspberry Pico W and a WaveShare [Pico-RGB-Matrix-P3-64x32](https://www.waveshare.com/wiki/Pico-RGB-Matrix-P3-64x32)
 
-## NOTE: THIS PROJECT HAS BEEN UPDATED AND REQUIRES CircuitPython 9.0.0
+## NOTE: THIS PROJECT HAS BEEN UPDATED AND REQUIRES CircuitPython 9.0.0 or later
 This project requires that you use [circuitpython 9.x.x](https://circuitpython.org/board/raspberry_pi_pico_w/). 
 If you still wish to use 8.x you will need to use an older [release](https://github.com/jake1164/Pico-RGB-Matrix-Weather-Clock/releases/tag/v0.54.0)
 
diff --git a/src/lib/adafruit_bitmap_font/bdf.mpy b/src/lib/adafruit_bitmap_font/bdf.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..36a7f568c1f35e42e8ed774020f958806554fe56
GIT binary patch
literal 2315
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

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_bitmap_font/bdf.py b/src/lib/adafruit_bitmap_font/bdf.py
index 4ff14f0..96830f6 100644
--- a/src/lib/adafruit_bitmap_font/bdf.py
+++ b/src/lib/adafruit_bitmap_font/bdf.py
@@ -33,7 +33,11 @@
 from fontio import Glyph
 from .glyph_cache import GlyphCache
 
+<<<<<<< HEAD
 __version__ = "2.1.3"
+=======
+__version__ = "2.1.1"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font.git"
 
 
diff --git a/src/lib/adafruit_bitmap_font/bitmap_font.mpy b/src/lib/adafruit_bitmap_font/bitmap_font.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..fe657297b1276b08c31bdc1e3edbf79967ea6baa
GIT binary patch
literal 586
zcmYk1U2D@&7{{NJHt8Cp%d&W;wy<J1R!T|O9KG<$HL=WzxY`!Ug~TLH+F<iSda4v}
zQV;|`&E}?F`~Dg9#;@U}XX!SC!+Cxezvtoq*Em?e#kQ@1<t0;}n6^&>D>l6-B<g>x
z#4}hHAIHRxLTe0sKcoNxnZ<rM1fi8}fi&<Z@z|RA5pedvgB%w-9&m(s!0#yA$~H*j
z$QoqVA)nYVe?4F4T6!C}LydmDUK<`^(|qYB6MEk?K{U<8jiWR2{IMHafeXSS7tDi*
zZH)+tCwEnK=#$aZR-7nMFS@9E7o{{macH^285z;5i?C*!R#fO3aQSX;?+G2qb7DFG
z0RX$!4_}1QtFRJSL*J={)4+C<%4Py@<whAjucY$rokpY4*ER<GdMYwvuFjP5Wd<|l
z9L^c3$ktJbE3=q2=3;^JQn`Q&l#3Y`agj2gF^_rUfPcEO`bXD{1N2P1g5@gU>zz94
z-T^Fh9Q1DKH>wGEEv?<F-ruNgsSj(}+dtMGq@5D?<^3xAS-No~UfpHBp2*kUG|{&s
zd08wpk#3w;(J#Gwnc}<gK^9Mrn~Za26c+}Q8Ryx47$4=8OM_n+xy(3E{L}a(OPL|v
LtmaSu?jrXeAhMkr

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_bitmap_font/bitmap_font.py b/src/lib/adafruit_bitmap_font/bitmap_font.py
index 640b041..741f8da 100644
--- a/src/lib/adafruit_bitmap_font/bitmap_font.py
+++ b/src/lib/adafruit_bitmap_font/bitmap_font.py
@@ -31,7 +31,11 @@
 except ImportError:
     pass
 
+<<<<<<< HEAD
 __version__ = "2.1.3"
+=======
+__version__ = "2.1.1"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font.git"
 
 
diff --git a/src/lib/adafruit_bitmap_font/glyph_cache.mpy b/src/lib/adafruit_bitmap_font/glyph_cache.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..1a401cf3bbcc2f10e6fec02235e1b2098472ddb7
GIT binary patch
literal 491
zcmYL^QA^uk6oyYy+u9iG*EBn;wy-j%9i2-sI4^d!8Oc--7Fd;BjL-B-Oad_p>F1z#
znQXA1)A|$kKgRybQcKy*;k@U(=RG`T4PNXBmg~8<`F+IcIO2D1MsL%E>p?utLdskg
z`dT)HEoqcQX#(V&`?))geUSMyi;@7OPYWl=i>oMwwSa+SXouP%s81Vn5dphR`jj{U
zj8oTJ2_^9PvWJ@MdC+8O9Q%yJB~tp$&nM+iN`X+C`&n9c`rCI8ZDgtE(=3e=J^}T=
zfQRksNyvFNd9Uk1#KZfs#?m`|1*m^qk(yD?O5)E`9+nSImfTiJpp|Fvvv<%DZu*7#
z(ioZ6EAOmd5Rp`dVt1`4qS&io#VJU2D0FMRDps8f>AFS!o|?{u@U^hJb*z(hZ0!On
zUko6PBM}=m6TWkh8^88GcwVcGDrw*|15h#qlnoI#ZB_|e>k<~P4`9~Wu-Ta+$@si@
zW3wM*xU-3!LhBE#y}|xqFrT$I{+wE6osXEZeFVQB)#m(IaO}nCYNpDMrBLeX)-gCs
F*FW;bhtB{2

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_bitmap_font/glyph_cache.py b/src/lib/adafruit_bitmap_font/glyph_cache.py
index 2933f89..a8da27c 100644
--- a/src/lib/adafruit_bitmap_font/glyph_cache.py
+++ b/src/lib/adafruit_bitmap_font/glyph_cache.py
@@ -30,7 +30,11 @@
 
 import gc
 
+<<<<<<< HEAD
 __version__ = "2.1.3"
+=======
+__version__ = "2.1.1"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font.git"
 
 
diff --git a/src/lib/adafruit_bitmap_font/pcf.mpy b/src/lib/adafruit_bitmap_font/pcf.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..fea304911abdd63c08d2a1c07a0f2ea732b96d46
GIT binary patch
literal 3874
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

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_bitmap_font/pcf.py b/src/lib/adafruit_bitmap_font/pcf.py
deleted file mode 100644
index 860ca09..0000000
--- a/src/lib/adafruit_bitmap_font/pcf.py
+++ /dev/null
@@ -1,412 +0,0 @@
-# SPDX-FileCopyrightText: 2020 Jeff Epler for Adafruit Industries
-#
-# SPDX-License-Identifier: MIT
-
-"""
-`adafruit_bitmap_font.pcf`
-====================================================
-
-Loads PCF format fonts.
-
-* Author(s): Jeff Epler
-
-Implementation Notes
---------------------
-
-**Hardware:**
-
-**Software and Dependencies:**
-
-* Adafruit CircuitPython firmware for the supported boards:
-  https://github.com/adafruit/circuitpython/releases
-
-"""
-
-try:
-    from typing import Union, Tuple, Iterator, Iterable
-    from io import FileIO
-    from displayio import Bitmap as displayioBitmap
-except ImportError:
-    pass
-
-from collections import namedtuple
-import gc
-import struct
-from micropython import const
-from fontio import Glyph
-from .glyph_cache import GlyphCache
-
-try:
-    from bitmaptools import readinto as _bitmap_readinto
-except ImportError:
-    _bitmap_readinto = None  # pylint: disable=invalid-name
-
-_PCF_PROPERTIES = const(1 << 0)
-_PCF_ACCELERATORS = const(1 << 1)
-_PCF_METRICS = const(1 << 2)
-_PCF_BITMAPS = const(1 << 3)
-_PCF_INK_METRICS = const(1 << 4)
-_PCF_BDF_ENCODINGS = const(1 << 5)
-_PCF_SWIDTHS = const(1 << 6)
-_PCF_GLYPH_NAMES = const(1 << 7)
-_PCF_BDF_ACCELERATORS = const(1 << 8)
-
-_PCF_DEFAULT_FORMAT = const(0x00000000)
-_PCF_ACCEL_W_INKBOUNDS = const(0x00000100)
-_PCF_COMPRESSED_METRICS = const(0x00000100)
-
-_PCF_GLYPH_PAD_MASK = const(3 << 0)  # See the bitmap table for explanation */
-_PCF_BYTE_MASK = const(1 << 2)  # If set then Most Sig Byte First */
-_PCF_BIT_MASK = const(1 << 3)  # If set then Most Sig Bit First */
-_PCF_SCAN_UNIT_MASK = const(3 << 4)
-
-# https://fontforge.org/docs/techref/pcf-format.html
-
-Table = namedtuple("Table", ("format", "size", "offset"))
-Metrics = namedtuple(
-    "Metrics",
-    (
-        "left_side_bearing",
-        "right_side_bearing",
-        "character_width",
-        "character_ascent",
-        "character_descent",
-        "character_attributes",
-    ),
-)
-Accelerators = namedtuple(
-    "Accelerators",
-    (
-        "no_overlap",
-        "constant_metrics",
-        "terminal_font",
-        "constant_width",
-        "ink_inside",
-        "ink_metrics",
-        "draw_direction",
-        "font_ascent",
-        "font_descent",
-        "max_overlap",
-        "minbounds",
-        "maxbounds",
-        "ink_minbounds",
-        "ink_maxbounds",
-    ),
-)
-Encoding = namedtuple(
-    "Encoding", ("min_byte2", "max_byte2", "min_byte1", "max_byte1", "default_char")
-)
-Bitmap = namedtuple("Bitmap", ("glyph_count", "bitmap_sizes"))
-
-
-class PCF(GlyphCache):
-    """Loads glyphs from a PCF file in the given bitmap_class."""
-
-    def __init__(self, f: FileIO, bitmap_class: displayioBitmap) -> None:
-        super().__init__()
-        self.file = f
-        self.name = f
-        f.seek(0)
-        self.buffer = bytearray(1)
-        self.bitmap_class = bitmap_class
-        _, table_count = self._read("<4sI")
-        self.tables = {}
-        for _ in range(table_count):
-            type_, format_, size, offset = self._read("<IIII")
-            self.tables[type_] = Table(format_, size, offset)
-
-        bitmap_format = self.tables[_PCF_BITMAPS].format
-        if bitmap_format != 0xE:
-            raise NotImplementedError("Unsupported format %s" % bitmap_format)
-
-        self._accel = self._read_accelerator_tables()
-        self._encoding = self._read_encoding_table()
-        self._bitmaps = self._read_bitmap_table()
-
-        self._ascent = self._accel.font_ascent
-        self._descent = self._accel.font_descent
-
-        minbounds = self._accel.ink_minbounds
-        maxbounds = self._accel.ink_maxbounds
-        width = maxbounds.right_side_bearing - minbounds.left_side_bearing
-        height = maxbounds.character_ascent + maxbounds.character_descent
-
-        self._bounding_box = (
-            width,
-            height,
-            minbounds.left_side_bearing,
-            -maxbounds.character_descent,
-        )
-
-    @property
-    def ascent(self) -> int:
-        """The number of pixels above the baseline of a typical ascender"""
-        return self._ascent
-
-    @property
-    def descent(self) -> int:
-        """The number of pixels below the baseline of a typical descender"""
-        return self._descent
-
-    def get_bounding_box(self) -> Tuple[int, int, int, int]:
-        """Return the maximum glyph size as a 4-tuple of: width, height, x_offset, y_offset"""
-        return self._bounding_box
-
-    def _read(self, format_: str) -> Tuple:
-        size = struct.calcsize(format_)
-        if size != len(self.buffer):
-            self.buffer = bytearray(size)
-        self.file.readinto(self.buffer)
-        return struct.unpack_from(format_, self.buffer)
-
-    def _seek_table(self, table: Table) -> int:
-        self.file.seek(table.offset)
-        (format_,) = self._read("<I")
-
-        if format_ & _PCF_BYTE_MASK == 0:
-            raise RuntimeError("Only big endian supported")
-
-        return format_
-
-    def _read_encoding_table(self) -> Encoding:
-        encoding = self.tables[_PCF_BDF_ENCODINGS]
-        self._seek_table(encoding)
-
-        return Encoding(*self._read(">hhhhh"))
-
-    def _read_bitmap_table(self) -> Bitmap:
-        bitmaps = self.tables[_PCF_BITMAPS]
-        format_ = self._seek_table(bitmaps)
-
-        (glyph_count,) = self._read(">I")
-        self.file.seek(bitmaps.offset + 8 + 4 * glyph_count)
-        bitmap_sizes = self._read(">4I")
-        return Bitmap(glyph_count, bitmap_sizes[format_ & 3])
-
-    def _read_metrics(self, compressed_metrics: bool) -> Metrics:
-        if compressed_metrics:
-            (
-                left_side_bearing,
-                right_side_bearing,
-                character_width,
-                character_ascent,
-                character_descent,
-            ) = self._read("5B")
-            left_side_bearing -= 0x80
-            right_side_bearing -= 0x80
-            character_width -= 0x80
-            character_ascent -= 0x80
-            character_descent -= 0x80
-            attributes = 0
-        else:
-            (
-                left_side_bearing,
-                right_side_bearing,
-                character_width,
-                character_ascent,
-                character_descent,
-                attributes,
-            ) = self._read(">5hH")
-        return Metrics(
-            left_side_bearing,
-            right_side_bearing,
-            character_width,
-            character_ascent,
-            character_descent,
-            attributes,
-        )
-
-    def _read_accelerator_tables(self) -> Accelerators:
-        # pylint: disable=too-many-locals
-        accelerators = self.tables.get(_PCF_BDF_ACCELERATORS)
-        if not accelerators:
-            accelerators = self.tables.get(_PCF_ACCELERATORS)
-        if not accelerators:
-            raise RuntimeError("Accelerator table missing")
-
-        format_ = self._seek_table(accelerators)
-        has_inkbounds = format_ & _PCF_ACCEL_W_INKBOUNDS
-
-        (
-            no_overlap,
-            constant_metrics,
-            terminal_font,
-            constant_width,
-            ink_inside,
-            ink_metrics,
-            draw_direction,
-            _,
-            font_ascent,
-            font_descent,
-            max_overlap,
-        ) = self._read(">BBBBBBBBIII")
-        minbounds = self._read_metrics(False)
-        maxbounds = self._read_metrics(False)
-        if has_inkbounds:
-            ink_minbounds = self._read_metrics(False)
-            ink_maxbounds = self._read_metrics(False)
-        else:
-            ink_minbounds = minbounds
-            ink_maxbounds = maxbounds
-
-        return Accelerators(
-            no_overlap,
-            constant_metrics,
-            terminal_font,
-            constant_width,
-            ink_inside,
-            ink_metrics,
-            draw_direction,
-            font_ascent,
-            font_descent,
-            max_overlap,
-            minbounds,
-            maxbounds,
-            ink_minbounds,
-            ink_maxbounds,
-        )
-
-    def _read_properties(self) -> Iterator[Tuple[bytes, Union[bytes, int]]]:
-        property_table_offset = self.tables[_PCF_PROPERTIES]["offset"]
-        self.file.seek(property_table_offset)
-        (format_,) = self._read("<I")
-
-        if format_ & _PCF_BYTE_MASK == 0:
-            raise RuntimeError("Only big endian supported")
-        (nprops,) = self._read(">I")
-        self.file.seek(property_table_offset + 8 + 9 * nprops)
-
-        pos = self.file.tell()
-        if pos % 4 > 0:
-            self.file.read(4 - pos % 4)
-        (string_size,) = self._read(">I")
-
-        strings = self.file.read(string_size)
-        string_map = {}
-        i = 0
-        for value in strings.split(b"\x00"):
-            string_map[i] = value
-            i += len(value) + 1
-
-        self.file.seek(property_table_offset + 8)
-        for _ in range(nprops):
-            name_offset, is_string_prop, value = self._read(">IBI")
-
-            if is_string_prop:
-                yield (string_map[name_offset], string_map[value])
-            else:
-                yield (string_map[name_offset], value)
-
-    def load_glyphs(self, code_points: Union[int, str, Iterable[int]]) -> None:
-        # pylint: disable=too-many-statements,too-many-branches,too-many-nested-blocks,too-many-locals
-        if isinstance(code_points, int):
-            code_points = (code_points,)
-        elif isinstance(code_points, str):
-            code_points = [ord(c) for c in code_points]
-
-        code_points = sorted(
-            c for c in code_points if self._glyphs.get(c, None) is None
-        )
-        if not code_points:
-            return
-
-        indices_offset = self.tables[_PCF_BDF_ENCODINGS].offset + 14
-        bitmap_offset_offsets = self.tables[_PCF_BITMAPS].offset + 8
-        first_bitmap_offset = self.tables[_PCF_BITMAPS].offset + 4 * (
-            6 + self._bitmaps.glyph_count
-        )
-        metrics_compressed = self.tables[_PCF_METRICS].format & _PCF_COMPRESSED_METRICS
-        first_metric_offset = self.tables[_PCF_METRICS].offset + (
-            6 if metrics_compressed else 8
-        )
-        metrics_size = 5 if metrics_compressed else 12
-
-        # These will each _tend to be_ forward reads in the file, at least
-        # sometimes we'll benefit from oofatfs's 512 byte cache and avoid
-        # excess reads
-        indices = [None] * len(code_points)
-        for i, code_point in enumerate(code_points):
-            enc1 = (code_point >> 8) & 0xFF
-            enc2 = code_point & 0xFF
-
-            if enc1 < self._encoding.min_byte1 or enc1 > self._encoding.max_byte1:
-                continue
-            if enc2 < self._encoding.min_byte2 or enc2 > self._encoding.max_byte2:
-                continue
-
-            encoding_idx = (
-                (enc1 - self._encoding.min_byte1)
-                * (self._encoding.max_byte2 - self._encoding.min_byte2 + 1)
-                + enc2
-                - self._encoding.min_byte2
-            )
-            self.file.seek(indices_offset + 2 * encoding_idx)
-            (glyph_idx,) = self._read(">H")
-            if glyph_idx != 65535:
-                indices[i] = glyph_idx
-
-        all_metrics = [None] * len(code_points)
-        for i, code_point in enumerate(code_points):
-            index = indices[i]
-            if index is None:
-                continue
-            self.file.seek(first_metric_offset + metrics_size * index)
-            all_metrics[i] = self._read_metrics(metrics_compressed)
-        bitmap_offsets = [None] * len(code_points)
-        for i, code_point in enumerate(code_points):
-            index = indices[i]
-            if index is None:
-                continue
-            self.file.seek(bitmap_offset_offsets + 4 * index)
-            (bitmap_offset,) = self._read(">I")
-            bitmap_offsets[i] = bitmap_offset
-
-        # Batch creation of glyphs and bitmaps so that we need only gc.collect
-        # once
-        gc.collect()
-        bitmaps = [None] * len(code_points)
-        for i in range(len(all_metrics)):  # pylint: disable=consider-using-enumerate
-            metrics = all_metrics[i]
-            if metrics is not None:
-                width = metrics.right_side_bearing - metrics.left_side_bearing
-                height = metrics.character_ascent + metrics.character_descent
-                bitmap = bitmaps[i] = self.bitmap_class(width, height, 2)
-                self._glyphs[code_points[i]] = Glyph(
-                    bitmap,
-                    0,
-                    width,
-                    height,
-                    metrics.left_side_bearing,
-                    -metrics.character_descent,
-                    metrics.character_width,
-                    0,
-                )
-
-        for i, code_point in enumerate(code_points):
-            metrics = all_metrics[i]
-            if metrics is None:
-                continue
-            self.file.seek(first_bitmap_offset + bitmap_offsets[i])
-            width = metrics.right_side_bearing - metrics.left_side_bearing
-            height = metrics.character_ascent + metrics.character_descent
-
-            bitmap = bitmaps[i]
-
-            if _bitmap_readinto:
-                _bitmap_readinto(
-                    bitmap,
-                    self.file,
-                    bits_per_pixel=1,
-                    element_size=4,
-                    reverse_pixels_in_element=True,
-                )
-            else:
-                words_per_row = (width + 31) // 32
-                buf = bytearray(4 * words_per_row)
-                start = 0
-                for _ in range(height):
-                    self.file.readinto(buf)
-                    for k in range(width):
-                        if buf[k // 8] & (128 >> (k % 8)):
-                            bitmap[start + k] = 1
-                    start += width
diff --git a/src/lib/adafruit_bitmap_font/ttf.mpy b/src/lib/adafruit_bitmap_font/ttf.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..a70cfea9b5e6a1192879b17e16857ac5997976e2
GIT binary patch
literal 822
zcmXX@T~8B16uq-7ODR=`Wm!I2q;$7a3aur$^szB55DGEUq=0K;$hzIqhSE0eHd4{J
zB|aE`fj<M>@IVku{6zeE#5bRe@A?OvE#8;8=iYnHnLCr>U@Y1Z*K%6E)+m}A_lxGX
zR^7-~%4W<o^Vh3Q=yhis)sg`ovso>cH^H+|EE(zBz!oduNw(*K&lT&{lGb!eb+gvc
zP2jTG1&~~I!`K2>o>D;23tCOnO`}!^HjxH*Vvz=T5=uRtPJ<_B=#`uSdntE<;>&&}
zL&pj<z(uDEz)?UMPNe`%HnB*RoZjx^I<&$r(<qgowTpGFq}PiN4G<gUs-|yk<ZG2}
zxD|`e?)5Wy@LaA5tp{Ae*a4%5V+)3s1CHG+HS^GkSIhNAwOXl}M$YfN1w4He5s=jt
zh(uOX`J0Qx!ptP{cK8^PQ7z2Uywk^uEX_HZclkJxQ<vQ9eSx2IDRl|mvoc<n=*rFj
z?p7GFJENnP54i4ULZ2kcxLXX)fas>x7s6kE#!W&K*1*L4yx}LyL?Tl+R>BjpSS%V{
zo(xNwP)H8VhGU^53L>G$iX%0M_J=$X*dMxb;0N^9##a^e&c?k8nr7dB_;|*L4;7?F
z;M1X%EUus17(1QMU%r0h!^c7&=HrN;e5Ih1Q-xJePA8e8<F(eWJ9jTqys92ausY3r
zC)ja&P2FtV@6bsf;YmLcY%H|l01?R`8M5&}8xE5Z;w3&lEDy^gvRC#|X&Z~Q*Fi?f
zH8N)7K?)e+C*wyFq821TB*#MzP?O|u%f>@=pp(etzm_apKjzLXDk;--rho)#CAqSG
zE(e8S8;>Z65-;yPrBXAmf~-|SZ0r+8WfDhi7^3tLr6<?;DTz^#K`pPvK@P~$pNrJ<
iC(hUGBt2u1QOi5Qy9ED19KE6E_(2eav6pcaXY_w{8_Ev=

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_bitmap_font/ttf.py b/src/lib/adafruit_bitmap_font/ttf.py
deleted file mode 100644
index 807ac79..0000000
--- a/src/lib/adafruit_bitmap_font/ttf.py
+++ /dev/null
@@ -1,65 +0,0 @@
-# SPDX-FileCopyrightText: 2019 Scott Shawcroft for Adafruit Industries
-#
-# SPDX-License-Identifier: MIT
-
-# pylint: skip-file
-# Remove the above when TTF is actually supported.
-
-try:
-    from typing import Tuple
-    from io import FileIO
-    from displayio import Bitmap
-except ImportError:
-    pass
-
-import struct
-
-# https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html
-
-
-class TTF:
-    def __init__(self, f: FileIO, bitmap: Bitmap) -> None:
-        f.seek(0)
-        self.file = f
-
-        self.characters = {}
-
-        def read(format: str) -> Tuple:
-            s = struct.calcsize(format)
-            return struct.unpack_from(format, f.read(s))
-
-        scalar_type = read(">I")
-        numTables, searchRange, entrySelector, rangeShift = read(">HHHH")
-
-        print(numTables)
-        table_info = {}
-        for _ in range(numTables):
-            tag, checkSum, offset, length = read(">4sIII")
-            print(tag.decode("utf-8"), hex(checkSum), offset, length)
-            table_info[tag] = (offset, length)
-
-        head_offset, head_length = table_info[b"head"]
-        f.seek(head_offset)
-        version, fontRevision, checkSumAdjustment, magicNumber = read(">IIII")
-        flags, unitsPerEm, created, modified = read(">HHQQ")
-        xMin, yMin, xMax, yMax = read(">hhhh")
-        print(xMin, yMin, xMax, yMax)
-        macStyle, lowestRecPPEM, fontDirectionHint = read(">HHh")
-        indexToLocFormat, glyphDataFormat = read(">hh")
-
-        glyf_offset, glyf_length = table_info[b"glyf"]
-        f.seek(glyf_offset)
-        while f.tell() < glyf_offset + glyf_length:
-            numberOfContours, xMin, yMin, xMax, yMax = read(">hhhhh")
-
-            if numberOfContours > 0:  # Simple
-                print(numberOfContours)
-                ends = []
-                for _ in range(numberOfContours):
-                    ends.append(read(">H"))
-                instructionLength = read(">h")[0]
-                instructions = read(">{}s".format(instructionLength))[0]
-                print(instructions)
-                break
-            else:
-                raise RuntimeError("Unsupported font")
diff --git a/src/lib/adafruit_bus_device/i2c_device.mpy b/src/lib/adafruit_bus_device/i2c_device.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..fa5174c8b4ae35c3bdbf56342284c386bf3cf7c7
GIT binary patch
literal 1172
zcmZuuO>Y`k6n!(m7-I^LVe*X4*rt5dojMQ$Mrl-46jKXZ{RoL8i-k32hDR6$GoxX~
zF^ftM*J{|M%SzpKQDuqkB>SpW{y{cfG=HPZz8P?9RawoMbKkl5o^!W3uvYd|TkTfI
zv^7gs?19|ICz^`$T0xz`oG}Dpzoi{x0KYXXP4BmQz`s8<FbG;hL+d{V%ll?a#Y#(k
z;?e<1;{gyKVA@&f;i}!~U=yq!n3{!e5bLUDs&uX~w7Pm<o;Blk3)>(-SJ8A3*vb`h
zcL7hSn!6V`%Zyfd-L~X`)iNy*av<)v0o3|4DoByTq&VsUh*LjutKBy7U;xsxY?!)&
z<&JL741&>j%O+j5W9rAU*0*$Uwi|lt>`GzQ1+vw}ec5^B)}>kXKibiPrNE$vu>qiE
z4&|P%J^}Hd-FLy)NS05qNj>#t89<r#GIWaax3|us0e2(7DRu{p4g|*%g-&EV^)iDH
zpQ=to7=#>jLXQx1DFw7fjP9#+Ez20(%jX|!R@YW?s(zfmK5YJr>kDsB6Td%AylM}o
zvF4}<Z~*vLztIyk?8G#+M9WIdg1eWvbDB8?&%_OpIZ7N=c9Mk+^O2fvlSZ6HZ2fZr
zJ<uz$ai8cx9?^@uO#(TIiO-1~;wbjRd0GvKe&iSD(L7}qXf-G<poQjM;2@HISKDsx
zF^BL2lt}@U-7f$bDzPZkP?;Y-i={*3I9VCbJ&!&Yo|0U<ay}pV2(7~q`uKswJS+lq
z>){3<Fsw8nREi8*y7|kZxceKSRbC-5O22|q^q`f37p)b1C|Tf8tf9`GffqjEmV_2R
zA)lsesf$SrT~1<)SGApq5G#XbL;c?WCmE9pT9P)xkW@)9lf7#ERomfjUzC{NCs8CU
zPoj$#FnkH&Rr#E~A&I+^NAHn{|CgNCfBun-E6EipmyhsKffxj3vYDOC%YSG6@p=j`
zOUxT*?5fk_5=O2d{}M)DLE&|I?4i>~-KF4~M1D$cR_i<~BuJTQI`2O$gIa!~j@Dmz
zVN$xYSs=fxJA8`TystjH`<7jeN#xg~N^&!Ol1OH4<30M_FY94P<QPaXWwyCjJm8D(
pYQ1J%;7g+t^P5w36LE@BxA;|)-%7Dm@pp;AhxF!+>$!&w^&b^%Q7Zrd

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_bus_device/i2c_device.py b/src/lib/adafruit_bus_device/i2c_device.py
index c605290..7e65076 100644
--- a/src/lib/adafruit_bus_device/i2c_device.py
+++ b/src/lib/adafruit_bus_device/i2c_device.py
@@ -20,7 +20,11 @@
     pass
 
 
+<<<<<<< HEAD
 __version__ = "5.2.10"
+=======
+__version__ = "5.2.8"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BusDevice.git"
 
 
diff --git a/src/lib/adafruit_bus_device/spi_device.mpy b/src/lib/adafruit_bus_device/spi_device.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..7d696ae94b3eb78c5e0909713f7ab42244aa9860
GIT binary patch
literal 845
zcmXw#-%b-j6vodMsC5N8-ED`}R>9JiKVloJG{mb4s{x{c3JNvRWjh_{hNZjNoke=(
z774)%-(^+M7f@fo3r#ff%2zO6IxR5COn!6boB6&ub72^s6lV3hzUg=d(`ufp)#<K5
zXu-9OGtAp9h(?&PLjf(>%&?le36a&7O`)H)Y@@jaS5_UJ(3(!RyJeA=sSDwi<pmJ=
zn}!97YHS%yHy4^q9s{X<y5k4pbiSCM0f}qXt}|RCuBH=a>{4x4H$CoJ)4jT*GfuW;
z>W;x$AlePxrJ&F~=I9zREwb&xXqcx4Od5u*xzwbD!HE0PV5FfjOS3#?bMO88mqpj4
z)CR<yme#om60w?_#+K($NbWE6d(Ce35!SR_>hSnYO#`H94z(>#g`3m+GNOA#>--Z2
zJH(Shf45YFw$N8@FlM`V3kCk^hF8lIYo~DD<-)!5cF!3O;cZ`Tu?Dx8_1x1A<oP8y
zG^bL+#>PhZLAq#8Jt3L8UrB~=Xnw{=J*amwl<Z6O;GR@3?ydSLJSikEq{2ANIl}p3
zDuN@NMb4K}A{MKQ;#zF@w>no{6rQ7gJTeOS`f3r-z?~2ts1V^bQ{n?hSN$8q?Zkl?
zOXE>AfHRdzVG5SfU@d+4b_7LhK0<uP_>^k50n0@JE5#5_RY=c4`R5z|sGO6t@x)*h
z#Uy_vb2_r`0wsPNDAAKZK_3Gp_9;-L_koi55GaFzoKPR~C63Y1<I+A<E99VjFRo<$
z7wKDLmF)QJycCLG_De!FkmK<yB~S|;NTO&UM-d8SgkpglD;)wCB-Hsp?!2iCaS=IO
z|IwRCWpiWW{!VscESJkoWOBvvj&6bLzMTmr|A+cgnrPn<KBwESj{T>BEFJy*(pmrc
mzf|?4{pZVxKl^CyYsdNOG0)Qev;OS+T)x^3b*%)|W%3`i)b%0&

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_bus_device/spi_device.py b/src/lib/adafruit_bus_device/spi_device.py
index 60954e0..522ed24 100644
--- a/src/lib/adafruit_bus_device/spi_device.py
+++ b/src/lib/adafruit_bus_device/spi_device.py
@@ -22,7 +22,11 @@
     pass
 
 
+<<<<<<< HEAD
 __version__ = "5.2.10"
+=======
+__version__ = "5.2.8"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BusDevice.git"
 
 
diff --git a/src/lib/adafruit_display_text/__init__.mpy b/src/lib/adafruit_display_text/__init__.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..254b3b6dfebb1301a25dddc8a1e0ccb016ee49d0
GIT binary patch
literal 4258
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

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_display_text/__init__.py b/src/lib/adafruit_display_text/__init__.py
index 7a46cba..4c54e1e 100644
--- a/src/lib/adafruit_display_text/__init__.py
+++ b/src/lib/adafruit_display_text/__init__.py
@@ -7,7 +7,11 @@
 =======================
 """
 
+<<<<<<< HEAD
 __version__ = "3.2.0"
+=======
+__version__ = "3.1.0"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git"
 
 from displayio import Group, Palette
diff --git a/src/lib/adafruit_display_text/bitmap_label.mpy b/src/lib/adafruit_display_text/bitmap_label.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..ef1ce62f0be706c2aa14606f9fc1816ff1c5ea49
GIT binary patch
literal 3923
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
Hw}<`>&PXK{

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_display_text/bitmap_label.py b/src/lib/adafruit_display_text/bitmap_label.py
index 514ae69..2263ae3 100644
--- a/src/lib/adafruit_display_text/bitmap_label.py
+++ b/src/lib/adafruit_display_text/bitmap_label.py
@@ -23,7 +23,11 @@
 
 """
 
+<<<<<<< HEAD
 __version__ = "3.2.0"
+=======
+__version__ = "3.1.0"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git"
 
 import displayio
diff --git a/src/lib/adafruit_display_text/label.mpy b/src/lib/adafruit_display_text/label.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..2f829b645e9ae9e7699631342d42ff85d16d817e
GIT binary patch
literal 3597
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
Dq{|9|

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_display_text/label.py b/src/lib/adafruit_display_text/label.py
index 7dd64a2..c00b503 100644
--- a/src/lib/adafruit_display_text/label.py
+++ b/src/lib/adafruit_display_text/label.py
@@ -22,7 +22,11 @@
 
 """
 
+<<<<<<< HEAD
 __version__ = "3.2.0"
+=======
+__version__ = "3.1.0"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git"
 
 
diff --git a/src/lib/adafruit_display_text/outlined_label.py b/src/lib/adafruit_display_text/outlined_label.py
index 050ceb9..80e7689 100644
--- a/src/lib/adafruit_display_text/outlined_label.py
+++ b/src/lib/adafruit_display_text/outlined_label.py
@@ -22,7 +22,11 @@
   https://circuitpython.org/downloads
 
 """
+<<<<<<< HEAD
 __version__ = "3.2.0"
+=======
+__version__ = "3.1.0"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git"
 
 import bitmaptools
diff --git a/src/lib/adafruit_display_text/scrolling_label.mpy b/src/lib/adafruit_display_text/scrolling_label.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..6a62a3c8949058cd016fc34528ad2c542a3ab455
GIT binary patch
literal 1126
zcmZuu-%s0C6uwSEaNI0h+lg_4x1_`kCP2bcnn`=u7_m^*F^z~)nn{x}7t>fuY|puD
zWC+!XRt-gcnzX0=6LCws*G;4S7bc-fecDss`qanW{6HI0U+($NcYb{5oLdQlbTP20
z@9PKdp^3G9v*k4OwuX%(Tx=oNZZu5mf!5IXj7Gs}gDK`_VYyHSG&Y+C5cf>n)SXcn
z<lox`z^@%_+Lqn`QQUS&Hz2Ot7T$DiY$Kbn2gEaNAZ=aBZ4A@^Gcv(w%fQ%hK~~f)
zv#Dc48){1$I&@vb!kTIA8%IDUQ?#&lHK(Z`X{fHdIwBofAQC=4$$-v$Tst^yG=@up
z?&n<7w#Y1&i2(N>&uK(=l)|)--Y`Jws$l5&1klGPgLiN(AZXh6M1-uWX#i@PYdAJR
zUlo^bLC3Wn!^LfIt;^GceL?pYb6~s30G%DqGJY5@0S9o{ZK6`g*lB%QEIu%C{cx{<
z>}K)uz{M{v|EprUi2U1T8`p`hI{v-8WS#=419Wh?aPtvfOi{ZTFCnYBjoHO*1Oq}Q
z3xw-lbtWhTJs8SUGZRus2-R+<JQyb4q!bpyH4oARM<iOHYj>C(cJ{SesokNzy;}m1
zVMF}2m7u^>5%qI4v%s9rc`>y581{0fbZ_!B(xXo!fXxarWP}?%7|l{%KD5=p4k#hE
znWqS%C}En-l>#f2Ah8nvK`A&yxl)MOB%376#1Q35VPey4nlO_C)JOCq_~xfSC^<H#
z%ya1}$@{D*%d)B{Dwn?j{6y@@*6-dYU8?rX7pI>4B7EqJ>{DOl&K_<<{*`(g#^Z^z
zGIf6Di-I4YE`wSXJ-+{jDo@WT3*MI=Jy%>>me)ScIty}Eu`*_1Ugd&uu?+rtQrYl%
z*5{|*KD|(X?Qn}epIo7Qp1V-*jnq?w@%fo@phhIwD)M=Wgx`)cFVwAJoNz<B5ZFFn
z`))*4iSq(}7*7zldbR8w36-gr@S}L*+4FMXd@OY~67qL=sq@b_qBK&hqTNVTQapDz
z)8`@TuFl3JWy$+-Vcq8z`-6G^R@eQ$2-h|)iFd>smL(Ohv%A{o1=PJi%O#b9*HaW(
o_WyS|zfAo}ss*nvO8xQmh+tarei>9IQ9Z?^N#SoKDOpAT0uymZ2><{9

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_display_text/scrolling_label.py b/src/lib/adafruit_display_text/scrolling_label.py
index b4e4e0a..6b2de71 100644
--- a/src/lib/adafruit_display_text/scrolling_label.py
+++ b/src/lib/adafruit_display_text/scrolling_label.py
@@ -23,7 +23,11 @@
 
 """
 
+<<<<<<< HEAD
 __version__ = "3.2.0"
+=======
+__version__ = "3.1.0"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git"
 
 import adafruit_ticks
diff --git a/src/lib/adafruit_imageload/__init__.mpy b/src/lib/adafruit_imageload/__init__.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..d2e160a105b884f4f9f11bd8779bec0b4fff8c53
GIT binary patch
literal 921
zcmZXRTTdE66vt;5SWyth6}MVerGgTSfz}!xnm$+-Me$PTCC#>)?ZOVYDSPQK+l2H5
zY#(a+()2s@U9{TETU&em68$P25Sw0}&dE8yIsbG1BXM9d-gi~i)CzWVqUeTNMKw#+
zQi`IRw4fyI1_%z^a_kxcaFrme5(@)(-6pzasx{zU*XyL$DN$zNwn-bnPa3vvR)Lst
zDiws0b_1yz!oaOtAW%?ih!6z)8J!ra4R}qj+cmX8d$C?mvdlWcPPrpCb&CC2n)v-f
zp+cw*{FjpR7nAeAUpgHbuzMQb&NaY|OQ7}GTSw>t*o|`~!v-$SHVwd4^$MU_6>JEK
z@(AHN-Cj`uR1}PCi)N9EUPFq7l}<EO1A&<hOLJ;y(;~~3V`@tn(<NKdZmMM<&*Bat
zcKu2!Rn^IkQ%aUCBXwqP>e`vll8(#N??Qv@P`TBP>+5vSBz*)pHnRaZrT{osZgm-W
zMo&+QsJQAF$RrVr9y&U;lmdH&O$yvL>yB+(m>@0E{lQ4Z!iGw~UT9&0xxd)-O-(-c
z&duMGV%o}96SB|+-OvL$*f-0Cy&@~HqDydzZow^j1dqrGoY*Jy$xYZl%Y+BSexaY{
zKIori!-Jwv@QHrGFSlR-25AL~0U;m;g`k`txHB~IGb_n?W*ZI(lTjc<Zq9)s<V!_3
zT)GT|P_fLs9DViTS#xncbb%jkCYs)v%u+NKHKas7GaZj7){=>}R3e(AF&bY>wzJZK
zq^^uKi{ZgfZ7F*=?Ei4k3BHe1j-Tqu@zH%gw!mid{PaE?Szu2xnf;U3xkKjjQAl`_
zX1*MS&Nb7Fd>k5$GHE7Dw;!XoofpTx%5OrUBgnVm@Im@1Q|=HfCGNIhxJ!h;$!{rf
ye1@=H#6^*ETgve>QTGCaT2So5;&=Jof8#v=vg2KL{D=JhFP6^Y=&Y^nV)+-JBLV>c

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_imageload/__init__.py b/src/lib/adafruit_imageload/__init__.py
index 1abb630..b51c552 100644
--- a/src/lib/adafruit_imageload/__init__.py
+++ b/src/lib/adafruit_imageload/__init__.py
@@ -30,7 +30,11 @@
 except ImportError:
     pass
 
+<<<<<<< HEAD
 __version__ = "1.23.5"
+=======
+__version__ = "1.20.2"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
diff --git a/src/lib/adafruit_imageload/bmp/__init__.mpy b/src/lib/adafruit_imageload/bmp/__init__.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..c44a6e7eb9f9d92ade6b70681251665f83a555a4
GIT binary patch
literal 1034
zcmZWm%Wl&^6dmW?kd{dZ<`I_~H&syy2^16|Bv46=fYL%!P$5*vb>c}f!m%xT3`A_4
zzyh&Ah$TXN0xIv6*M>)-1=bW66`#S5NmD2&n$6WY=iYPfovaV^4Y);FkxQnHiG-_i
z8L7IgqzY9dB}rJLpp-OfV14k6ZKw#qQwG7hCab`A8W9i}!xjM{QZukt23*E2m5_;)
zNhB-C1Rkt|o(Wk+gdh;gU{aM05K*vYsB(>R@l`IXYZfu>BGFACv}ON7+x~V))CgH1
zv?n>dJ2?zOh4#oEW7Q+j$_@e+LKi`OXZ>n@+E>73;G>a1uxuivfj~jE5r|MbRMb^!
z=<dOqg04`-I4en)kZIBVBnd!CGLfOvDp107^ZLP}<Q=IHVps=KsWK)NyO1pE)zqKs
zr4Ii&V-}l5dd`U&snAi!TSpzE!IHEIc#oV!Wtrehh_4`At`I&mKEbyfEM7Jdujz!h
zY{Sq^f)rlY_=1g9#o{khL)|94s%vGe(K&r9%Uc(Dn!zxU)r!sA+TUJqBc9mG%#1ke
zghPqp>1<p%HsL@QbVCpH4tZie&c(VoH|yp+tcUZm-n;|-Lrg5d`B^`$yI^q06<f!3
zv0Yq{4dxp#1iLBH!-d!o*Ufh4M}ud>+m^*_ew4WY*Ry^7faOmoKn}t}4u%VR0UOB`
znY;Ybog2=`xyW`Hb_6Flm>N7am=ewlCuv2Wu&Y0@V-J0~fulnwjG38%_=(x*hMQ?7
z9}%L_+33dWX$G=s*ISC->OkL7^iBu*{#f|`<`1J=&PMu|#mV{Ofk?cc*~dID<>q(z
zFVO6C!o9T#jkeoIir())KT-6-8oHWnA-6bpZAtv;JQ4Q)5WhPKu-Lr4B#MyDWZ<UH
zv`0w)*YqmwdI>jAwTJ_q#FiD}P$#i<YVO)M@hHvj+Q*<5&XPFOy!}I*uEQApIF5^b
w$-j<9W}iNL+<Xb)!*s(}Y>C81^VdQh_O57pzvkbxH7}ZTR0PA1(%1dP-{CGUi2wiq

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_imageload/bmp/__init__.py b/src/lib/adafruit_imageload/bmp/__init__.py
index 00487b2..0c87d4c 100644
--- a/src/lib/adafruit_imageload/bmp/__init__.py
+++ b/src/lib/adafruit_imageload/bmp/__init__.py
@@ -23,7 +23,11 @@
 except ImportError:
     pass
 
+<<<<<<< HEAD
 __version__ = "1.23.5"
+=======
+__version__ = "1.20.2"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
diff --git a/src/lib/adafruit_imageload/bmp/indexed.mpy b/src/lib/adafruit_imageload/bmp/indexed.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..68afcda470eeab0995f41e798dc913907c8877ca
GIT binary patch
literal 1666
zcmY*XO-vg{6rQySzmBtBn~f73aO`DGz_AH+Q>iC+z5FF5!K8$2t9E1T!Cql|-Q6X`
zts-`fRiR!Y^;W69wNj-X3WT2oOe{s}PZ9{qp-PZiRceKLOk)tDCpwEEN-uBT%=^Cg
zz4>NBm7uBJ$V6h15ot_Ncp(*u!=xCA`G->(zmSf>n=t0fWWljYIV*$O_r@|w2=L1p
zMG(`GBrqx2jF6542QxM@0wow5fRPxKK!qRzbAKcW6$JtlBPgjz1`shp&LksQRHF`R
zAu%m0(pXdxCEzN<UO#Gl#o&<;l!11O9NurHh+<L(rgOfIc3%fDl@EbAb0Ar*-vLz1
z5RL-vQ!Q*xMQ+N%ClIuzVLYM;Hz1#YLOh}H(FBZ+0tad!^BE}d8Q~^O0y|8?6ih4p
zKB+^3H=rcLa#7}mG=ESB_QR4Sj?18WL_qeCQ8AT~pe!SgfH})ck#rn_+HoPKB!Ddj
zqhbv55(4%)`SRerglrSiiU>%a*QF4X=K;>6LPkWHsXQ%WN0bOJD-lTnrl^<{C0Un4
zD<6Xy)LuIxYnYa`rC>^wvNr@c4k}YZ8XO5G6eT0S?f1t8B{4SaLo@mhpWXk?;roXK
zDT@9<e^yDL33~P4@Gf%Fhe)6jfLcQpcCHHR_}uHIvFky#uFKWo?f4+%8XTcwx8rKK
z!9W^%SQR(o6|IJbBMu{JbX1TPoQhYrVhvS}O0p8=)p!l6);g-mYDW!O!{zWg+=Nb!
zI_k(ehlw<C7ixzru0PlicLDpb$E@OJ#6IRQlWy+9(fvvn7be}Ph~p&X24wRUF9_q7
z;V@1NzX3>V2S%O_M-5-MfB(&t8q6E4r<}B><xHc6P}|j`E~>MQ?sheaF3RP)*f-kT
z=Aq9}o*qwgv%Ayn3DMNJTIKP#G<SJC&Z}?HDd)$|@WZ?8ntFFGfIXbH+3w8cx3|t?
z+?>itLyx9y_4)JIW1`iK*~sPGq|Y$8tmX8mYI>a1V_U^}EP&lxx~gqnd;eLehU3Dk
zi|h|MZH-}9a(}PQ<yQWE9(t27SdY6V_xAQCp0oWLZbuilJM2%m`?CS;!Qu?jhSs@&
zaaA7z4KOn`zq7Nh$6fU|mMv<V>&3jD_7w9d+1gy!R{qhpXna<E&i2is%rZd}6SS4-
zQ)$b7H=59B>w>z$?x}>E9U|O?Y5c@Ielm|Y4B(D|z?6Yw{!|HXF@VuF;w)vM2+A5T
z@)s}B_0u*pWkX{ieVU}|XSV6%Gb%GWMB6DlMefiiC>wQRaB5!P?P{g%t(O%3f<8%|
zEKtWOd+ERnoa3132`0ASHvG<hM4ZMg1^m=B-nf7_mDO5}xN|1(IpCOJ;a;mD`c=<{
zEoV4wIn~(YRKHNGV!@H?nd?E?#kfDKW4jaGRCBjG-c64NWA5Ilvt=acx#Ui^^k;+K
zD{*J%WR>siwdS+o+1$pDgf|z!ej>c{Y^O^DOvsf30qo~H?Z#goKDzr@U1gr;mglw$
zrM0=j){_~Vc>&#aK^;VP{i-c!`r5m^RMLSD^u4yhhM4biD9dfI*ADOnL@2E;qr;``
z(qraJ9k@Qv_7<P!cAnBW6Dra;h39q=xr@TJO&TYBi^y#Y;!_rt!qN9Zvh(aM!e6`}
zFzh=_P(*GQ$@ed!WM?q{a(aa#N>`an<^Am!<$d|L=??RU<jX@efk1<=1H2qpD3(^4
zzf?3UZJlRjG-LiH3b$Xh8PL1?DeJ!S03xGDMcV)4pFsjqgr@6XA^UV>{p%t=Btlt{
R6HD9ombRaTzP%NW{s+RbMsffE

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_imageload/bmp/indexed.py b/src/lib/adafruit_imageload/bmp/indexed.py
index 044cd51..1455eae 100644
--- a/src/lib/adafruit_imageload/bmp/indexed.py
+++ b/src/lib/adafruit_imageload/bmp/indexed.py
@@ -31,7 +31,11 @@
     _bitmap_readinto = None
 
 
+<<<<<<< HEAD
 __version__ = "1.23.5"
+=======
+__version__ = "1.20.2"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
diff --git a/src/lib/adafruit_imageload/bmp/negative_height_check.mpy b/src/lib/adafruit_imageload/bmp/negative_height_check.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..f04525bdca7f043283ba3ba43cb930a279216c84
GIT binary patch
literal 150
zcmZ=}V~}TIic3sMOe-qQEQ!y|O-xVC$xlqtPs%OO&r3~DEXgcOjn7EUOwTBZPtHh9
z&ekiaWZ>7rD#gG9QOLl~Wn^e#Zen3<W@66HWnyG$Vrgb>WNDVez{Qy0(7<WLAjTA!
e%-Cok$j8Loz^|aDx<Q%YhKuV4Wya6R8<GJdzbwiC

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_imageload/bmp/negative_height_check.py b/src/lib/adafruit_imageload/bmp/negative_height_check.py
deleted file mode 100644
index f16b79e..0000000
--- a/src/lib/adafruit_imageload/bmp/negative_height_check.py
+++ /dev/null
@@ -1,19 +0,0 @@
-# SPDX-FileCopyrightText: 2018 Scott Shawcroft for Adafruit Industries
-# SPDX-FileCopyrightText: 2022 Matt Land
-#
-# SPDX-License-Identifier: MIT
-
-"""
-Check for negative height on the BMP.
-Seperated into it's own file to support builds
-without longint.
-
-* Author(s): Tim Cocks, Matt Land
-"""
-
-
-def negative_height_check(height: int) -> int:
-    """Check the height return modified if negative."""
-    if height > 0x7FFFFFFF:
-        return height - 4294967296
-    return height
diff --git a/src/lib/adafruit_imageload/bmp/truecolor.mpy b/src/lib/adafruit_imageload/bmp/truecolor.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..69597cc107754d7ce92eafa0c7991c5967606025
GIT binary patch
literal 1353
zcmY*WO>Ej`82*eQ5Fo8F#398?85l!Y%3lZ}>xCMYv}voAW-MjZ<QXtv1+axpHYTkx
z=?*#U(EAR%S34wGvbEixR!wTNuI*umwVL*K*fCm`MZ0F7@tSIq?e~2@KhN{N-}7b%
zz{!YZmaA~pc1KWHp~=<whR9W-rKS{B+8w?uHpF&B>Vo3~a#se{LQ4=^0DDzZVB{LW
z`dUY7@W8HgC81RVB-5!@`8Hp<%ySjK4UB>ae2kzpIVmf)WT;qH#5NeK2(r}Rx`N0;
zA}<3ntM!49WxlOIo~vKW5?6-WIv?OiBw&w660t}E*e}m9Q&UrVOzAP5P6K<X-x7?$
zSQYq2g{_M1CZ~V_I2y3l+C1L^mQtg`1B-TD;1ya@M`8Q7)w>>Ra_`8(yF3WD_!_4O
z%RF1>g<2hg>U?<#SY)1G0=@T+mGz;)MS^AF^fL5?WdX*rZC(;#7CM^Yxw;Ha9Gx~f
z8LCwU=%V#)p`z4*U2g<j6;9z;S>f6WAo^ss!b=c9{*NpJR_-Cat|?Pj6iI$L8m$RR
zy;F*m#b)%`YNKbK?Kms6%W&71x=I~RdQRK;1!zG8l7JO8n<nGa$)p*bnMs%plW~(x
zn~z=QpjR?5+4M1Vi!^j<GMP@Bjfq%1rNR40Q;BrUY>B6)<M9;CtjWZ5IzAJNrDG-!
z^WQ?enyj}aDqguGNg`Z2+>60%NF<?5;sfJE3VAD|T4#Ofi9+@YmGk-nbNy#2^ZuZk
z_ZSGn*@TLrm=QCDQO^L05-4dTjHHP$6;;d}Mm!eMOqh$S*dWZU<RCFvoVPAIPX3z9
z7Uz*SRm_Iju_4GkM%oA)X(#OD5HVE5juT!#AYPm>_z}OM<ghz2KU#v7QLh|&Wzs7g
zR$-LzB>>@Cm;iaqS(-!$cfM@6ZaIUy{A$D-r9;7WY`CzF5%3);gwbzsAA26VyXiL+
zHlF5Q+4Q4@G84&{KRkQ$V^z&8yQu&j42?V0jB5A!Dgm0NbK`;F_{F6_G&mced^sQO
z3!VxEW<$ZCKXlql1?Fh_Twvk!)%?Bu{ZDhhui|zmzO$YG<%e7mcWoz;@9t=M?#>P~
zhll+GNrY!EY~6U8n}a}XhsoeJZ1i?=72LxO&J(`thlhtNPjZ)fm<M|2Aw3U@pKm6S
zyZF!s{t`?eU?qv(Uw4t8q>$pq*4jS@-*2i<a`T(LzaOqVT6xUOs}K9gN4>}R#1~0~
z#_&^Le)V+{WzT<$(2jN23ls*akV)f|W8;8!Zm7&hy+ztZxhVXA9`4WnKviji!c}H*
zkshH43ZsUpk^RCNHFB``8%^~7xbnu2S*lpvhW2hldv~{?zq_=1%WwWUH%qzK{-WKG
z=Khl&Wn}HT3z|eh`}Cm9-Yz`9s#UA|g&TX%kNYV2^E1~NHJU<hQBKOW|GM7pr)$L`
SbNkvY%`s@61DX~#l>Y@vYm|Bb

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_imageload/bmp/truecolor.py b/src/lib/adafruit_imageload/bmp/truecolor.py
index 8f17b79..280f19b 100644
--- a/src/lib/adafruit_imageload/bmp/truecolor.py
+++ b/src/lib/adafruit_imageload/bmp/truecolor.py
@@ -25,7 +25,11 @@
 
 from displayio import Bitmap, ColorConverter, Colorspace
 
+<<<<<<< HEAD
 __version__ = "1.23.5"
+=======
+__version__ = "1.20.2"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 bitfield_colorspaces = (
diff --git a/src/lib/adafruit_imageload/displayio_types.mpy b/src/lib/adafruit_imageload/displayio_types.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..24ab0e58d2d3c1d4369cce12635c884e30d1f0c5
GIT binary patch
literal 331
zcmYk1!Apcd6vjtaw{5dcJIrN;VB3?sY3(s6s_9TtumwvP#5Aj>1L_Pq2Hxz_zuCXi
zNNvQsy!Y{akMD>2;9#WqBqDERO$DYoN#cx=$ct#jGty9oMZ@FD<qg;~5y>*L&SGFl
zkroLUElCy&A%!a{a>Bv>Uk(^2?&8>8fRD53uM4rF5@j6<R)Wb-;J<VaF@BHBin0P@
zU}9XxoXJhUNQL0lsplnBr1jbjS?+BrdzYK;h?b#bST-V+4{ke>J4xco5cnL-q4L@q
zllkM(Gn(F<x2EbS<DRWTHE2!E)E#x)w>7BQI@AM8wFWcA(j0XKx4Wa8S<jNL6&(7*
VCu`^H8U?=cVs1g>5WwAs@EcjsUH<?8

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_imageload/displayio_types.py b/src/lib/adafruit_imageload/displayio_types.py
index bed5efe..e809927 100644
--- a/src/lib/adafruit_imageload/displayio_types.py
+++ b/src/lib/adafruit_imageload/displayio_types.py
@@ -24,5 +24,9 @@
 except ImportError:
     pass
 
+<<<<<<< HEAD
 __version__ = "1.23.5"
+=======
+__version__ = "1.20.2"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
diff --git a/src/lib/adafruit_imageload/gif.mpy b/src/lib/adafruit_imageload/gif.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..3b2c1a31afb28eada9a46a913d411f9f386bd8a4
GIT binary patch
literal 1712
zcmYjQT~iZh6n-~frXj>-6W0ifESoP9Ac--?k9InAiSngD6i8R6jmu_(sUeBUrWSkQ
zZlx7#r_<YB^rH8@NP<#PxhRMT+N)kT)OPH2hHEhXfu1DLaVE1ld(QKo^E~Hyw^xVS
zPU-`EoKNHmNhy|`=BLC|hL8KEk_m5i2JJWIrCdRfkYTKlO^FB}ki;A>WpW4~$x6vg
znolA9*<@ZqMrkISOiv+-EhG|RPK=)y`M8)vnq&r<M){N|Ng^_`NoktTA|js5XH)zP
z)a<*p-b}ha3VJhj*t@C2|DTA#ATf`ON4x>QH-Jpp-QL9MbbKTc<|Q7P&R&d$lfYVE
z)q<2SjfHfU7p@}X2mSpl%OWzC19q`Qj-Linkc2d1>dDDeMz{)8M1C4sQa7&0;-Zj=
zgY@b%mJ-v*xSO#NwNyTNLqrxKCGxpg9Vw>c^~g|t&jSq}Hl#GpoFikg&&6CG78i>l
zJO&f98Hfh-i6m^-I9Xp$MpU#hU-vP6ysAb?PJLz8*E%avZO;`+%H~h`z#-{MVbUvP
zrhR+<`99h+vNxF%z|hed=?aV*sM>lKR^f$1NT=%?ICJ7SzZ;z7k=8Vvk!YTVJY6HA
zJ+!-3n$JxYrp2^G=frD;B-jdImXFi5EzwmgkoM3(8g5037r=iy4W06ZY&MgV0IWmk
zuCdFHUG9+^&M+T#1upg4<9GeD2WJge={s&Y(xM_&{i8Cj#x=MW*LgH8`zST3rZl96
z(vn(AN9s5k*L$#*_b5H7huDBOcvLM$%0L>Z2C{)u@J8GOnf+8F*+`j46E|pxHaTC1
zd$~dE6C5X9Hbiz@=t2>^Y4Ru{Edh+Q22^D8SU`;vP41wYB*p?7+#FPq=75%Li3qyy
zvp@bYC-<-xPiK>Cmkq8?mvh8zb9FeJV~nShc01gTfi5TODOwJE6T(*JZJ15ft@`_q
za39fSQwK4TP+3U)Ae3*1u#n2HeX{y=ZEb;3(6;<n_*%KQkLb2(0H-Y6-c~9*&&m&i
z*!lyRJr~`8L$^ZM;=>7L>*I?rd%YaTvXS)#M$T@}zELXAOZV<8k9L%|LG=rODj`fB
z|9$C~&F}zWEj|vaI5xTT^JaK_ueL^biRNMu3u0^R$P)AZW|(CMfu$Cvvr9K0FM3qM
zxBd;>YxQ)>BQ)rAxjUSGH^X=xopuLPQ*sEp-Ki^CUI8t@rl+c;kMP-a&}dKDr@MOA
zewEpw=xSZcYF&t*<Muc`lh@@9qNT>`K~NPNvOj+m8)|*=xKv)O%s;GnR1=HJ*81YT
zSK%}A`a@-FgKcM<Bf_oG#U4wuM^4aS0pr|j_ghJ>s=8E?+2QE&UUrJB&+Uc<9*78E
zARRH6ZSs>xaDog(gs(IRH_u5uv-<euTGmVk0*E{e*TW9iqctL^Z=q((;ZU1=-R|sg
zI7&rpn^M{-TIr&hRw_kndnYPd8QZ?1)mF6FLx_W>c)Q6Sl5f(Ej(XnQRz*^PG&7Ni
zS2Yn4?&7SsHFRA5nszyDE{DtG8}4=l=wp3udkH#&k@ar2eFD6<Z-!43L=cJ9+RN}D
z;VpH7m&@#DCE^4$4Pt<){23mGxC(!(yd7U=&lSx!_{oY_HC|bUD109376(M-dNPD@
z@0?dEO3_U1yb6!P-*+#8LexwtTNkZV8Pt`9xsHF?u9l;1@=vsrVVn%jba>!y_%6_6
zgt-KC<dyyjA_&*)N&hK%wQQzjHWqz)|K9u?WqV=gpVfI~Yh`}!Rk&YXsl)2tP#jmb
jwB8S4Qyi-wB%%cIIy}VH5FC2~zF+v3iDSFpazywKxhf(a

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_imageload/gif.py b/src/lib/adafruit_imageload/gif.py
index c3099fe..e35932a 100644
--- a/src/lib/adafruit_imageload/gif.py
+++ b/src/lib/adafruit_imageload/gif.py
@@ -26,7 +26,11 @@
 except ImportError:
     pass
 
+<<<<<<< HEAD
 __version__ = "1.23.5"
+=======
+__version__ = "1.20.2"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
diff --git a/src/lib/adafruit_imageload/png.mpy b/src/lib/adafruit_imageload/png.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..76f0cb74c8120280015804cbe897a0f00f8fc0f7
GIT binary patch
literal 1063
zcmYjO+i%-c96ok)@zOMNT-PnD*Lktyq!*Gcgdp)SI>%d=YIMogt+)sUH$H8xCAMWd
zgMb9KibQ!p;+el<?83Gdwn<~_1{*x0NN9WFi5FC=NxX5~w7@x%f9HJX`@Y}B<p?;!
z#|o;ZF57M0t?Mmy1vX7p%Ui}u&gy`Jtkhm!hBnmBLsf$|2<avu&snZ+8fp{7=G#^i
zg1FnUbYlf1s%jIuE&?RoZK)QZG~Kb9Y6ppgy|=PyIIi7pxTXzKJ=*`Fv40hHWC|S+
z@38^#QBz+6@#DF|v0MQpti4P`P%ZF3j<*d<ZCnP#iAvD{<cUf}3Kn>aa3H)4{4}k>
zhS{=g=s4hQre41SZ3i_`uLH7Px1nXC6S1rZ-7NKrH+`&5w_wY(J6Cl00SHg8x~}EC
zna{82?rM7}hy3#UqsyP%pJ7?I8)%l*j=PHNE5St1q8f8Z1R}&2)w!90*r6B*C+19-
zQ#o|!cGE^el{4~r5I$TnTxd7d2GqFS|KV_L!)aTVX}eGZkx=#Q{3#G-_vXpz24|SY
ztGc1V5BDXARgq852jSG548lXF^(HcP5Yy%U^IE5;#<2INz5dixq3~{5JS}KvWRJur
zu+csiXK=+MLu7aYAC0gfCd7uBFhZgvfsg}il!>wgLnuBOBl{5&XJbr^?PvOx+1Ntz
z&<nY&%wq3(wb21)0DTiof;`BK@_=D4Oo19nF1-erWUYaHP5k}Ux;NcS9v&mTw3o<;
znN&IzEUqAW#2frfb~2NmO=pC3=5;YAO4-TriScYUGdV6U9=}Rc>m}^Lbsqaoo}rHL
zcoBoyK8h=XA8HS4kGw7KvG;@;pa)61M=jyU@E?EL<omj^yNeGY{L2!C@aW?wTaTVT
z`}r<%I?9KT(|2CCT&5WK{a%#*@HY8ySHACEt38)zuhPRCehF73^V_u`{ZT%GL>p@_
zf4O$Ah&{aLN#_<s68W!{u$uyT$^ZSG#b3))iXv&7e6%ai-JnO%>juh>DN=QlC%UpE
zUD&rp@v~j~yPr@A`js0cOiX@r`;LF>&tjiQ-M+Q+`S$utaga(0R1p*DJD#-VEr>(H
zkTAF-GC}aScl>Q}SV#)P{$Cfx5n;sZ%8S7j?ZNFFeo>$W2JPT{NeVhRfI8^adHqvG
K5vZFJc;g=nOg=RL

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_imageload/png.py b/src/lib/adafruit_imageload/png.py
index 55f6226..1505d88 100644
--- a/src/lib/adafruit_imageload/png.py
+++ b/src/lib/adafruit_imageload/png.py
@@ -28,7 +28,11 @@
 import struct
 import zlib
 
+<<<<<<< HEAD
 __version__ = "1.23.5"
+=======
+__version__ = "1.20.2"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
diff --git a/src/lib/adafruit_imageload/pnm/__init__.mpy b/src/lib/adafruit_imageload/pnm/__init__.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..d372fff296efea44f075dc54dc7f130b9791ca8d
GIT binary patch
literal 1211
zcmZuv&2QUe9Dbb-$4%4rUFv!tbyqKL8k%HDm!&zNfs)v0tSzD$3zM0U>m*KNNMg@+
zkfJfk4j{peJAVMzu1yMTPzh-pAKSQa%3<Qfi32ypt-N+p*250|>8Iy;-rw{4Fo%Q1
z^b{}Eq`KZwOi^h`J91N%YH6+AN{gb>MxdC|x?m=FqoXxt0I!*{E}5zh;M<z1sBNhU
zh)u;X$4mujg5@?M0OX`*Q*wZi+0~Tx4xo#jdR^A#+I3l~$vW^UDwy7qnzCskQBg5l
zk_N&x#n75k7ja8tj#Jx)sduW5ZDb@n37!A{g@}w~1B5Q6GOMW!2vtTUr?s&M;migI
zLzX`TxVF;*-ms>%M9HWs3Lu@dqO>Kw3wp7zR(V07bWGTH>=nDvwM*ocCYrjcwzSuQ
zFIoj}QKI;ftQ%-@Q3OyFby-tUM${E&1C7zdHfG<H?bjy#`G#p~#;fV{j$$@Cl@uzJ
zK0ZUbaC{F=(W~e#TV1n(%3gD>vxz21p+^AsY-OCV=7h^m$T{JX6SBZxC@`bxnd*z}
zF^a+H^6id-Zot%4oiQ5-ahArYbq3ws0b7#ExJ~2UqoX5$1K?jMw~dabsk({Yxj)IV
z@XiJOF2FGseL?WW<`o9B0@h??@%Hw1GINVts=ZmUpa*)P5Bebv1CWRZ<|k+m<)OWl
zm-bOU+E4juoWkh<6`%=<5G)vsWAl@AkP4za1gGMj`Dr>th3F}2O6b8E2oZ9Mo}p%F
zNI_vec=J^B51td&vG-w^T4n(idnXA>aJEu{WaToT=1NuUtK|JJKezH9&%LrTOIjB#
zA{Jw#`FMOo+s-d<@N8=w*VxD#i3l5wuDGBZV#~?pNG8UuUA<T8r99<_yCl`iVL}2t
z3dghHaX2x^VxJ88zpXxtv7UtIIe*KBr_mH==+i$5-;i^={Q;cagXDhhQ*X7;dWXDd
z!?Uj7?9altNHDO<1G{`u<a0&mT+z8-gzsJ=a*caK{vTxQXK}~)FKdsx8cwo-EGF-b
zirQK4ucasZ{QAC~#h$Rl1MA&BInVlYn9~LA8qiOL?@t)qhvWmNRU0n2^ujaYhnLX1
z<as-X{dUMs4EarD8YCC{ISe@;vXevpMlnAUuoG+u_4YfrTKwRUWO9HL5BT>6<c07>
zc!rE*z(E#so}rbx`z-PYhkrgUetj3+&0Z}KY|8p90d~cWi67z8y?@hWajp6v8m430

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_imageload/pnm/__init__.py b/src/lib/adafruit_imageload/pnm/__init__.py
index 971da14..5271bb1 100644
--- a/src/lib/adafruit_imageload/pnm/__init__.py
+++ b/src/lib/adafruit_imageload/pnm/__init__.py
@@ -33,7 +33,11 @@
 except ImportError:
     pass
 
+<<<<<<< HEAD
 __version__ = "1.23.5"
+=======
+__version__ = "1.20.2"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
diff --git a/src/lib/adafruit_imageload/pnm/pbm_ascii.mpy b/src/lib/adafruit_imageload/pnm/pbm_ascii.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..b5aa9727cabfa1721264d0409dce933cd9ae791c
GIT binary patch
literal 465
zcmXw!&2G~`6h^O|Ix&e!rzMP#Y6&T+D6%TM4N@1Zh#m1$foK8I8dRByJ&8xM<B>A~
zA~yB{o(Cu)Pf+>@s4G@ou;vAr3M$>jCtcm|+~ZZ@CRXp0hz#>769G%fh$b0{96nAR
zK1c&H2^q8b43_IJraYm5o^rvmF-gD>GtR~%Fx}~JNOKxJqa>m^EU^rldnBPkP%vC3
zQo><1ViTT_ncNxMc6ZC}f_?#l@<Z8sf`i~K%_p)q2ml2^PI)GiK4g+uf5##bgAr3U
ziUk;he~nH4AEDigh2WFBjx%B+o(}9VOPxz4r+4Y*u{@NHdovMB%%cm_$MOMN9zj*v
zhL2+NhEmjuM!UQD+FOqvb_=AUilweCnJQMz3a<DC(kx}IYHC=MxrTJPy<*mI&D62(
z@751in!oy<zpEUfI$rJoM*EiX{0`v8eyDsxzqQ+qmDOvl>&5z;&aHNPW23z#r=y&F
zE!_79KZ;W~{oFFj9pz-+y1E0N>mJQJ%30ql-Cl9L_-?5$7hlRhXMNXwuqe+@=N>B0
P4`2QCD!zaG%~Hd^ANq>o

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_imageload/pnm/pbm_ascii.py b/src/lib/adafruit_imageload/pnm/pbm_ascii.py
index 72eefd4..59fec9b 100644
--- a/src/lib/adafruit_imageload/pnm/pbm_ascii.py
+++ b/src/lib/adafruit_imageload/pnm/pbm_ascii.py
@@ -24,7 +24,11 @@
 except ImportError:
     pass
 
+<<<<<<< HEAD
 __version__ = "1.23.5"
+=======
+__version__ = "1.20.2"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
diff --git a/src/lib/adafruit_imageload/pnm/pbm_binary.mpy b/src/lib/adafruit_imageload/pnm/pbm_binary.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..40bf2d094bab8fb606ad3a3a2a13666aaded47e7
GIT binary patch
literal 615
zcmXw#T~8B16ozNFrL=V|(+Z=|O(aWAbtSu42q7jWuqB4iNd0OWVz%4vww<IOlkHT~
zc(YT9a_3(uAfR_@0{Rd1&MPj>O8f&(RnFCUa&pf5o;Mo;*JWYFvaO2S!PLYJtLoHS
zmaUU!Lnoz%S;9@r?P{b8Mxu{9r0xLtfKc3OT6F+dspDF-<pPOz32s(_Y;-CW$93$7
zj%7P82;vrqZCQ1PQU^!|rVWdLgpJ#zZgu%gx}#-gv<wIjGy!`FF~3;Cv<=v8w%r@v
zM5g)Naob$aGyybC*C8$5g)5jliN3%#tpTa#;A)Kmi7yWB$H;#{u>{z?p~V`dq<vS{
ztC-e0C9T|Q=ob&`OBbJKv0LT|Y;|dkYpo7)*x;Ttz69O`rzZt(*o!I))7#mUy_?*L
ztSop?gaH^-1IZy-M4}u(0Xc|*1rLT)Avr9EP>A<o7*WM!R1TxC96^!7S~MR|{8-Kw
z)`Vy961p-4&}dE-9?b$IWdsz<h$x;b2VRHSm?n*(tJlW8siLAxrl*u!=~OzUq*d?4
zJME8NX7j?A<E&x0iP-U+V6NZ%`u^bXNEM$Rva^%JJ@)(i^8F)rcIurR?f-=WFT*g9
zAs)O_#d42)Sd7IcyoI86BN0y|M@RY)&Wm%xC(l^Vf8N_aXMVN7&hoq8vNMHT`PIre
sj8Aw=MNOaSD~$L%=l!?-&aa;zIc@m8^S(0c_x_>kGmhR9pAESD2Ys~3C;$Ke

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_imageload/pnm/pbm_binary.py b/src/lib/adafruit_imageload/pnm/pbm_binary.py
index 1d52a8e..af402ca 100644
--- a/src/lib/adafruit_imageload/pnm/pbm_binary.py
+++ b/src/lib/adafruit_imageload/pnm/pbm_binary.py
@@ -24,7 +24,11 @@
 except ImportError:
     pass
 
+<<<<<<< HEAD
 __version__ = "1.23.5"
+=======
+__version__ = "1.20.2"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
diff --git a/src/lib/adafruit_imageload/pnm/pgm/__init__.mpy b/src/lib/adafruit_imageload/pnm/pgm/__init__.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..d0e9e6b4c7a3860f66fddf122407b49a04b4f15b
GIT binary patch
literal 577
zcmZ9IU279T6o$`!<ZInDlNiU^EOkjr#Sjcu?WIT)P-?}*Hk755b+S8&1DoAtclIK8
z+bUG>#-C#2=O6InC+L-b#Ys{`gyArp_nqgwXF6H9zNYRGmyDu>ahpxZn0f(m+o3;c
zhvP}xwwW&k`&KxGl6H`U9tHF?<Sg)s2ibkfA-~6B4mzKP%pZfXlZ-|*qV6+FTpEGO
z0$Ax0k8(~y-(h@0La4Yb4m~mz+Qx;}3H+ExiNk{k>Py?dt@XbzY%z$&pbwX*mGFX{
zpXUaR#13Pi2-zpm6rSWqOhjH4i!sOclgUtI(qAmI*_rj*+ok}Sb5m@Rh?;)D%{U3e
zAmY@8tlZn0mwS*|J0$T!B}0#zJTPPGyXNA@;OwA<r8Jjn_4}=@Bj-^sMKV&5iZV^L
zmNjH78wyqo6{|)DXRH+Eno=!q<Zw>h3rK6qwM#|;7Yq$+)=Q+LqUfv`I@XOME?T?V
zVfo7MZpYe{j`v&8N2OsOq2V3C<-Q}G_1?UFoj%ws<EyJBl-8f$ys^>UeB2Xfb~>n^
z!q4u*%C!dEmFO%Te4U*PzMVIuU)`e<R1q;Q8<p?Y=W6-g$4{vA9-$B0uN3FJAukNo
Qg`xVx`tqMa02KlJ1820NdjJ3c

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_imageload/pnm/pgm/ascii.mpy b/src/lib/adafruit_imageload/pnm/pgm/ascii.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..fc6293c1f509fb78481becabcae47182ff7c12a1
GIT binary patch
literal 807
zcmZ9H%}>){9LJxh8>4#>O07k<3UhCjZD9-6MH62_H^G2!6T_@88Kvz;W4AVI7ehSQ
z%E5T@;$Puu8xv48##a<H@n$@E;_TI<6$VjH&-eNMUOwMn)&+**aGV$UQmrl<MY+P4
zB}L`Mlvb^zv~nfI>w+wgXbYg%bG5E15^zmR2EZ<9hOAb31^A2wO|F&!#nwwDsV0e6
zBwmziz$vSs=Q6KIh9LnTD;pJF1Gp&bn!+#GwMeIyRjayDs|$u&1EHO^zpcT&iJ}dX
zbb$Uz2T(&&6ky%8#vE4O#f!G1OVVv%o$$}qWkoD%9WrrJk#$2*E81z`j0)faT9WM}
zJa=T#m<PUjNiNSDz&E#(uV;7c{(uFoQ&z#^{2i+(D7>x%YVWHmYE1{YRIOK}8gCzI
zb$ML?JcuOy(Cjwdq2tNX8^XiHxk(d4FbC$0I|5x4LL!udbWl#x$(fid4g=kki*(r<
z#oTcu;Gs|wrQD>OTg1GW&vy1vUeZhXNFO)pDfIb&<g(l(yp_+#k?Es=>=}h*e_lWy
zoo_yd7kdKKp}`?DI2((e4brg?ou;F)P?!!y5;RRmgESqArH7&oqBjHH<3R>|zz;KE
zy+L4B27X)(gYP+(l~;+r49MQZLl{o%9|bE6%s>WyS|*5R8OUu<tgLRWvuJ*!otwb>
z+sh2Hk>6a({WO=FEj+x;K*q7zAPzjW+gm34)hv8&n(QmH@Z}%eHil)#x0l5`IJk?$
zBlaGGw2^BsU&N6aYwOzeZ`rkb9JiyM*lO*091##JJ%%0}Hj@d^C{DRwV*|}!DS|yF
zbo?{_`-@->?~lgJiP_=gNCOWy?Y!^}PTOyB3Qr?%-{D8v?RLV!z}C_Xn`{Zc0gzAd
A82|tP

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_imageload/pnm/pgm/binary.mpy b/src/lib/adafruit_imageload/pnm/pgm/binary.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..99ffd7cedb4adaa69faf0448236856f37877500e
GIT binary patch
literal 669
zcmZXO-EY!R7{*TvV|>ZFW33K4n2a%HWGu5Gn%%(?7l_%|%&;2M9q0iX3$1O5A>Op^
z!WeJ;L-^F`yz+aS@zzVP{69R)a4|9G;yv&CJn!@V@*WVI2OCI6HKVOqlF~$VtZGQk
z=&fc(uQxLlrG<>nvfcqx{=02m#emt=Ek$b~6?k^A1%g&bS6X$z=i0RzHn6;nk&F%C
zRx}XWLMpZ_41zhuY9bv#Suu4Lb%>T2Yk93@T1LBSX$FX&+5R0x&o?A;2%ErriU+(F
zR#o6U^&puvCdQ9|b1PhFE2=E%<D+-HHHGl{pD41`0Ko=U>J7qMIYSBkwLP10Hk}El
z3~{U7#0Da`ju;-RQdLE!3Hb9?Q#Hc`&lBk|Wl!3^_|5d{gX)XeM!{xi#>Kc(uE+#W
zb2RVbT)dlei#Fp)QISdB!+FTx%lJ}s#Ls&<FYn`g;yx2#f@E@m4{!lK$OXlMzdU{E
z*Lq$oP!CI`6uol;aG_O-V@p-~<yP+%C4{)kS7yTY+}=VmnOWG5&o9OkON+@&dJRSd
z@VU!QWx<!eokQiXkcYEfmg!|FfxK@AQqg}jVyE9`DKRHFzwh1unGcI%>3Fz)8?wWZ
zKp&S*2J1iUL9Y*^BeLT<>9X)Ov6H;V|K-8hfj~(`ZiW7S1m}pKy-1=D-@i%GySZy;
z`F>G6e3zoD`=A2Zt8sg6?|OQ<3!}YLq7N`es#Jt4^v6$db~qd^xdf^|*v+N;)jzJ-
B#`^#O

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_imageload/pnm/ppm_ascii.mpy b/src/lib/adafruit_imageload/pnm/ppm_ascii.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..fa95ee33ec4224df9461da306d8cd65c1e4daaf0
GIT binary patch
literal 909
zcmYjOOK%%h6h7DQ7tUlDZd)=mt(}aq9qeGHR(Q%8TNP;n)D$Hh3K}Nk8+*jqGn%;u
zSuB_dLV(!v3-|?ow57Ck(N;hoAjArF#j5{-B{xlqxSRXwob#RYedjb|uviV9)jRs0
zJ2a_g_Vq5YY`s%;2K}nz^flcxOta#QU@r4wrM6nBLF&DsV-essC~<XayTHBUP}3gh
z79_Szk3#GMp^%{?#~gG)REB$d#3h|~iQXYDL`)m9=XHxvN+6?{w68nBcTCT*^byM~
z9p#$#z@zTaI2e#SEc<`x<bMo}4I&;S4pc*e63c>^-eJ%q<YNe4&be%`Mtd$HnqgbE
z>p}2Yus#Y0ZQ(VG={4-W^9Dqg4ZxcA32{B<Mbm)OG?zFwLvJPaOlCOsso9}D$n=QW
z?J<M9huX8wk(vDy!46Lb!~Vfq2n1??g4cuS{;TO|qerRZy;7}qP1+moR@lhulbu)B
zpDe#=x&}MK`4R0g1seya*kYzCj07=&uRAL_<j4K=QY*LkWqhS}$@oU%Lil7J@Zy`>
zJ{RU9T$GD(@ltdlA%<~SjNphE#ZfVaV`3b~Ri8_i&_YT~;v~aqE>j9EJSC=aTFl^#
zy3b{~ITqo>EY6B^cuqZ++L=G~cdMzMLm#%=rO<_!0MFMD#%&|??b^NX(AxazTz+ZU
zFZ;=5sko8L7gwa*QlTtK#nm-llHupEz}Mjy9*<?DZKi&`B0T*=9jS`kzI(ZK=`vrq
zA|n~y<)3Fi%ddv+-M@bA$8DB>Fl+tcj|Jf>E1ylKhn3+6Q(tj+ew+A;vGe;;*JJnj
zBBKk>T(6@WH-9RHwpI3&M)2t3`+qf$tLh<0s_KnvrI7Iz{j(wA)Bfg1jr{VdLSaif
zQz(|3QW<XXB^hpyg=0Y--I)o;>(Dwoojtm(^rp>?No#kOM-N*cOoS7BnR`}PsKHc5
zbta!Fe9TlDd|@J^FCMnu=2!R^7?e?0WqltLmA0XL|9RU$!RmTKtoRqpFxEDcx47pf
K|5OF#jPWmx=ndik

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_imageload/pnm/ppm_ascii.py b/src/lib/adafruit_imageload/pnm/ppm_ascii.py
index ac8ea8a..b8785fc 100644
--- a/src/lib/adafruit_imageload/pnm/ppm_ascii.py
+++ b/src/lib/adafruit_imageload/pnm/ppm_ascii.py
@@ -16,7 +16,11 @@
 
 """
 
+<<<<<<< HEAD
 __version__ = "1.23.5"
+=======
+__version__ = "1.20.2"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 try:
diff --git a/src/lib/adafruit_imageload/pnm/ppm_binary.mpy b/src/lib/adafruit_imageload/pnm/ppm_binary.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..af2020337b757d40109ff6ed2488ae8049b22178
GIT binary patch
literal 736
zcmZXQ&r{Pt6vsDdDW${`VqJws(6$0bra|m5>PgcwgP;QyrA9|XXtwQ+Nt;QxIvt%c
z!GlLH{vrGlMHEgdg2K_!izogA{{R;Yj-#_PyKmpV_r9O~rURfm!HnpJUT|udXxP$=
z$gJpwY?m$Bwk>T2mvyI}wCkWPbfadQ2=L=J!IiRZg1{sqfFpGqmy1ADYJ~!FkZ~R9
z26BKOS3r0|HxVHSa0(`tZUe!<Rom3-^ewUfmadem#Hr;;#R0KK+25(IKOGtsLRG+>
zO%4tu2SIQT69fq|P2fEW=mx!15xNh&3)i5gJwQ&CQfeCDHO)bGg+{>wru?CY*dQgq
zl@KnLDE~|YEo|?z&USd?UXzEtoPf$T3pqOdfTuQHDiLB=FUoQelTvLanXg##fpPNX
z0|(RC$x|mM>ZC-~uk87Gm4YT|6L^;C?_}I&HxxVHKX@mdFh)jQp5=YKU-CtpL>985
z5Bfwu^s6o(keFz*7=Qs92l*C>jfTV^42mtVMV;kad5&fdiLJ0z<RGVxhH~vkeq_?>
zD07z&Ll_6}Xf`Xclji_z%jTKqecxU%O53rH&Zy`nrl)&OWqRb{d$IWGekqnX)7ul1
zhkI{M%tiPi@Lo8c0w3m|{`|P$Dpqbo=n}f;BJHn+m=s-~R<tp=xf~JR2q#uj%<oO|
z4Kb?H=k4CQ{WTp{)$G<%Mq3h2F7GvL2{C$VW8nez^B1A}U5Z(KJEaU{w-+<t-NpHZ
zMwxGWE^_!K9YZxA=QiA(|5f9gLYz*DME+4;TYoLFQ|sRDjuLGktUXcHwN;7D{{mLb
B-<<#e

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_imageload/pnm/ppm_binary.py b/src/lib/adafruit_imageload/pnm/ppm_binary.py
index cada568..326435e 100644
--- a/src/lib/adafruit_imageload/pnm/ppm_binary.py
+++ b/src/lib/adafruit_imageload/pnm/ppm_binary.py
@@ -26,7 +26,11 @@
 except ImportError:
     pass
 
+<<<<<<< HEAD
 __version__ = "1.23.5"
+=======
+__version__ = "1.20.2"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
diff --git a/src/lib/adafruit_imageload/tilegrid_inflator.mpy b/src/lib/adafruit_imageload/tilegrid_inflator.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..ccaec3574db759f783f906e4208992488e40888b
GIT binary patch
literal 1019
zcmZWmTTc{86s~UO0?mj;&ulF&t+dQQ!eC}tB|Ny1z|2HIK^S$wHZg5Mmov4@rPE!w
zVD_OKRE*Ci{tYgQm)+TY^L}~o!8c7d**_qO&sNh+Vs<N)$~oWpzH`2+%7#E!Ja7&h
z_?opunNBOXNXj*Aq!}%fqD2jzR<D&Yt63>?1ss$OYMW)eLTe!Le-V%_E}3Nl;IzqT
zt%}Q_d6L=;NQEj-L4>WCv|0phGq_9`BOsEYtb$F@F<s43dvQO57y0NhJ{m-RP8}ae
z9S5rKf#?lWpxN^X)CykYpoOcpi7is)lYXNHD}hLf&|-;!4wEjEvTm2KK`apS<hsv5
zd+|PP3hDZFV%glJt^=s+7BOpHG+!}w6Z3|MVXH`(ZqpkC$a~tou=~5={G|-C4B9+V
zZT?q)e6@eoQ8&B#i+d_KQew=sPo~pF%1TS~sfAi4-FV3KXyY5Q)LP)*F|)!-+|q>i
zDU<xdDJ}w%7#2?O9UPomvYBdP+g1s0Ml7{qSFQOmccJ2{v5)&kJoy0M>%Sj6B3vDD
zq~6or!(HRqgfZ&mJ4Gb&vk5hg4?8dbgD?cc$v|hb5<meZh=NK8g_JM~YYuFI5^RML
zUKN!V)S^g8Qd&`~5<wB|j5ODdKIgL98Q}^%fPRbv)RB)1dA^dN3nu_-%P$D`OaI(+
zg{y6ce(F>XA8`^6OpmE*?^JiDx38zaZ=$DnJdsP}mYr}<fB$r{Z`Rw%D;xPwx%>lu
zOg`ktnA{Z?2L-~>54kD1DRyvUNEi^GJ<sGGJbU<j+k+Qnbz43<DCTCi^|R88M=|(#
zNYFBane$$un-?ZHw(VgfTfFDFooM^o*Oxm{dF|_~%=ng5c)8^kUTr#s*PCwPjV#6@
zJ23hP%74Q4KVa+${Nd@)UE!@$k2lS(*6Y!Bch^aZv$yL`Ju17qJiOzhjg)s<-E}gT
z=ia&XzuYe#dEE;db@$&(mp^8YY8oHs6W_1Zoxj~LoOsJ`<tP6o&d<Hy?>#;D?xxrB
Pd)_fk^96@At-kOL=K@&C

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_imageload/tilegrid_inflator.py b/src/lib/adafruit_imageload/tilegrid_inflator.py
index 8df1a22..3c424b2 100644
--- a/src/lib/adafruit_imageload/tilegrid_inflator.py
+++ b/src/lib/adafruit_imageload/tilegrid_inflator.py
@@ -25,7 +25,11 @@
 except ImportError:
     pass
 
+<<<<<<< HEAD
 __version__ = "1.23.5"
+=======
+__version__ = "1.20.2"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_ImageLoad.git"
 
 
diff --git a/src/lib/adafruit_register/i2c_bcd_alarm.mpy b/src/lib/adafruit_register/i2c_bcd_alarm.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..882b011cd50c5d123ea1b7232c5f6ab8f898ec49
GIT binary patch
literal 1740
zcmZ8fOLNm!6uwGgV^R}tWFri5LC6n`No+7CB<+I4mcyfY*>N1qzzA8siA7_{m1NR%
zQ6v){Wz$7xy6!)yNkZDN>yQ9p+eJx-wkx{pFin^a%U)S=X4)Bz?m6H6&bjBD?<DQu
zXnz~a7x`(WDr%g9W<*s(N>q#qTtO&u{4B4OBb9lu-+4OHA35Cz9GX~00FG5OQI_~w
z;K<Hb5NOX<E3*hVwfTxD&47+!5of`-j0JG$a}7x<j!?moOR*%2Zixb774a5Qz>pv+
z0)D+Rua#tpvmzqJ28Am&I4XcD5@e}3I}c!4l&TuSma`;R6@0cAdC_#|5c(9K9c5Y4
zO4tY`lI)<_Ko*yr*=Y?xv$0q~luS#MV%P&ds>G|D^@IwXh3fP)F3f8tEb{Z5TH+N{
z1c!HhjaM|#!ErN4<2c|pr)AX(f^!OPozqH4!qeo7qNK^7L#}EZl8OL|5~ntTDOFRd
zg2pwbi8HB<Oh&&`E1PxTNtQX>DCoea*=EC-!^Jd=vT4*VQ5=T{XpR+E0Xh6&MaC92
zlu4y0Q=`c|mjxrI28RbTBV2N9WPEHiHJatvOA~{M;S>wVT^^{VqCID8F1on@9A7Ld
zNL7JB*yX}a+(F?c76t)hO17OZX<9}7C>os+wNkYZ5#(~TxkAyw<}M{IRmUw=o8yn*
z7|?FF?P-c+v+u}evsp6Q>^rjB9J`v^9J`|1{5gKMis*7x)#w7ERrFaENdltfX?hk(
zGg^t(=44<y8c=Cbr6pOTd0MSjDzc)XB0a5G{CV(|yE{zW7|{3n*&(K{dzg`g1;>IT
zP=PH}$Ootsdb+EXYQ5O6!!~Gx_Hb+09&a1f=Cx5aubr~zb?68aU3<L_%7N{6Y=7Ww
zr`q$K4j(Z|g)g^Hb)Ni#P3A8X*JFTk#R$sH7=Y@APPh+t!2J-y&XabkCmU;lWW0qU
z(?Y8OjyYWsoxVZW@6{Lnezz@{h&!T(8py+c-faoBYmg)##C7jO^1;WQQR);VsneN^
z5pJD01E>S(Ffnn4pbp1cC>m#6aQt+aU=GC2P@Y5j6yx*z{QgkTe|LR}Wgi=Vt}mL$
zoAt%Iha%&T<3!za@KN1$P|q#ZJ)Y&d=TKVs_R9C2xx=xuy?QB_V;CmTlk!CvrpGtR
zM1A87GZy!yeQMk{9t;JinFRgF)pg;((<QeT=fNNR(11sb-i4NY`r7sMnz61wtGg%`
z;VWYjPvousnoU9HS|Sbit&uJZ)^ER!6VGbv`g80*wrHDd8g^I=j5HX}^%v&7vDIWu
z!2LT66Kil@q&LzpO;&A}^<~}VVaJ-7KJZrGWV5hyC(`7d$IovhauEIxtGf<u<7A#>
z!HmAMn{i?{+Qb^~Zmgz%|CznGTHC(={$*nPiRleJscmf}*n2OH4YJjJl=+%BR)73q
z<;m*p@ZMfxIou+A(>F6f$IeFd?@nBZ#QcHdL!t2W<?v`=G%y|t&|mb1GC}g(Vw|YG
zW-pL^zLq$F$aA=uIALt-iIJ(NWH<JfjIEsU=E~Jyl97CV(U@HGwJyJ3UnYBg!$pvN
zSZGA{xQ{LO63<qQU)fKvBFP=x6en3r3>r^Y^jGYJ>5h`_MSar6;Pt?w<yMSWO~}`P
zmU1h#SM0dO@>>ut0KW_2CR;V9ebu@Q-~n#M2}U3I%dE1tl}lv*b7P`+FnZMt?%ZTE
a)@{&AYVrrn{o0qufA?|B?j;&~CHxCXi#~Ax

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_register/i2c_bcd_alarm.py b/src/lib/adafruit_register/i2c_bcd_alarm.py
index 178d8e1..a1e9098 100644
--- a/src/lib/adafruit_register/i2c_bcd_alarm.py
+++ b/src/lib/adafruit_register/i2c_bcd_alarm.py
@@ -13,7 +13,11 @@
 * Author(s): Scott Shawcroft
 """
 
+<<<<<<< HEAD
 __version__ = "1.10.1"
+=======
+__version__ = "1.9.18"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git"
 
 import time
diff --git a/src/lib/adafruit_register/i2c_bcd_datetime.mpy b/src/lib/adafruit_register/i2c_bcd_datetime.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..4ca5d752bf25244f7b933f3fd4797de2f412ae50
GIT binary patch
literal 1141
zcmYLG+j81g6g|Q>h%pF6R9~p=0H!v@$ic2B?Tgz$-Nw^SgKr&XnmG~D0hAPpkq&Wq
zLc)Z&?L&V>Nj@PT(oe|L&h*vY=TPX3Mp|oWU)L_pqBSLOr0Qzj?idu?q+vLe*oslq
za81*(u2Mpc7Ads5C>p+B__A>S0SYn&i9fZeVVUZ$D0td!6BMT1wqZ6<<Oc&PfSei$
zn7pLKbRg70tB;DMGI?QWq-+~6h>Z?4!`7g4yGxsviANa)orhqZ$2chauv9L?Ag9pw
z_`eB}$mT2743i<lECNI6aII6XL)qj7A<uQSi>-RyArvi-xkFVOXiIgTPj*8Qj2nbv
zj1p|^QFD~Nuwf5Oo5TcLRNXMCg(6mmVq)q@G)z3IB|FsaXcTi#pc1r$N@3apr15VH
zW{d!DS{<8%3z&?976UA_WsO3*M72@>k&H2z!z_bRB8L8L3($}KZ<XyY`qKLNOjy-*
zn>fz@`_&EGp~w?vt=cn~w)PAhC1~cLNom{pN>LgHZFXt}&1xy*qbuKxuU{J7;_>Jf
zW2Xy{gJy%bz23pW+}bS~>iLxL^lLYiDIcba`7>=090bLHoJu1(?N(N%<f-rTt~f2u
z<N_<R$!U2yIU~<hU2!fatOS#D@*Ln0;5*5X9I77O`8k&Pt6Zuc2~Ubh4i^P^;j|bK
z=l25gd_|k`(7kYY!%aS2_lN%A?~gYcQx-Pd3|D^t=i{~3KMls`ukvo}H}PsImX$vf
z=jF{~FBdr3MRKH)6HayoSt<tPB`A3Lz#j<9k*(b4F}JjtO&?~;@%+`E;4ens_)^q8
ze_K9u{YCL%*@O2xe=(MZfANa;$L6h&k+!xA?n!n(v%ahBDvFX)-bjh>?!JGQxC_bf
zh_WYs;_VLt)ygkV;!}ymco@{zXTB7FefD8bNd5WvnoC0_4VlF0D_;_Cm^7G3myBLc
zXrIykgnEp66FPwWYbL!q``}Bln?0e|%Z2s@?ds*h>eANshTGW5=TpZ!`JHTh;jOd`
zqqsc?je6&duYdzmw9j#p<4cY|g<{v7^A22F<(yB<`5Na#j@My9XwG&%XVxrK;hne#
Ld|zOeRJ4Bq)KgmQ

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_register/i2c_bcd_datetime.py b/src/lib/adafruit_register/i2c_bcd_datetime.py
index 0a23ffe..4da6cb3 100644
--- a/src/lib/adafruit_register/i2c_bcd_datetime.py
+++ b/src/lib/adafruit_register/i2c_bcd_datetime.py
@@ -12,7 +12,11 @@
 * Author(s): Scott Shawcroft
 """
 
+<<<<<<< HEAD
 __version__ = "1.10.1"
+=======
+__version__ = "1.9.18"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git"
 
 import time
diff --git a/src/lib/adafruit_register/i2c_bit.mpy b/src/lib/adafruit_register/i2c_bit.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..53762b9ba6e99bd7564a87edd81f375bbdd7644f
GIT binary patch
literal 801
zcmZvY(M}pc6ozL(5LSc{aEh{3E0#9IvK6VpUbHH-RgzXg)Dml^u)DxmWy$WKA!(Cc
zstLXgN^g4IH|Ptr=?mD{r0Hb`s7)`LOmfbgobNy9{7E~Qyu&35a-pQv3B{UHCOTC#
zk;EiiBs5xU0FP@fx)_~H0JvVGM6DJMfFswaDFD7uvkI+iRp6qH8mX4S#9AzwQjUnE
zq%?A*XyB<tG>Hk<8nmKTalb7p_gb*r>(K$9-B}@&h4pR-K{gj37W6m3RjijvOvO=b
zPzAU#E-Msc;O{Qi*8t&TjZg*Cic)3E7i3bUDsZcHij}GiAgN-V7Bt$0^&Z?@Lm0Ew
zban~Tf|y}7m1WPxdk>nvscQ#tL6$W|*MXg_1BAcjV<OWE@E+(zTq2rIfyvp`;y#;M
z+-K)0;9c{{vh8t&(whEI6w8EG>cyy}9*Wl{i_6z;C;R4X^v%is@jl8JaQb$3oO``w
zIA>DRi7n|&gcgKC0Nq#(8_)^|pe<qz+661J3Ik|BupwLCfP)b(=nw|cU_Q<7j0C=<
zlKC{Zmx}@Dj9ZX17vms5;*47npOGxhoWtvEjTx>pPs=$nhQ^^21<h>4vN;dXP$t4{
z&U45Uvmk#)vYvpCC*1guaC2gE%9y<y35U|=MeEo1cEIJmWp=LOTsts)-u4X}+aFTt
zi`Gx`svU5ztae!XgJl`%ed3aX9$`9UEQS}(eel`nr;dMw5$r*)34P|mi6x(TwdbAb
z72R8HpX)NtNvHQ!<QJxI8;`>Cp$)N%F8vR^NNx1NmtFGf?)J+1KmX6)cDFnJQC3;t
ix>GWeISY8cwQBIa+j$g>f$phXCFtsn+w_LxK=}<K)a(lY

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_register/i2c_bit.py b/src/lib/adafruit_register/i2c_bit.py
index e518957..3d2469a 100644
--- a/src/lib/adafruit_register/i2c_bit.py
+++ b/src/lib/adafruit_register/i2c_bit.py
@@ -12,7 +12,11 @@
 * Author(s): Scott Shawcroft
 """
 
+<<<<<<< HEAD
 __version__ = "1.10.1"
+=======
+__version__ = "1.9.18"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git"
 
 try:
diff --git a/src/lib/adafruit_register/i2c_bits.mpy b/src/lib/adafruit_register/i2c_bits.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..a9846d634f5635478949327a402bf6a65ec0c381
GIT binary patch
literal 1053
zcmZvZ-%}G;6vyu-1Weo{H=DSP5-|pnV1%TEtz&(ukSGXM2_g(LI=7qMOLi^nrn@&V
z>2${3Oc`STnnePCfJXm-_R)uS+D_j(#^N8)n?-zL=FXgZ@A>iloO4Qp;L3#OmMDuG
zMnfgYz%|t**eIw)2~|~M=Ic!mW~cIB=cjH0_^?h?T@yFKxs_%e1NcB+#-w3rfF;ek
zs@1^Ay<(}1w^a$34RsqE;I5<^60KZs5=Gb0NmyQXLy+von1Eego26RRK6LFUq|#_h
zG`|P2O??NOq|XA_YGY%A*5o$LD%wyDlK^O{HO+N~5UOE<5Qz2BPXs__$507IM8O(u
zO_WuQ=pdvw2*R2SpsFF0hz0>P*>saz_jrUTw@KTiwIHHtb)DYs7bd@IMWNQ%a>oLa
zr;|dWEF0J~LE`hzjw%xcuzfTv1Knl@_3AS!TYW~`$G~pdYtX=b73yx?nelz25K=d9
z6$&+#D2-}f(zgnyD=EyJ?xu7y$)%G?E`Qoop5_4GcuCYWog@`;8z;AP11IUg%p_4n
z?K5f8RDZ-^_os<V%y+jf|5!P7^Re_|5qkLeDBv&7XDsN21JIZA4i6^0yf-nx4<vlN
zZ{31JIcE4=Vu&AFUkI#4F8y9EtuHW7SBe1o1rP6EDKan+@e5u)P?0>XCy?{EFIwSW
zqU~5@m`^}If7xDM%6T761O9v^$2^*5_(;*i^A*XvJOA4*lR7_gB^kULPFYh6*Rx}}
z%$U93vyTsYPMme3tlepU?7b_`aigP*z~BQX9^}UC&VK^q#6vHgXvkVUbmHNo@|?YI
zANOWwEGG^t(%$@DBo!G+XRO<q)zp{iOnPD=JH8*~<}SQGh(&20Juqg&3-*nlJ?oVx
zPpvMO<;Ll+z}UyubHV$@iH1vexod|4^X3pO2H$qtJ?cJs{BL)5szcG<JJH~WF1^9`
z<@rvF+K>NqJJJhf503LA>72Ec$xKu2$@I6`^0i!s(gy!})o0i_i{Wg5`&`!kge7>+
z=J@r`Zs+A6U6&LsM&5Q(_H)V>I$G_t|L)FC9>l(&uNzFi%Zg-AfIy%vTdcdD0Drj%
R`paOHVb+EIfx9jM{6D?nP#gdN

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_register/i2c_bits.py b/src/lib/adafruit_register/i2c_bits.py
index 08bf5be..871e966 100644
--- a/src/lib/adafruit_register/i2c_bits.py
+++ b/src/lib/adafruit_register/i2c_bits.py
@@ -12,7 +12,11 @@
 * Author(s): Scott Shawcroft
 """
 
+<<<<<<< HEAD
 __version__ = "1.10.1"
+=======
+__version__ = "1.9.18"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git"
 
 try:
diff --git a/src/lib/adafruit_register/i2c_struct.mpy b/src/lib/adafruit_register/i2c_struct.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..21b38000c7d98d73c16da70e03ab7958c0c1f144
GIT binary patch
literal 1040
zcmZvZ-A)=o7=~v-5OKlb$0-U`E4o&Tpj%2?o3t9ys)@BIYDhHOWf@?t>~3}k4L#bW
zCdIo!=^fbn=p{7iNl!a0k~EFU9L&%Az2En|v+f3y3FfU>63cpBCW4MDvO%z(l6grm
zh+daSQfq(_b~*Vvx%>*Sy*mK+G$N~tcn&=IhK7MRU)RntaIYy106(bvnACLzu%w~M
zN(D@8^XplBAxk)`%NJM&o06<cw4c@>RaFssvSi7Y2qjx%0QSJ{5740^>W%xu`2OC%
z$G9~QCGlJ`<S!Vo#d^6+-Ti`4!9);1xJ%J<1>B`B6D*J_Rw$)dk`<x?zgi~(R!RWM
z3dI$50#IGiMCr3o*40|q$*`S*_MKhR-1dv5l8y}nAVHus1`UEXg97!{RJz+uExu@m
zrutb5effAVJfW=WHIV>|ajV5MIz#b{27p1hhHI+cxRCKBXl|^z-c<?FjFnWXB9m&p
zn3U97s{c``wf>K-_mceBOLG7I|B|!@d?Sfz=F_S<G?U$&o}4|Dt|zajp#wdR12kdg
zqE6)8;!QXJUC<2&p=ZGr9f}R0ftU-qVs7M)4WhxA2YCu6^e!;b;g}bB3p?K9z~s;D
zdSQn-&GP`VX$NBSJOh1n<ID37=nwePPUO!?&St_BWLr_wTUu=m1*Xsw$f9W;ppo1H
zbMTx&A>M(;y1Laja3nr6YjQLEZ94*koE3D21MLvZFu&7GI}*HUhl1u&PWoE?#lTQ}
z?x~sLGB=^{`_a2jc$7ZU1(5|GS(z(GA$M|0>m#&2I8PtajFn3|4l@p^sU5?y_}qe-
zUgD@?oGR$Mb=!J5Q0Tf1Q@1F+$uM1yoYV#IwN@y=RBPA<@I44%MdE%NU}L5`|4lm*
z%Sl&Tf0(d6>+TZA@&7^HwL`IvdDQJ1`0+hF+UYzrf5*x=%|q$Ra~!tk&M$F`+`~@y
pJRR#c(}NkJw$V->#YzCLzjb1IZ4AGSL9=J7QPy^@1fQh={tHqnAt(R<

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_register/i2c_struct.py b/src/lib/adafruit_register/i2c_struct.py
index a097e3c..a678a1e 100644
--- a/src/lib/adafruit_register/i2c_struct.py
+++ b/src/lib/adafruit_register/i2c_struct.py
@@ -12,7 +12,11 @@
 * Author(s): Scott Shawcroft
 """
 
+<<<<<<< HEAD
 __version__ = "1.10.1"
+=======
+__version__ = "1.9.18"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git"
 
 import struct
diff --git a/src/lib/adafruit_register/i2c_struct_array.mpy b/src/lib/adafruit_register/i2c_struct_array.mpy
new file mode 100644
index 0000000000000000000000000000000000000000..8871367e98a10a4d912ad99c58c24a991646b91a
GIT binary patch
literal 1008
zcmYk3ZEw?76vwagM4p=5*yb)Yp)E~F(*Vh0veF`?jiwZ+HVs3e%C_p(y>?ndYg_gW
zD0`6XP)*&paS}cO-8a~aNxa#2Kzsmh;#T90b*%Hh=YRgc(~g1pW@t-Mm9E{>DYmr(
z-JzP@&?SN$YWE1mift?Xy445SbhExzZ?1xL&;iNqo^_-F_@hO2(@>5;e7kRHAWi$0
zZXAHQ$5MMkd#w{~!`5GGHrOP(O_+_<r-!D216f_2O0YWBIA9U4n>|B)HZ{LL@doJ2
zpOUv+?CQ4j|FR%v?!N@yWrPnjiuZfnF7tv!IU<h!s|M!9NtnO|RNmM+)i6EO3>H>V
zb%UB9WA-T43>84#V5t?G0@O1sg}lOD+dKwq{Is5G2alICimKY0;{Z5CgLM^T@YEXv
zgfUC%FdP^Ih?$3Fvg(J%t#1ax!UbM@F=6(cao4nu6$-pH+2aNeGAs{+qXF;spx`y4
z-yTwGId>b41DziB_UptvZd{zKasT3W?EvnR0PfTCOV-&N5Y3z)bGq<ve}F&BH;dff
zcW$D*vAMYVocz^<A+%5e=$b1R!YKTx;=%}w!dNX_xKxawNHL0{#TbfpTo|u$g+wuq
z;+?JJPHyqPjdo{?+ufD`OtwNOxh-)p#fp?nLW3hPn>;PJiIen6O5IcUawSxTNpxKT
zC@pa)Cxwt8h0zr$f{HSU4!|&i(v|E|6}mUd<?`6i&y4(hX6Wa$@BBQJ$w^#7xyrKJ
zTxec@S*^Llou5B!#(V+(yT1NYr~QDhwSdNlMcx-?R=D^4jgj}U#hv*=W;FctaqPYr
zleen|6xfJ+OI67ib3-Qcg{&Yx%$<$J%cBuQ9{kE%ISF;-Uv}B3JR3FgR>I`%0_Lw&
zmT$W2OZ95-@{ILoS%2(}PVYoI!JNe3@5I7*g`2#W$&*C9SaBb*6^ZwIJd-;8-i7BN
zQUM6L#yz{uq4^20svi;4l}Y|xmY-#xVcD-T4zR?DGi+BsKPR&Y|8U}bC40+#Rcn`I
hzCQGYxmKvX!#5@spJd;wY%ONminPKV{_8+MJ_8bIDg^)l

literal 0
HcmV?d00001

diff --git a/src/lib/adafruit_register/i2c_struct_array.py b/src/lib/adafruit_register/i2c_struct_array.py
index 65470c6..f5cbf4d 100644
--- a/src/lib/adafruit_register/i2c_struct_array.py
+++ b/src/lib/adafruit_register/i2c_struct_array.py
@@ -12,7 +12,11 @@
 * Author(s): Scott Shawcroft
 """
 
+<<<<<<< HEAD
 __version__ = "1.10.1"
+=======
+__version__ = "1.9.18"
+>>>>>>> ae84eef1491903d49de0e32510d1ab243185d8ff
 __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Register.git"
 
 import struct