From b88c8b7752854f81f5b863864176f606e06e2973 Mon Sep 17 00:00:00 2001 From: nickedyer Date: Sat, 29 May 2021 17:18:37 -0400 Subject: [PATCH] migrating project to GitHub, version 0.0.1 --- .gitignore | 135 +++++ data/__init__.py | 1 + data/development/FakeGPIO.py | 56 ++ data/development/__init__.py | 1 + data/development/button_test.py | 50 ++ data/development/dev_menu.py | 154 ++++++ data/development/menus.py | 120 +++++ data/game.py | 487 ++++++++++++++++++ data/gpio_handler.py | 71 +++ pocket_friends.py | 25 + requirements.txt | 1 + resources/fonts/5Pts5.ttf | Bin 0 -> 50536 bytes resources/images/bg.png | Bin 0 -> 1156 bytes resources/images/clock_selector.png | Bin 0 -> 5661 bytes resources/images/debug/invalid.png | Bin 0 -> 21900 bytes resources/images/egg_images/blue/blue.png | Bin 0 -> 631 bytes .../images/egg_images/dev_egg/dev_egg_0.png | Bin 0 -> 4131 bytes .../images/egg_images/dev_egg/dev_egg_1.png | Bin 0 -> 3654 bytes resources/images/egg_images/green/green.png | Bin 0 -> 807 bytes resources/images/egg_images/indigo/indigo.png | Bin 0 -> 610 bytes resources/images/egg_images/orange/orange.png | Bin 0 -> 820 bytes .../images/egg_images/rainbow/rainbow.png | Bin 0 -> 14934 bytes resources/images/egg_images/red/red.png | Bin 0 -> 864 bytes resources/images/egg_images/violet/violet.png | Bin 0 -> 740 bytes resources/images/egg_images/white/white.png | Bin 0 -> 490 bytes resources/images/egg_images/yellow/yellow.png | Bin 0 -> 736 bytes resources/images/icon.png | Bin 0 -> 312 bytes resources/images/title.png | Bin 0 -> 20997 bytes 28 files changed, 1101 insertions(+) create mode 100644 .gitignore create mode 100644 data/__init__.py create mode 100644 data/development/FakeGPIO.py create mode 100644 data/development/__init__.py create mode 100644 data/development/button_test.py create mode 100644 data/development/dev_menu.py create mode 100644 data/development/menus.py create mode 100644 data/game.py create mode 100644 data/gpio_handler.py create mode 100644 pocket_friends.py create mode 100644 requirements.txt create mode 100644 resources/fonts/5Pts5.ttf create mode 100644 resources/images/bg.png create mode 100644 resources/images/clock_selector.png create mode 100644 resources/images/debug/invalid.png create mode 100644 resources/images/egg_images/blue/blue.png create mode 100644 resources/images/egg_images/dev_egg/dev_egg_0.png create mode 100644 resources/images/egg_images/dev_egg/dev_egg_1.png create mode 100644 resources/images/egg_images/green/green.png create mode 100644 resources/images/egg_images/indigo/indigo.png create mode 100644 resources/images/egg_images/orange/orange.png create mode 100644 resources/images/egg_images/rainbow/rainbow.png create mode 100644 resources/images/egg_images/red/red.png create mode 100644 resources/images/egg_images/violet/violet.png create mode 100644 resources/images/egg_images/white/white.png create mode 100644 resources/images/egg_images/yellow/yellow.png create mode 100644 resources/images/icon.png create mode 100644 resources/images/title.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f21358b --- /dev/null +++ b/.gitignore @@ -0,0 +1,135 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# Save file +/save.json + +# pocket-friends compile script +/compile.bat diff --git a/data/__init__.py b/data/__init__.py new file mode 100644 index 0000000..975cbfa --- /dev/null +++ b/data/__init__.py @@ -0,0 +1 @@ +"""Imports classes for running the game.""" diff --git a/data/development/FakeGPIO.py b/data/development/FakeGPIO.py new file mode 100644 index 0000000..c974005 --- /dev/null +++ b/data/development/FakeGPIO.py @@ -0,0 +1,56 @@ +""" +Module used to fake the RPi.GPIO module so that +the game can be run without the actual hardware. +""" + +# Constants used by RPi.GPIO +BOARD = 0 +IN = 0 +FALLING = 0 + + +def setmode(new_mode): + """ + Fake setmode function. + :param new_mode: + """ + pass + + +def setup(channel, mode, initial=None, pull_up_down=None): + """ + Fake setup function. + :param channel: + :param mode: + :param initial: + :param pull_up_down: + """ + pass + + +def add_event_detect(channel, edge_type, callback=None, bouncetime=0): + """ + Fake function to add a non-existent event detect. + :param channel: + :param edge_type: + :param callback: + :param bouncetime: + """ + pass + + +def event_detected(channel): + """ + Fake function to detect an event. Always returns false. + :param channel: + :return: + """ + return False + + +def cleanup(channel=None): + """ + Fake cleanup function. + :param channel: + """ + pass diff --git a/data/development/__init__.py b/data/development/__init__.py new file mode 100644 index 0000000..2b19ec2 --- /dev/null +++ b/data/development/__init__.py @@ -0,0 +1 @@ +"""Initializes all classes needed for the development environment, and faking GPIO inputs.""" diff --git a/data/development/button_test.py b/data/development/button_test.py new file mode 100644 index 0000000..b89813b --- /dev/null +++ b/data/development/button_test.py @@ -0,0 +1,50 @@ +""" +Module to test the GPIO input on the Raspberry Pi. +""" +from collections import deque +from ..gpio_handler import Constants, GPIOHandler + + +def button_test(): + """ + GPIO button test. Checks for a GPIO input and prints it out, simple as that. + """ + running = True + + # Exit code used to quit the button test. + exit_code = deque() + for button in ['j_d', 'j_d', 'j_u', 'j_u', 'j_d', 'j_d', 'j_u', 'j_u', 'a', 'a', 'b']: + exit_code.append(button) + + # Input log to check for quitting out of the button test. + input_log = deque() + + GPIOHandler.setup() + + def log(pressed_button): + """ + Logs the pressed button into the input log. + :param pressed_button: + """ + input_log.append(pressed_button) + if len(input_log) > len(exit_code): # Don't let the input log exceed the length of the exit code. + input_log.popleft() + + def check_exit(): + """ + Check if the input log and the exit code are the same. If they are, quit the button test. + """ + nonlocal running + + if exit_code == input_log: + running = False + + while running: + for button in Constants.buttons: + code = Constants.buttons.get(button) + if GPIOHandler.get_press(code): # If a button is pressed, print it out and do a quit check. + print('event: {0}'.format(button)) + log(button) + check_exit() + + GPIOHandler.teardown() diff --git a/data/development/dev_menu.py b/data/development/dev_menu.py new file mode 100644 index 0000000..916f663 --- /dev/null +++ b/data/development/dev_menu.py @@ -0,0 +1,154 @@ +""" +Development menu for the game on Raspberry Pi. NOTE: THIS DOES NOTHING ON A COMPUTER! +""" +import data.game +import importlib.util +import os +import pygame +import time +from .button_test import button_test +from .menus import Menu +from ..gpio_handler import GPIOHandler, Constants + +dev_version = '0.0.1' + +try: + importlib.util.find_spec('RPi.GPIO') + import RPi.GPIO as GPIO +except ImportError: + import data.development.FakeGPIO as GPIO + +# Global variable to keep track of the current menu. +menu = 'main' + + +def run_button_test(): + """ + Runs the GPIO button test. + """ + GPIOHandler.teardown() + button_test() + GPIOHandler.setup() + + +def clear_screen(): + """ + Clears the screen. + """ + print("\n" * 20) + + +def start_game(): + """ + Cleans the GPIO and starts the game. + """ + GPIOHandler.teardown() + data.game.main() + pygame.quit() + GPIOHandler.setup() + + +def quit_menu(): + """ + Quits the menu. + """ + exit(0) + + +def quit_with_error(): + """ + Quits the menu with error code 3. + """ + exit(3) + + +def change_menu(new_menu): + """ + Changes the global menu variable for the dev menu + :param new_menu: the menu to change to + """ + global menu + menu = new_menu + clear_screen() + print('...') + time.sleep(0.75) + + +def shutdown(): + """ + Shuts down the linux system. + """ + os.system('sudo shutdown now') + + +def restart(): + """ + Restarts the linux system. + """ + os.system('sudo reboot') + + +def main(): + """ + Starts the dev menu. + """ + + # The following defines all of the options in the various different menus. + + main_menu = Menu('Pocket Friends Dev Menu {0}\nGame Version {1}'.format(dev_version, data.game.version)) + main_menu.add_option(Menu.Option('Start Game', start_game)) + main_menu.add_option(Menu.Option('Button Test', run_button_test)) + main_menu.add_option(Menu.Option('Restart Dev Menu', quit_with_error)) + main_menu.add_option(Menu.Option('Shutdown Pi', change_menu, 'shutdown')) + main_menu.add_option(Menu.Option('Restart Pi', change_menu, 'restart')) + main_menu.add_option(Menu.Option('Quit Dev Menu', change_menu, 'quit')) + + shutdown_confirm = Menu('Are you sure you want to shutdown?') + shutdown_confirm.add_option(Menu.Option('No', change_menu, 'main')) + shutdown_confirm.add_option(Menu.Option('Yes', shutdown)) + + restart_confirm = Menu('Are you sure you want to restart?') + restart_confirm.add_option(Menu.Option('No', change_menu, 'main')) + restart_confirm.add_option(Menu.Option('Yes', restart)) + + quit_confirm = Menu('Are you sure you want to exit?') + quit_confirm.add_option(Menu.Option('No', change_menu, 'main')) + quit_confirm.add_option(Menu.Option('Yes', quit_menu)) + + GPIOHandler.setup() + + def menu_handler(current_menu): + """ + Draws the menu and handles the GPIO inputs + :param current_menu: the current menu being drawn on the screen + """ + current_menu.draw_menu() + + while True: # Main GPIO input loop + + # Limits how often the program checks for a GPIO input. Eases CPU usage. + time.sleep(0.125) + + if GPIOHandler.get_press(Constants.buttons.get('j_d')): + current_menu.select_next() + break + if GPIOHandler.get_press(Constants.buttons.get('j_u')): + current_menu.select_prev() + break + if GPIOHandler.get_press(Constants.buttons.get('a')): + current_menu.run_selection() + break + + while True: # Loop for drawing the menus. + + while menu == 'main': + menu_handler(main_menu) + + while menu == 'shutdown': + menu_handler(shutdown_confirm) + + while menu == 'restart': + menu_handler(restart_confirm) + + while menu == 'quit': + menu_handler(quit_confirm) diff --git a/data/development/menus.py b/data/development/menus.py new file mode 100644 index 0000000..45cd56b --- /dev/null +++ b/data/development/menus.py @@ -0,0 +1,120 @@ +""" +Menu class to help with drawing menus on screen +""" + + +class Menu: + """ + Menu class. Creates a menu with text to display and options + """ + + def __init__(self, menu_text=''): + self._menu_text = menu_text + self._options = [] + self._selection = 0 + + def add_option(self, option): + """ + Adds an option to the menu. Only allows instances of Menu.Option + :param option: + """ + if not isinstance(option, Menu.Option): + raise TypeError('option must be an instance of Menu.Option') + else: + self._options.append(option) + + def get_option(self, index): + """ + Gets an option object given the index of the option. Raises IndexError if given + index is out of bounds. + :param index: the index of the option + :return: the option object + """ + try: + return self._options[index] + except IndexError as ex: + raise IndexError('option index out of range') from ex + + def select_next(self): + """ + Selects the next option in the list. Wraps around to the first option if + the last option is currently selected. + """ + self._selection += 1 + if self._selection >= len(self._options): + self._selection = 0 + + def select_prev(self): + """ + Selects the previous option in the list. Wraps around to the last option if + the first option is currently selected. + """ + self._selection -= 1 + if self._selection < 0: + if len(self._options) > 0: + self._selection = len(self._options) - 1 + else: + self._selection = 0 + + def run_selection(self, *args, **kwargs): + """ + Runs the function that the currently selected option object points to. + :param args: arguments to be passed to the function + :param kwargs: keyword arguments to be passed to the function + """ + try: + return self._options[self._selection].run(*args, **kwargs) + except IndexError as ex: + raise Exception('menu has no options, cannot run a non-existent option') from ex + + def draw_menu(self): + """ + Draws the menu on screen with a leading 20 blank lines. + """ + print('\n' * 20) + + print(self._menu_text + '\n') + + for option in self._options: + selection_char = '>' + + if self._options.index(option) != self._selection: + selection_char = ' ' + + print('{0} {1}'.format(selection_char, option.get_text())) + + class Option: + """ + Class that defines options for the Menu class. + """ + + def __init__(self, option_text='', function=None, *args, **kwargs): + self._option_text = option_text + self._function = function + self._default_args = args + self._default_kwargs = kwargs + + def get_text(self): + """ + Returns the text to be displayed by the option + :return: the option text + """ + return self._option_text + + def run(self, *args, **kwargs): + """ + Runs the function that the option object points to. Returns None if + there is no function or the given function is not valid. + :param args: arguments to be passed to the function + :param kwargs: keyword arguments to be passed to the function + :return: the return value of the function (if any) + """ + if len(args) == 0: + args = self._default_args + if len(kwargs) == 0: + kwargs = self._default_kwargs + + try: + return self._function(*args, **kwargs) + except TypeError: + return None diff --git a/data/game.py b/data/game.py new file mode 100644 index 0000000..b45bbba --- /dev/null +++ b/data/game.py @@ -0,0 +1,487 @@ +""" +Main file for the entire game. Controls everything except for GPIO input. +""" +from collections import deque +import importlib.util +import json +import os +import pygame +from pygame.locals import * +from .gpio_handler import Constants, GPIOHandler + +version = '0.0.1' +game_fps = 16 + + +class FileHandler: + """ + Class that handles the game attributes and save files. + """ + + def __init__(self): + # Attributes that are saved to a file to recover upon startup. + self.attributes = { + 'time_elapsed': 0, + 'age': 0, + 'health': 0, + 'hunger': 0, + 'happiness': 0, + 'evolution_stage': -1, + } + + def write_save(self): + """ + Writes attributes of class to "save.json" file. + """ + with open('save.json', 'w') as save_file: + json.dump(self.attributes, save_file) + save_file.close() + + def read_save(self): + """ + Reads from "save.json" and inserts into attributes dictionary. Creates file if it does not exist. + """ + # Open up the save file and read it into self.attributes. + try: + with open('save.json', 'r') as save_file: + self.attributes = json.load(save_file) + save_file.close() + + # If there is no save file, write one with the defaults. + except FileNotFoundError: + self.write_save() + + +class PlaygroundFriend(pygame.sprite.Sprite): + """ + Class for the sprite of the creature on the main playground. + """ + + def __init__(self): + pygame.sprite.Sprite.__init__(self) + + +class SelectionEgg(pygame.sprite.Sprite): + """ + Class for the eggs on the egg selection screen. + """ + + def __init__(self, egg_color): + pygame.sprite.Sprite.__init__(self) + + image_directory = 'resources/images/egg_images/{0}'.format(egg_color) + + # Load the egg from the given color and get the bounding rectangle for the image. + self.images = [] + for filename in os.listdir(image_directory): + self.images.append(pygame.image.load(image_directory + '/' + filename)) + + self.rect = self.images[0].get_rect() + self.index = 0 + self.image = self.images[self.index] + + self.animation_frames = game_fps / len(self.images) + self.current_frame = 0 + + def update_frame_dependent(self): + """ + Updates the image of Sprite every 6 frame (approximately every 0.1 second if frame rate is 60). + """ + + self.current_frame += 1 + if self.current_frame >= self.animation_frames: + self.current_frame = 0 + self.index = (self.index + 1) % len(self.images) + self.image = self.images[self.index] + + def update(self): + """This is the method that's being called when 'all_sprites.update(dt)' is called.""" + self.update_frame_dependent() + + +# Makes Pygame draw on the display of the RPi. +os.environ["SDL_FBDEV"] = "/dev/fb1" + +# Useful for debugging on the PC. Imports a fake RPi.GPIO library if one is not found (which it can't +# be on a PC, RPi.GPIO cannot be installed outside of a Raspberry Pi. +try: + importlib.util.find_spec('RPi.GPIO') + import RPi.GPIO as GPIO +except ImportError: + import data.development.FakeGPIO as GPIO + + +def game(): + """ + Starts the game. + """ + pygame.init() + + # Hide the cursor for the Pi display. + pygame.mouse.set_visible(False) + + # The game is normally rendered at 80 pixels and upscaled from there. If changing displays, change the + # screen_size to reflect what the resolution of the new display is. + rendered_size = 80 + screen_size = 800 + + window = pygame.display.set_mode((screen_size, screen_size)) + surface = pygame.Surface((rendered_size, rendered_size)) + + # Only really useful for PCs. Does nothing on the Raspberry Pi. + pygame.display.set_caption('Pocket Friends') + + clock = pygame.time.Clock() + + # Font used for small text in the game. Bigger text is usually image files. + small_font = pygame.font.Font('resources/fonts/5Pts5.ttf', 10) + + # Default game state when the game first starts. + game_state = 'title' + running = True + file_handler = FileHandler() + + # A group of all the sprites on screen. Used to update all sprites at onc + all_sprites = pygame.sprite.Group() + + # Start the GPIO handler to take in buttons from the RPi HAT. + GPIOHandler.setup() + + # Dev code used to exit the game. Default Down, Down, Up, Up, Down, Down, Up, Up, A, A, B + dev_code = deque() + for button in [Constants.buttons.get('j_d'), Constants.buttons.get('j_d'), Constants.buttons.get('j_u'), + Constants.buttons.get('j_u'), Constants.buttons.get('j_d'), Constants.buttons.get('j_d'), + Constants.buttons.get('j_u'), Constants.buttons.get('j_u'), Constants.buttons.get('a'), + Constants.buttons.get('a'), Constants.buttons.get('b')]: + dev_code.append(button) + + # Log of the inputs. + input_log = deque() + + # Time since last input. Used to help regulate double presses of buttons. + last_input_tick = 0 + + def draw(): + """ + Draws the main pygame display. + """ + + # Draws all the sprites on screen and scales the screen to the correct size from the rendered size. + all_sprites.update() + all_sprites.draw(surface) + frame = pygame.transform.scale(surface, (screen_size, screen_size)) + window.blit(frame, frame.get_rect()) + + # Update the entire display. + pygame.display.flip() + + def draw_bg(): + """ + Draws the main game background image onto a given surface. + """ + bg_image = pygame.image.load('resources/images/bg.png').convert() + surface.blit(bg_image, (0, 0)) + + def log_button(pressed_button): + """ + Logs the button presses to register the dev code. + :param pressed_button: The button code to be logged + """ + input_log.append(pressed_button) + if len(input_log) > len(dev_code): + input_log.popleft() + + def create_event(pressed_button): + """ + Creates a pygame event with a given keyboard code + :param pressed_button: + """ + nonlocal last_input_tick + # Register a button click so long as the last button click happened no less than two frames ago + if pygame.time.get_ticks() - last_input_tick > clock.get_time() * 2: + pygame.event.post(pygame.event.Event(KEYDOWN, {'key': pressed_button})) + pygame.event.post(pygame.event.Event(KEYUP, {'key': pressed_button})) + log_button(pressed_button) + last_input_tick = pygame.time.get_ticks() + + def check_dev_code(): + """ + Checks if the dev code has been entered. If it has, stop the program. + """ + nonlocal running + + if dev_code == input_log: + running = False + + def handle_gpio(): + """ + Handles getting GPIO button presses and making a pygame event when a press is detected. + """ + for pressed_button in Constants.buttons: + code = Constants.buttons.get(pressed_button) + + # Check if a button has been pressed. If it has, create a pygame event for it. + if GPIOHandler.get_press(code): + create_event(code) + + def keyboard_handler(): + """ + Simulates key presses to GPIO button presses. Also handles quitting the game. + """ + nonlocal running + + # Checks if a corresponding keyboard key has been pressed. If it has, emulate a button press. + for keyboard_event in pygame.event.get(): + if keyboard_event.type == pygame.QUIT: + running = False + if keyboard_event.type == pygame.KEYDOWN: + if keyboard_event.key == pygame.K_a: + create_event(Constants.buttons.get('a')) + if keyboard_event.key == pygame.K_b: + create_event(Constants.buttons.get('b')) + if keyboard_event.key == pygame.K_PERIOD: + create_event(Constants.buttons.get('j_i')) + if keyboard_event.key == pygame.K_RIGHT: + create_event(Constants.buttons.get('j_r')) + if keyboard_event.key == pygame.K_LEFT: + create_event(Constants.buttons.get('j_l')) + if keyboard_event.key == pygame.K_DOWN: + create_event(Constants.buttons.get('j_d')) + if keyboard_event.key == pygame.K_UP: + create_event(Constants.buttons.get('j_u')) + if keyboard_event.key == pygame.K_ESCAPE: + running = False + + def pre_handler(): + """ + Runs at the beginning of each loop, handles drawing the background, controlling game speed, and + controlling the GPIO button inputs and keyboard handler + """ + # Regulate the speed of the game. + clock.tick(game_fps) + + # Handle all inputs for both debugging and real GPIO button presses. + keyboard_handler() + handle_gpio() + check_dev_code() + + # Draw the background. + draw_bg() + + while running: + if game_state == 'title': + all_sprites.empty() + pre_handler() + + # Draw the title image in the middle of the screen. + title_image = pygame.image.load('resources/images/title.png').convert_alpha() + surface.blit(title_image, (0, 0)) + draw() + + # Show the title for 1 second then move on to the initialization phase of the game. + pygame.time.wait(1000) + game_state = 'init' + + elif game_state == 'playground': + all_sprites.empty() + game_state = None # Playground currently not implemented, send to error screen. + + elif game_state == 'init': + all_sprites.empty() + pre_handler() + draw() + + # Read the save file. + file_handler.read_save() + + # Determines if it is a new game or not by looking at the evolution stage. If it is -1, the egg has + # not been created yet, and the game sends you to the egg selection screen. If not, the game sends + # you to the playground. + if file_handler.attributes['evolution_stage'] == -1: + game_state = 'egg_select' + else: + game_state = 'playground' + + elif game_state == 'egg_select': + + # Submenu used within the egg selection menu. + submenu = 'main' + + selected = 0 + + while running and game_state == 'egg_select': + all_sprites.empty() + if submenu == 'main': + + # Creates and holds the egg objects in a list. + eggs = [SelectionEgg('red'), SelectionEgg('orange'), SelectionEgg('yellow'), + SelectionEgg('green'), + SelectionEgg('blue'), SelectionEgg('indigo'), SelectionEgg('violet'), SelectionEgg('white'), + SelectionEgg('rainbow')] + + # How many eggs per row should be displayed. + eggs_per_row = 3 + distance_between_eggs = 36 / eggs_per_row + + # Count the total rows. + total_rows = -(-len(eggs) // eggs_per_row) + distance_between_rows = 32 / eggs_per_row + + # Determine the location of each egg. + for egg in eggs: + current_row = eggs.index(egg) // eggs_per_row + rows_after = total_rows - (current_row + 1) + egg_in_row = eggs.index(egg) % eggs_per_row + eggs_after = min(len(eggs) - (current_row * eggs_per_row), eggs_per_row) - (egg_in_row + 1) + + x_offset = 32 + y_offset = 30 + + # The x coordinate of an egg is determined by which egg in the row it is, and how many eggs + # are in that row. If there is only 1 egg in a row, it is in the middle of the screen. If + # there are two, they're on equal halves and so on. + x = x_offset - (eggs_after * distance_between_eggs) + (egg_in_row * distance_between_eggs) + y = y_offset - (rows_after * distance_between_rows) + (current_row * distance_between_rows) + + egg.rect.x = x + egg.rect.y = y + + # Add the egg to the sprite list. + all_sprites.add(egg) + selected = 0 + + def get_cursor_coords(selection): + """ + Gets the coordinates of an egg on the selection screen by index and returns it as a tuple + :param selection: index of the egg to be selected + :return: tuple of the coordinates of the selected egg + """ + cursor_x_offset = -2 + cursor_y_offset = -2 + + return eggs[selection].rect.x + cursor_x_offset, eggs[selection].rect.y + cursor_y_offset + + def sel_left(): + """ + Select the egg to the left with constraints. + """ + nonlocal selected + + if selected % eggs_per_row != 0: + selected -= 1 + + def sel_right(): + """ + Select the egg to the right with constraints. + """ + nonlocal selected + + row = selected // eggs_per_row + eggs_in_row = min(len(eggs) - (row * eggs_per_row), eggs_per_row) + + if selected % eggs_per_row != eggs_in_row - 1: + selected += 1 + + def sel_up(): + """ + Select the egg above with constraints. + """ + nonlocal selected + + if selected // eggs_per_row != 0: + selected -= eggs_per_row + + def sel_down(): + """ + Select the egg below with constraints. + """ + nonlocal selected + + if selected // eggs_per_row != total_rows - 1: + selected += eggs_per_row + + while running and game_state == 'egg_select' and submenu == 'main': + + pre_handler() + + for event in pygame.event.get(): + if event.type == pygame.KEYDOWN: + if event.key == Constants.buttons.get('j_r'): + sel_right() + if event.key == Constants.buttons.get('j_l'): + sel_left() + if event.key == Constants.buttons.get('j_d'): + sel_down() + if event.key == Constants.buttons.get('j_u'): + sel_up() + if event.key == Constants.buttons.get('a'): + # Advance to the egg info screen for the selected egg. + submenu = 'egg_info' + + # Draws the cursor on screen. + cursor = pygame.image.load('resources/images/clock_selector.png').convert_alpha() + surface.blit(cursor, get_cursor_coords(selected)) + + draw() + + elif submenu == 'egg_info': + while running and game_state == 'egg_select' and submenu == 'egg_info': + pre_handler() + for event in pygame.event.get(): + if event.type == pygame.KEYDOWN: + if event.key == Constants.buttons.get('a'): + # Go to an invalid game state if continuing. + game_state = None + if event.key == Constants.buttons.get('b'): + # Go back to the egg selection screen. + submenu = 'main' + + # Quick debugging for which egg is selected. + selection_debug = small_font.render('Egg {0}'.format(selected), False, (64, 64, 64)) + surface.blit(selection_debug, (5, 35)) + + draw() + + else: # Go to the error state if an invalid state is set. + game_state = None + + else: + # Error screen. This appears when an invalid game state has been selected. + + all_sprites.empty() + frames_passed = 0 # Counter for frames, helps ensure the game isnt frozen. + + while running and game_state != 'title': + + pre_handler() + + # Draw the error screen + error_screen = pygame.image.load('resources/images/debug/invalid.png').convert_alpha() + surface.blit(error_screen, (0, -8)) + + # Counts the frames passed. Resets every second. + frames_passed += 1 + if frames_passed >= game_fps: + frames_passed = 0 + + # Draws the frame counter. + frame_counter = small_font.render('frames: {0}'.format(frames_passed), False, (64, 64, 64)) + surface.blit(frame_counter, (1, 70)) + + for event in pygame.event.get(): + if event.type == pygame.KEYDOWN: + if event.key == Constants.buttons.get('b'): + # Reset back to the title screen. + game_state = 'title' + + draw() + + +def main(): + """ + Calls the game() function to start the game. + """ + game() + + GPIOHandler.teardown() + pygame.quit() diff --git a/data/gpio_handler.py b/data/gpio_handler.py new file mode 100644 index 0000000..185df5a --- /dev/null +++ b/data/gpio_handler.py @@ -0,0 +1,71 @@ +""" +Module that helps with the handling of taking inputs from the GPIO pins on the Raspberry +Pi and converting them to events to be used in other places (pygame, etc.) +""" +import importlib.util + +try: + importlib.util.find_spec('RPi.GPIO') + import RPi.GPIO as GPIO +except ImportError: + import data.development.FakeGPIO as GPIO + + +class Constants: + """ + Contains the constants used by the HAT to read in buttons + """ + buttons = { + 'a': 31, # A button + 'b': 29, # B button + 'j_i': 7, # Joystick in + 'j_u': 11, # Joystick up + 'j_d': 15, # Joystick down + 'j_l': 13, # Joystick left + 'j_r': 16 # Joystick right + } + + +class GPIOHandler: + """ + Class to handle the GPIO inputs from the buttons. + """ + + @staticmethod + def setup(): + """ + Primes the GPIO pins for reading the inputs of the buttons. + """ + GPIO.setmode(GPIO.BOARD) + + GPIO.setup(Constants.buttons.get('a'), GPIO.IN) + GPIO.setup(Constants.buttons.get('b'), GPIO.IN) + GPIO.setup(Constants.buttons.get('j_i'), GPIO.IN) + GPIO.setup(Constants.buttons.get('j_u'), GPIO.IN) + GPIO.setup(Constants.buttons.get('j_d'), GPIO.IN) + GPIO.setup(Constants.buttons.get('j_l'), GPIO.IN) + GPIO.setup(Constants.buttons.get('j_r'), GPIO.IN) + + GPIO.add_event_detect(Constants.buttons.get('a'), GPIO.FALLING) + GPIO.add_event_detect(Constants.buttons.get('b'), GPIO.FALLING) + GPIO.add_event_detect(Constants.buttons.get('j_i'), GPIO.FALLING) + GPIO.add_event_detect(Constants.buttons.get('j_u'), GPIO.FALLING) + GPIO.add_event_detect(Constants.buttons.get('j_d'), GPIO.FALLING) + GPIO.add_event_detect(Constants.buttons.get('j_l'), GPIO.FALLING) + GPIO.add_event_detect(Constants.buttons.get('j_r'), GPIO.FALLING) + + @staticmethod + def teardown(): + """ + Cleans up the GPIO handler. + """ + GPIO.cleanup() + + @staticmethod + def get_press(button): + """ + Returns true if a button has moved from not pressed to pressed. + :param button: button to be detected + :return: True if the button is has been pressed, False otherwise + """ + return GPIO.event_detected(button) diff --git a/pocket_friends.py b/pocket_friends.py new file mode 100644 index 0000000..3ee8203 --- /dev/null +++ b/pocket_friends.py @@ -0,0 +1,25 @@ +""" +Launch script for Pocket Friends. +""" +import pygame +import sys +from data.game import main as game_main +from data.development.dev_menu import main as dev_menu_main + +enable_dev = False + +if __name__ == '__main__': + + # enable dev mode if --dev argument is passed + if len(sys.argv) > 0: + for args in sys.argv: + if args == '--dev': + enable_dev = True + + if not enable_dev: + game_main() + else: + dev_menu_main() + + pygame.quit() + sys.exit() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..125fed6 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +pygame==1.9.4 \ No newline at end of file diff --git a/resources/fonts/5Pts5.ttf b/resources/fonts/5Pts5.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3ae64c5d846d9c2eed947484c93540c3d9c0970b GIT binary patch literal 50536 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 literal 0 HcmV?d00001 diff --git a/resources/images/bg.png b/resources/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..bd437af6afdc752f17a5350d5277ea66f569ee26 GIT binary patch literal 1156 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 g_J`O|_*f=hzCy9D>(cJe%DpS|CGecz9n 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�Vpo>`S#wal2IS$mJG4mU}onTP=s%9_?>MIE!1hfGBoE7>$Sdey)hgkaQ5xD z6b$wGro}l?;l{FU|y;R_aMV}n-LjB!gcV@4FKcGlR&eEY1T+3P!YXSHgM zW0{Anhds4!x|gVVpe{r!39zGM((YDck@*vsgG#KMqH0(;*}Z5HFE4G#d21OFYM>V} z?*T3EZxhhdhL5JUa=z@5om&0$x>k4kll-75BT=SWG>w1%QOnSrT}oySBwP*0m@KJ1 z5QaS8`MD{4gVYq=KAHO_17LP&d9R@pi=CZRHAMTAQO9iVxNDeA6C#;#{u<0f9-J(jg}` z6*4eakDq9;AIj18-lXz#VwF&in5idsJ4ZESdYI#}5||>v)EhMRm=0HEAsTni#V1UB zwqBLYyAyR?&0~Y~4JZQZ0_k40dpj&4j*TcUROo}+56Eo#b^r5Oo#gf0Tj5oReCj=X zsf^0A%|Dp?=!84+&en}X##VQ4Y)%wAJrf-hYi0;?CT4!=Ss@*x0e9z%^##jRPp--m z=O`=(UKETyi~5-ywpGveRR<5H*l>OQp6vlzIN7`18LW!aU3ZhkmdhN7qm+y1gr45h zox?%wf#9ehR$_tB4DkMHYf+P^orC7$(hFAM@f;I<4b&ivFbfL{L^8>6ld=8bN<7PZgV#(JfFw#w9jzc&LM%w z?=b@cZu6s^oU0G5inDE4&0!R@+vYg8bTO7T>R{CN2s6;TmQx9%1)ATpuDizx|AD@x zJa?!Z@*?TU&B*WR2Fx(N#htqGSaQf3dB_cg9hEsv!(;{tKZZhAO$DCGMq zuM?ZD(|XK`s(?7{If`64(VxpaFkMzH7EPjO;%i%dr+ZD~l*~>Rbqpm~#ckgMX%{YU zZQoD%A~GUxw@ID#i*0#97{cVT0_~nwwvZ>6e(kmuUT9cVl&JG`yvs?Z$#sr#i5ap#l6xApj|29eBnK< zF_K5QB>T`j6j#ejxEj8pIN+%Mt&K(U$9sQWlUJoN!n0&uP!1^$h%*a8h$8OVwYxRi zz05^z(k%@EI{Pw0Pd+J_cOj)+lciqR3;T{MF70tY@pXY9=+&>Apjl$0Y?sFBta(us zRU1ceA@GIe51(3xz@8>iPBN7^+ul@zN>4Y0=NEXj&(jM#V%m1|rx+yfqBmEe=B&QT>!Q~hBPd0xvh`Oft|C8h5+9ZCeRa79gLi}It?-h6{l$aIa$Z}4*s_Ec w7zt_b)Z}U?PUMSg9kyullK*-Y8_aF$7}>IZ*F{wWa6twf?Var|?({zP8?Xvpa{vGU literal 0 HcmV?d00001 diff --git a/resources/images/egg_images/blue/blue.png b/resources/images/egg_images/blue/blue.png new file mode 100644 index 0000000000000000000000000000000000000000..9656dafc1f893bceec9b49b324eddfdec7f3fd2e GIT binary patch literal 631 zcmV--0*L*IP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00G}gL_t(I%Z-%5ZWA#OhQIM{ z(ryB2RV0KeE(5KrI=F9yJ7mB$#Fx2B55Mf~^1_ucXsX`qW91beW`> zrR+m>S-MN*3J|l@Ch2FC&N}H!=YUy~=2^NbuyMQz3hSV$AQ+4)c-(^s{7z7n^+opd zw!=*UVX5NfUc;6_&wSG)!RI-=o547Fa4QF!;Q6Ro`L{AQ34TTB8=SOovVcJiF#`p@ zQ-J{&37+)f&F$*E?_gw*1#>~af^meM8ZIL2RxW!Xuhgr{>vZh!e5Pl^hM~dz0G(WR zzj$Oo0uE|8=(%UFr`LefS?fyr=7HamZyp2~8srSi5?o|Bn?i>xX$5&boxR{vM*$`o zDuXEK6%|&l)`K2=U%yR Rz_tJY002ovPDHLkV1gK27J~o) literal 0 HcmV?d00001 diff --git a/resources/images/egg_images/dev_egg/dev_egg_0.png b/resources/images/egg_images/dev_egg/dev_egg_0.png new file mode 100644 index 0000000000000000000000000000000000000000..20679ad5235cda9c3d148960723dc82b0e29dfa8 GIT binary patch literal 4131 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 literal 0 HcmV?d00001 diff --git a/resources/images/egg_images/green/green.png b/resources/images/egg_images/green/green.png new file mode 100644 index 0000000000000000000000000000000000000000..510b163a870027980f998d573aa8ede34dc044bc GIT binary patch literal 807 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 literal 0 HcmV?d00001 diff --git a/resources/images/egg_images/red/red.png b/resources/images/egg_images/red/red.png new file mode 100644 index 0000000000000000000000000000000000000000..3a3026eedb53f045a9942d042ae473724b045b58 GIT binary patch literal 864 zcmV-m1E2hfP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00PKKL_t(I%Z-#xZyQwP(H+p1!4jGg8qT7_yMrwcT}p7U;#)-MFpu+TdAsq zib~v)1nf9<;@FPACY}$^+{>bBn)E|(mRILKde5u#9>FWB?0Ne6x0OmoysTHe>T}g~ zS;^-~v?f%F+k181jnzwG=JNojR3b=I`kf93Ny3C>5o^s-Hsthcbr55e@$^xUJPH_F zSRm1wSSeCqH;x%8MXD6LVL~?%?2e{z7Z;C>D~~GqwpQV8yTJ*=;G*l&3`4Fr8f^JZ zE;%jSjHVh25`Ek*`Ba5FQ{l@~RZ7NRRJ$7lai4-^F-%h~WH*=}QwSi!CQ*vw5jBUN zeAiv(Qoh6MV@)J=CNq!e9vFO4OqsS|kO=$)KAPCzmqCtIr}(0=pUuxBnPsi@J9*i| zl8|C!8#d)(7RMT=7B^WB2H0YYSUJzeDSMuF7Z(9gNXAbrvl*Dg3N{muz!{1%OX`_$eJZ~2YH2V&g>@a8VvBkm@ zh;0~LtJU~wp$fn^^(8VwP!B_#onrim#8h7g$95)Te0sfB`m)FW1kPv_=dO!3q0%XuD3Ywon$oO2v9Qlhn{G8{4r q*7#&P!sfEB^wCrb+=GuB;XS0000e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00K-&L_t(I%Z-%1ZxcZf#eXxq z=ezUSjuRzD5D8gGAP`boQUFqlRFqHxe*pg68a7ztYv8!(*w&bQ>x$SdGn;8=-rU;6nc#<2z^eVu>Wu)X(%qW>62&o93 zl!7@@+Sgd>MF3Ai6%~~dK`@<6f*pf3QDLJd_ zt0a9PCBuuOBrvaSI%+KFJWdi00!$*v1yB6hAQIX9`i1FXKrx&|gdCH=An8*E7&i@w z0FjA>a}kEDm?L3k71cpQf{`nv(qUoH<@MV)w3c&P0+|}MmDE;)IdZzEQUD%LkSQV! zEm4}7(I&_33!gVP__;miFqRY!y6R}(Yt#4!uyc22GA0snCKU7;_hs*c3($0Spw za1KRTdOXLgwHM6Y$#AD?$dDCN31k9Z5|$SSl;gmpj&xK>RX7R}FUq(H2tw9z*wi=< zuxGm`ObS&NUBUfFcX_t} z?Cdst{ItRLw<9JNDJ_tRQatJK{=++Z4^j$I2Fb}bkLp84Y{}WOby+yG%%mY$O~e3W zu#}T8wTU58{g_ajP(@+S_Rm2srB_-+3^9k|kke#j&f`qzs4@z_FQr-j=Z^gAuKWd+ W80~-63ykLg0000e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00B}-L_t(I%Z*e?jsh_ZEIVn5 zKd^}Zzp8-~A7E+6_8gE+!ZI_FTG=Y)aZ-;lg-2*^R$l-AK zl`IKV)m7EaEPD}g5%FlRDyb*fZntoExIZv4jyW^K-C<@ppU>(E*Vj~fFCsb-VObV1 zGit49ttB}CP#79ggUHOFs+guJqY_bKrfC8*<9Iw`a3~J8*76G_wLV0P2udlLUK-mw z-damvm^qb+$UqS3zInpTSglqWJ>-i>&dm(1wcHy>B65&1GgLKerdI_3sye8_JkLXU zi-_OvcfZ|kez{!ydcC@c__8c6B6%I&>Li%^s_g$tpJJr{@$SU!?F%Wu;Y%q6r_*V; g&Gesle zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00Kx!L_t(I%XO5yZWBQihQFEJ zwH*>U!ogU^6hR~fA{`PPA}s|x0WW|M4H6d#AqpOWr{EQ+A|whDgrJQeDT1-qaU3}p z?`>ud#n?`qkdd~S+1>A)|NQ5S;)1pNwfjHS|Go{+9(2Au6p@UD z8;=k>gd#><25vxm?VSL$Ry$L$sZG58RO&0QA((-DA23Mr3vmXd0A;~h;>{ORAUy$W zJd^s$OH`?b(q)L|5qkuB7J^HlOCSo|A&r}_Xs~{R=h$ z6{3PUB<~>@P!U9Ra6_`;(H^dV(jpXpK+hqz<3VG0bhPO8N#+5#(LM#+ z^LB~?vj@6@xFM8pL;04^6wqQ~K%?|L1he2$?*P^p)x;B^WSd~RkbVaQD)&y>zP;9z z#?l*US<%o==?IXGhY6gmJa6JfGV0Y=ZKhaw4s7c3)D?sfd`EMU3Y@Wa*1F@hl zgQ`IO6{0)m2XNedSFb-9y{Uqp^8g$BqKC`i26T5ma(bH2-4CY+>!Nk`D)KIx?JdSDuMK}vQ zB8wRq^pruEv0|xx8BmbD#M9T6{V6LGiwN)jMJaJWA;}Wgh!W@g+}zZ>5(ej@)Wnk1 z6ovB4k_-iRPv3y>Mm}+%q6MBVjv*e$leetRPF$dxkhH*1Vr#+!-GqZ8R#zf=H8aBR zcf~U<)n|zMU=+o(b>GsDiLD5ZCulr+k+dJkRnnyAgr)e#^kdzcG zc=j{n&48_FoRDg&-y7Rq!-`y?APze3zdR1RzT6HAi@|^GOnJ}HjWzY6s`L$3 znDgas)5j=S>GbHq==nKv^X0nZ;R@ALS4jcmTW z$TjMIeLFv}Wd3<^_U==rQtJ77$8=|n|IiPPf-i=*cTfAZLtHD7lSc-NyV>ZCAd>&b(E3JodB3^Vp;Q=9kGYd*MbQlWu;AD#=D(tb4a%SZ;V* zVV9rl8`=lVhv_#ba6Z;85jfA-N=$gp3ggx-Ebqj{j%W|aeg{3cGHvCyeVMDBj(8yU zD2GA8!O{|bSvT^(^S`@Mg6q)Y!wjhF2R{zm^r7lF&Gl^K&)ml-%XD41@^xF zWo|&yg7u4u-8%T}(m5it|8zMj%M#?jXLOPO6UEgZwFk}dWPC6|jP4f06y@!$jb`A0 zRqP$U{-;56j&^LZ$<|M@a%?!%;f&yQpR%wU!?9~m{9oo2PK=H0T!JXn45jk7^YcV( zoFhvq&di_o(!5FD;()a2THwQ^V!0Odz(={ zDf07PfaikUW7uqmGA;5ziz^oSX6Ql;wOylC)wQ38T8Y0=C%Uh=wtc(d-9nS4$@Lkn zEYI~DdOL5|b+D&r*L{5b&TnGXUGqigz5nF;m%Ns>VY!(cBbq-Hv>T3q}@55abhhH;E$s zLvSKgS&Bkjz~7$|)SjbCbEzORjax0*)- zEtJ+iyL(C+p6k1*e1zz{#=BIy0-G!xS&+FVR9layRbM!S=Y(XLzJP*GjL^t$!^g3P zkC5ARxYy(DQpDJqfKQdZ6z}tXCw1PU;~hTbV5uu?a5KGSEmx%7a^bx+m3xtQjLQib zDw+T@;T>1+-oVS!+0I1B3#q^R%ONsP{u;a1JGo^*e?;eE*BV(owbn-V+l$40A&iXJ z$FI53N^tn?h;#0GoqUXYt@9rufer*{z% z?#bjEWcfaJK}i;nB|`86I^IWuc0-XWk5{Bp-HsM?;=bVopX-QS-S}hRToGW4@g96j zz`CyZtS_?Q2v<9iQ*YGeoIfYNJC3BYJ8u0gd02qYbt<*zB2j6ROBW>Va^Bb2aN~H{ z>XqbV&Zb^^4Fc+CaM*2vKY2lh|Kt&-u<|6jAW!F`=(X=|C5GQOB)ZA;*@0eXZj53k; zaTqr{`gWM0iIm($jo=gv)_?FNL>Y7)sfBF_L)T&8NK6u#hC3KsQRWNwrhad46-kNL zR{A*Q?&?eGHfwyg9vZ|POsq)hb4iZbh>_EAcF{a$%MN70=9m^;?5Y`W5=A5avKo3H zrk74DTZ~x_{Xj?d_GS)YOg|3&GxR$|8_A$`{y6j;8zb?WqoI0z3oCq}XikAkGtBE!8w@UdRy!9 z=x!`U&;LjWx@vOL&4owLPF9Yr?tJqD=&IQM#4U9lIEGXyQq*_&hCPd`Hj)#`HpCAb zJ4c9|x$nEI?zd>h7=0-20Ms_Yx*h6>G+1a$y+`Z4cXN3o=woPFNV%Cws>)rGLLH^3OK zLgJ5-hsXjt1Gpj-jehX)(5BCP^2CYufwx5Fu;+pDN1fr$G4FfH7wmEdW1B@)PpZjN z=!>}7;YF5#ZQmw2w?aq0sG<3Xn&&YbV`BS8qfrtj1omu0JjT*NLnTB(tfrRb%oR5# z1m8K#?U?NHcMjK7hmuhn(@u|P-!L82?`2ueT2k;|+r`pCaf`;Z;K45k^$)bqAY83; zs&zm`K$CsqoXvrUI^bw;CHe}0uG9Gh8gf#1F)_-Ot{X`RGz&Gx59N+dfN7wDyr-uK z^U=-CmfjO1X6v|sLlaw~yR)XpE=LqwpA&V*un52_hVY30=#D5mG;qvOjsD3miQ#=O zWBgZM*kqo^gUnwM&j~W#EH0?@kutD9v}jAXwu~Co%{{+DV}-Oe>hK5~i;18Q1YQH6S-5p$Hm2E1t4lmh%nw~@w$LimK1_{9@1`LCN*Qnt9(`@ilQo#8L8go;PF9@u%&$u6u=<6o{P2fjC5gp6Og;0(-ZwoEQ0d`4r z5~|JKN4D>*eCpn*Xchca{BdEB(i_02_4OQ&=B(MJEI#x7nwfy_SmSP=f8T5og3~k} zk{ZvQLe12~NOEltGG>JLa-=qWXycTsMHxCU#kQR}G6pd+*rxdy&D0Mb&z1;2;8rmb4S44@2IEoyal( zg?5C9V(-~}!Y}V&Ld~n1bpx1=;1Qw9JCMKVX5Lg(tK&M!u8=Sp#mUjn-(*?XjPxyi7hDnpNmuJo(8EY&kB8~?+~DB3%XDWsx6ZO!lpNRqWdxU02^82j^`d#iV{FI*0HS!uK~0VYCFi2$Wb_I!<)#3FfRMN9EaQ-k zM37pv!(@r8$WeZXnL9~mj%30ns@hPGn-R$CTDn16E&!r8a^K+{Le%t!o4V-0dCWV8 zyyKsu_Oz7-Fp5k~fEa{xW5*6UmVkCE<({{w(;`ia@A`a06;fC~j?0C@^JfOSQ6t&} z=!I^HAVuMExqBqmV1Ld%P!asG%*ofV=9JzP!s7PTElg}TS_9E+EunW>BGIYgjW+W+ z-)xd}M;<(d8bmy}UOeUKT97DHC<(s*8v`agqD?kD#+YW0XK;Qyvgl%X+QvZ^Vvs@s?+I~ZL-rh%N(h>JrJyqn+Nj^t>UA{A zz-xPcPKJV1*n+^1u@&s!9GOEnqWzr9%&axRT@ZjoPco@lyYeMF4Ey5xhhqHlHdDnX zPKRCS2UuezIJ#;__c}HR9`d=VU4V4_ zQUkrSGY+epdw>i-QLL1WMiIEGEYRVtrb@+Z2K6Cgg-Zfypkfj$O3x=bi=G(|v~gpz z)nxff*{C27Ad6NHU1JhCHCe{PBndaHJay1>iVnleCj@nOAVgj82V^pqqK+1T^6MHg z6ql&R6n+FGG6F7<(C_=85vOoz|Kb&YL7kt4qATgu71f0wI5!w1tr?8={0uFG&;mz_D_2<~AG8iFdEeIol#KZ3krIdDAi##mOSlfKak z5)V!Q(zIeGI)D;JNsByMM(liLyS;F1%a0xjp4R2N2R5wBI$0Um%Iqv_hvW3=fXLc{ z6DEpwOmMS{Mwkj23oB}1M+i)j11HMagcNUu^R@*F2a*nfo<;%jBBGjK>2Zfd)0c#< zyCvxJYBamu0m=$5-!_>;+2s5vr;F%ld{>e z21V7UV1)(FPzGF}Ip-lxLqPyf0?)n_Sy%BtQ)a>6uR9QU{Fo(9=D>fao&i!pzl^ld zGX{olQhqiO4`c&@2ilR^KQIrx#ZYQ5tn#>7Pn|m)w)lC{0~r!vL-k`vv=%d1dgVfv zNS{?;iAIZzm!fYDC8y1>f({>Gjklb}qHf{#UTo?@-!MrxjR}H%YSeh^%ftdl#(u5S6-N5eN z`lSouuFVoIJ<0rxHwz`9Cl9=v%M_~RBGDOm2>Egs!eY+>X-yWBQ43k+HTW?twQOKn zsZ$d5 zGkixB;qD6&<<6#Vn-wEC6wV^U@%9Ki3K}~-#^xBP)FM5UhgddopAzNmqHUszW?P8% zRhE;puQxezCshwcM^pJi)(MCrEXEleEoq$O6W}jDGoceOBL1B0JX`z&d^bqaiiiir?jsu12;B%?P}N97 z5rzv3tj3v>^&J&qm{_98ayL27LrPop$M)Sx-h`ib0RTt;e81e2~&8!HTU!D zLUAG@UcXvuLaMYA<;b2PTZv=C*&(7;CTabcqvP>J8K%(mA0iBYN-NhLPd+ICX(&<| z7o{OHu%i?kgbFsP{b>uh6Xzj$bm1Mm6Js&H80%5itx6_3e3ejC+J$NW=)tvB+-Bn# zj}cB+Al*U$GQaelifp<{Yy8A(tqKHHSf;>7#{aVVxIo54{>SWI!gNHjADz2)q%F<=xN>U)T7 zAOg63BW0gLP=pv7-mpB4_Z>%h)`P9awB9Mt-Ba8ksr>Q_!O9J`V#%Dp1m+bBEN@m7t{OP zEVG|rX&rFRTZA}FP-hF>jYT~QSU^^hoVvgGr zZj@BYp$<=*M<%g%9yW|}E%94DTkw0q?@(z3B?Co51d7!e6se0C-M4D3lpI>)m3(s( z#nIjpk%zwx&&7ceO~X@hss{?NS?ZGY()8XskX0J+c%E2t|KJ}3fsxLfVxD8@c~DU6 zGxsY@xHN7WZXI^~h*s?Qb;U%dD!9F7Y|r>SWP2*Fg{M(`U=?b0?HqKSFY(yt6X=U0 zAHTKt!T3Xas7lULX@=)Odm)G31eCj8Kq*^PwNyAIaPg{-%RtukJnd^a5`$rak(M}w zGk6rB)O|sMLEYLh0kHsJ2E5n=EwqdO-iWX)V^MPx$QNwV=Xq}t5(PSw1<6_ z0A*nf3NP5LLf{%8^?NhHo~$mdimPxLxjbV^xn+b=xjG+I+JWPSU<)BIt_4X{7hhn5 zO+u2b5uiwwv$!oR$9*e_mWUR9GFH zngIp|=qwJR2z{vrkuwwAs&|tP4mXrn!0@zx{Tj$r5XA7dA@Lx<#22k+#KHFa&4Sp@ zd`GoStJES+de6fpzaFu>3Ab})l4%IXDRTR}BMlA0Ae6##NFFdM6cj~k=C0B%W`^uB zrOg?Mywtb;$PkKAR#&D4E^@t3UY(VXY>waLir7T@9PTadyMfK`?ZsUza5$&vvdx?j{d0Cdxniwqu%5B7J75v_N_W8o0(G@z zk$9u&q%{kPSqm>Ta7K09$(Xen&n?$w1}0>38Y6vM!>5q?aVx8Sh3WF^-^Jh})`nccbyAhbgAWy@Dlx#@huYPLH z2K?;AS~RRp1*nj#1uH636q zASu*d2#lh-89+5E(RyPJL53Vqupit(D1*i4Ma7Q7ez^$SPChXoJ@`l!)?n^~28r+# z)E=^M15>Fb+MhUlT(K#61-v5PSd7M$XAFeAC%J_PdcBr{1-hPJ6wCKsu`@FSc+|&5 z66$YL>IlA3kUUZ zYX%kA$+{jy2-Y#oM|s4$kj;^K+Qxc`5xyvxQwT;tfE+ZKu{;(;n=L$4tE1MZ2em7L z4?3%EwX%=<;wL6ES2~dHU|p|j~FNFcf#`w*(q92E9l$`qZz8o)w7qiDQH4w(54xVJMn5_RaqeQOiRWcfQ*413U&sTLkpT9ETjssVM|q9FzLMg2tn&|!CuUQHR3)( zCmobpJ2*~e64EmoQYmFUjK5&JYD^vgjbLX|IER*`70U#n*nYHdCHg)=HqO1hTH^f+ zV$jkw{y30|rDP{44J+}Umstp(Vn)EDcD!Q2@sY%lz4=3=@~{P$OeM?*B_?nJRFPMG z7Fa_~L4KU{u?2JSdYf2dMb#fY0u2fMNepxIg??WW$pqv*TJNB^xA!!P;x$TKsEe&uhU%e5_xQij5uxuc7E4gS*0S7@)V+p zO9Gmd^=MWvDp9sHLpktA8^Q5(=>GiX0f)n| zibFyVhC$_4tQqA2bguJ{0Aj;LNNXn7$@DB^M|Qz7O>;YQ*q{N{@uhbF)+5KluCnxE zKWRo%TsKwqVh(B+YZx>Mv7+-dxEO^Coy#FS1*WWE)&%9c$!5d43j-WA4`^b3xi{OC zRXa?sIbEw;ouiAhwdM(2t}P$b(BbgE^{6mH`_1MV=z0`53B!_iXA=@>85Cazpdm;1 zNN6$ng^fBuBo{<*)02^ACA-%;`G;_-$JL37Ifur$L;GiN>q9}x#FB#X;s_P=hZ(d1 zTeQRupCCTOssnVsTBPn74X1Uik`Zy?6&8olZ%K{11BW7HU>BN*7jjyE(GFzmxgU0~ z^gyZGi?7o}Dh+9{K38#4bjdk2qY2|ix=00;y9{}#9)~}yr$46Ui{rQ7XGWlS#2E$h zjVBIpI+R^yVG5LI*x*DR<_)BVE7dDItiLdnu}I6k5e832Q*VResx=T9FsQ_JaT?D% zB#`t)70P3E=o@)^p}lIAHV!m~Xv;@b6LF}7#6o$D^EBd_Oi{W(Z_|9`tY~WabSUrd z^(un(uA$OlSWvN9)LUW3Hd1pRadLwIc6Il!r}zllXJD z;;ey!8{4sqt^3ULvyzZ*+;Som6lB^_ zF`}QTi*2ahdC2fNJ)Xfr58s&UB&kn5nTynAn}v+pd0>!fX%1j2A@;6JCPVY9 zx2@pu39sr=W=nSzz#TuM5^!Qb;xr3=QSB$Osc|;w$yr>+En57(J(s*VspNW_)Ha?L z1@yGhHVm%kHXKNBWz~To@?MHc2lDfaizPAsn1wk?MTIJS2xF`k{UG?Y>Ds-gbT0k& z+J#R+S|tUSR}Xu+GU^aNP@A~EsFoo!Txce{j8Pd8ze2gEl6ye`SW-RY9~#r$<_{F8^xoT;OfU4=6PL5u46d=M1)zLf+hKUHU|Qj& zqBApWN21Fv;r6p#2cu#3lfNGzY{r_hoc*yrs-6!@FVsw&3h)pZP|>?eB*cHZ>SFu3 zYqN#>6<*`#H(`!YiFbx#LKXvl|>jWgz z0$tP3wf=m?{MZSFy4`A>^BUso?tV@bsqw3u&2mN6O5ZCuGzL%=tLtDasyXPtdU3T( zvdP$%hGame~&bQ4D5{!h>U|aAvD{Iq9+!rz}xY-*P&2L+*YNGLJQVB+BZ-BE~qH99yhGt#_Wmh z+Bh~^HnZZyhjHjxFMUMus9erm%v2XF)5NNm>Z2Hx0Too>&}7cveuLj!Hk(i)uGSkc zLzW+BFrv;7uWPffrSB~FwM%x9J8qSD9*I`sboAH0_0g{z#M2i)N|WVSii_SYtPP9M%uytI^`Es_nvICpF0efy@8I&{Y4w@3;s}47jb@A{ z90q(WKz_$>Zj)&AjoF@&_k+Q0p1}#Whjm7d?vWXK|R%c zkXrj13wzq1E5k&C?_SdlJ6y%j+I%uPOg>x(V|vzC-X;@rX=0lNA52bVb?;ykoN$My z%bTKJN&J0qr2nkU_Wx>p#M`c*qnLRWYHpoe0Fb?WCK zTucUwrQU*N6HEBuOjv8^DBS>#keuPv3i%jX!^gIYRG^pwB*Zk7Y`xpi_}M{(O+FjA zBRInFO@Y(`g%2JL1NvQrzBla*A1yCRK_7Gz5j@#XH8L_IHgSVU`&^ySb&~n>)7?2k za$J9bh4wlAsuT2Idfy}~Khu}V0){K!qp+*d=$#%SlWv=-#)(KGZw*2QW9vS0HJXVbhgGVPrpwo4&oaIUyJaeWZWKhSDpp@4ipy^zya;eZ%HY(UWnTE!@UP-~f} zY_u~zYKTa!UM_ImnI*Tq!Vcil<+|0l&8&a0CI>f|+Xu(Fy%?)uw81J4Lv$)|y^|%~ ziHmW+WN6bH?j-m%qwJiiYbsouT!v(vvA~aT*I_vSIdAPKciv{=C>Pqb>O)snS9%p5 zy}0)YlGcxNX>6k+`qV)sbaMQRZoxq0V>wrc?YDS8S3Qa+J)7-VnOrDkBP`wkt4VVi z;fWI47_?e$`p(-Bw8*-5y)^;>*Mu%?CV|vkLM(3lD{BX_s{6iVvZ*LBtNEpO;dYJ* z5_*R7FZ%cs7V+U3at0(&Q-k_RQWJL-r!{5j%`uC?=meqF{qxq@-TgU$6nZu&MzTP1 z#j_vpFQLA}86nN4)QDm)L$=K&g$s1yX6C|e6}HSB&T6Wm1QQgyumK!>US;4H}ZzgSD|XF9*5UV5p`RoTzlHf zP%w#blo9)i2V3xqs_f;C*sB~URC2G|Knrp6Ijq7h=A8Nu3#Jq5S8ZlSYnaxH20oq6QvSAHCZTWr4 zVD3_GxLH{KwVp3el0`9TyLGdI#z&uI_qD3rzKqgOec7LO+TfamIbPiKQ&i`78p+6^ z6}$!s=qz9o7fnuBLk7o(dF}#>HD(gk55&G@cojqh7KV|ZsE(P*7@~9~Du$C9of@fp zp*z`3IjUNd{mEZI^X8+Gr%=_4{Cb@No;hLS>t!)j!_WfOQTk4rN-o=#X&hX|V1@nJ z2DB!<2vq82s{WoAm}3RoW|-KBFD1GKt6G`b)0jVl$k6=U=_JOI|o%2CLeX8P!hq9aGrG5qo(!At*l^=u$35BCf%T>MSdXerE8{V$sZOomHPtp=;}x znET`b&Xu5&i>3sqi{Fbv`5B3z+S}3Xine!`!Z23W7j z$o&5OktVzCa3^%Pn5x@x_(ejT&`?#rk0 z&u}Rc^As=jtBZ-Phw}rc^B+mkkYc*q{Uy5i+N7pqm+I#;TsEROzq2?_2+hztaC((n zOM*cS>R9?$L~)QtyJmJy5izwIl^P)UB!ma@<^fr@*;NCBbb2V`1uNZR=%^1>pLrSD zmYWkV4ig1%b2C`<3+#wZg97EZY$bJ@WOXz0yw;Jj2#DcWst4l40vYm1$3pB?5_i{7 zZ${w{Bh+j=gKW@7fo{Yy_^E+S?Er$XT>{NXREl%ODjeBvAr@gxN+zZTGyeW5J>_^$MMyO3yrKa%%z79yiGZnC zHihF#-idzUa(}J8`OEti9zO?}&(gLlRoO@Alm>4A5Z1S72-ZHr1~rG-n=%(LuARGy zy}`xj({}I`3hy>8rEn;GQ2P-2*gvGF$t-wP%F;}W%~ma8ONBLv^qc0+tvN5w{}h-f zsk-v#8u7L>zuG^UFS3YvOJS!J9@Iy=^xTrGz3v9gYlU*Bs+WO}rLD4Q_um?G z^?OvGu@vXUlKNm08is(nPaV7(t)18D(v*1U06Yb@(|dWiN8#Mn<@t;1B6Q5cU@f~u zZ@wR+K)ZVesxPYrek~9R@e&vKz99q$HZl zQnzWMx=92Iu{UaooxHXs)#WH}i{QY`tSVMh-#L$;&sXCD_b9ONZrdJPn&T=!VocfG zf`<@Wve3Wa_r)N+s|IAv`$?-MzA-_gY50rKS0702+MPw|sn6-w#tVF0C7-_wKIN;z zDnO0=S){?o<+ru=xaRWUCH%=4n_Q%r2vn&tN?CF4Io<3wV$Eh&ol7RC&39lR_yN{V zE|VcsKk|BYK`&(L5Ds_pV|Soki&&$@k9c+N6@9%U2- zZ-U++Ta|1Zm9YfM#!3utYcDGuSua@#{hTy^Riti#H42kkofZhFMzpTgm+Ik+Lh*U{ z=lKhubx|z7RJoz<@!4FSN+i8_e8Rr;FTR#!i7EEG6qPE1{!p0dmaKX%c!(P)_(Vf} z^r}@(4W0)fJf9$PZ!m_<<5gt2Guyutk#3wbq zXZleoacnz@B`k7U|3r_L6#_-gAhQC+;-EpYvZc|yM!d&q8&Am;L2dr#`&bXfUf^Au zo>AuzSORbh_KJ4rl^|;bJxag558z6u^TGITnot*xc2U@ zun|iC6(N9wgl{kn#Sul_E;A3y*!ozT*G*1M6Q8iKeAV++V|>mzHsLIM2{RBp*mql^d+pjrAgw$gd3S1#)u6)Xd1r zkc2GvF&Q^pQC$rlX%*A-KyeCnkQMXkCxLMPXGuXVivx5ObhYLU5>lN}#I?Yo;Gf|a z+3Iim!@$()qasw~Uz^n%OU3K?F`HHm(HqEwoN3suWsP;k7*Fvb6~`u8l36uU?eUgK zk4r@wk&nL;dg=G#5L%n99ktMS@0~0cQF$d21lImT#3b`!J>f!XO_NoqW)6ceQTq)@eKul6`_9J0;^7-m@Hb((luphap zP&m)28?W?mJ+?T+H<%+_X8lkg{A)mO8yyH7vxovN1DjDaYWmF3xmqAe!N%~_1i zKrXZFnzzIAL((2fOcxc4=nKdtxs2^XDQ11t7~jmX5y}N%l*Y!Su5`EqENnn+4iaj_ zcX{uP4)aX{ybZk&Cx665aHDBmg!xb)rpw~f!M4Ogm9MUL$WKY?e4W%=yvnZ>q?YL^$k&=NKvY4V)fUT~Mt7$d( z#r~O8t@4B}B;wH9OI@EXe>L%5XpJ;l`{m00X4ocOpTnor@(g`4-*xn1g#i}nva{97 zT#&y<9X9RZ_JfcseT*pYK=4!QYP@csAC}}a@-K$%I_~a z2aM7&zV2UYw@jr(C98iO;PK#sW-ccY6&xn3PGsV&-CbOY$^J!^S9B%)vks;i34HUd zpi+wd>0Fs@|K)f%<>^!q4dNpN{Ea_^5!K=X)7~c)001J?T3lRNMqKnGVZS|Ps<8n$B!Jx;HfHAC~EvC{!Ar?s@IJ`v1PP%vq<1{|)X z0kJ-e=o!?&#DvU@gzTe{sulW9ucPqBH}CassIFKc>Q!Dza9PNl`)QfFKR9&B5Ir{Vn$b1h6BWNPDh}o`sj@XaT=e!qb5DqVh4@C z32l8{$tOi;JV!?IKq_eIiozH~d7!n13|m6cQ%1D^$TiK^w~5tAl5sHVg(A&QVE?mD zy<%3b1FBHdfS180A<4iV=II)}#hXSDml9x;!=beGX#tk?LB^}QRw6Fovn_bLqgKYd zXBUO_wj{E{N=_(iLkz-0xY&La0;)~qCTmXbJ!v_rNLYvNX9yIOz(xvCeP`FZ<(0KB zmby<*0C57R6g4oz2LJ#y$NKfz2yF#isQchw(ue=xUTc{S<} z&3~7Xl2K6phs?jQXBg8mPG{b9==e&q++o4Nj0DgzXx_-!x0xxJaSIsYGrCgwcm zrW~9mOdwM}HYQFsJ~JjhQyz0BK3))y8Hk77lo!PLH!2xBXBQJYGth6US8`_SR~~LN zK0Z@+PF5y!GhP!WPF_=XCO&pEUM3D6E>3oH5HA~-g~{J2l$@+zGr{D;->v#hW&TRV zXJ*dM#=*(O#A(iM%ESpWXJg`J1#vNPn3|e`%s4sOEiAbIp!z)y{G!S-f)wn`tpBW0 z{$S!_Vee%7nqJm+=JxK+|7=pXwgsuVnEZAd8#g-}8!sytCnq;I7Y{4PKS7!xC+F8N z|INzA%FNFGM~k@`zvL^Y$!oY-+nQK{SRCvu|7iFs}e+T|g zOlns4?sorYJpY9LgGJQI#ogZNy^@oXsSU`?<-h0oufYFcQhlB6oL!teW&Ssv`v2er z{tQ^@S6O=}&%fzc13CU#`g2P9VEu=y$jJVf2KY_P{&c^yi5tlLk0E&V>o~tA*B|3dM*CO%(fzA6?pC1R!NtnX#>C3S#Kx`8#>UUZ#m~t} z@#koh39$U0VgIAI0>9@V1qJ@U`$ORO9K|p5I}p`e9UMMbgPi`=PyZ1&|3A3D$^R9j z|2y%&!~T>Ow|DS-&0;GTC3n03R{ehg{F6c6+6-jpZ2#Yx{&&cqZu#3n^lI~;b*~HD z>w3xZj|KCuDEXa8{|{e(Mc@BJ4X@PyR`Ngc@4wykZ+HEVJn%mP|2w+=?XLfk2mVLk ze@EB}Ha zl)D#$P1?5vT?S~Vm>{8n4He1{+u9;ikphpg5YSs+Yg&(B@zjHs&M&sy3A@($&ij<_ z%VxcQj`QhyX70CKgZj0ROv>0Hj=bUS{L3d_|4rwUO-6_DP0$=g-R8+MjPLFFNLp5|mf7EAMX;5;W` z0WQ5ax@wAR2b-ZMJlm zJ=8M!hhHJoyD5?jxM02<{dr(;cmf1#KDE<)sA`yx#`A>Gp-vVO%x>#Vb8CvWMXDJ zjWNMG%;~6kY^T#1io#Hd<&@CJ-5^raKo)#oVGhIwOp~zWmBvIu z-OF5clB!+GIQm(`&gUHGvOqu1H||~bvZ(&-sgwlui(TgoNj@-AXDow{)x6DV++7^q zP#g3inq=Rz8|)5|C&yo0PMgus2qVWPCj(1Lujp&w!JFRS?>)-1IgUG-7v>yx+53i& zM%}fV76sxGkAwqtM+wf1VR}Vb-AFly1{7XeQsQyRYgm8Se6&VVU4eoOXZ6{sz=O4L z{l!3c^^_Q8O3Gtn|E#8yP)-fd1*cK0N4@P_IM?z0t9D)HA(njRYKM#1jD>nY>aLEm zR$FLlD9vS8Gkux*XCr#>_Rlcy-WtMjm28D^ZwH7RJ}u-aI9He9i{q{m(7Yt4YO=%E zEGrsSwGLVK+j#AeOwrtp&pzW;92N+c&u!g+DUDRy7&;w=* zkMielIL4tdZ5(}a+jepz9)xT81IV=~4&!VsyNYEk8>w`qoZY^B76?FLB+ZhAvo6c~ zCJ>-BjqAOWhYrF!gfqD!BK<}JMyPa+H!u~8#G5<3lNgFWh7z-)@mYGe(Bz5_ z>G4_M>1(;Zt137`Fp~(Rs>Ze*xNjQxC{1S ziZ;}`@k#0pXF!H#@F+0GTaF{5FKeFkv5+Sv!UkXWg^6fqm3lZ=e1ca}hCZHypT>Ty z+mL2>i`6OiqeJNC)2ibWLvRG_Ze&mwF}&fYD$?_?Diby?^c?OS6ISz{kO@~EafGB;s7qOPn9y`oB0?Pc~54b_wj21Zn; z!ix`qNS^O~rD1|B}vE-5G`T^+rsxXS%RaO$7Omn(+=2qYbV*-sOg|V1&>aIf8 zEV#5h>u#paVM63Q4G1UWHA%paH+u?&KA~w3C)M7Niap0XkI#%iJ>|TRS+33SuUkGS zY79GghHmRcvnCKNQSkk%ej{51mXyPorh{ZOn5V#N(9y_8G4wGA)b47_f)JLDw4=zT5t zL|Se8XJyst+!oBz4M*?S);!K9TlHOgA?T~dz=BD3ef!mACGhpoDbKYa8F@6BQi5%p z??AhXp$rN~9*M^Ot1YJGFByxO@9_mLhVMGsUb?FhXG9K;S`wZvm|Fz76VcM(>OK=- zB9zufRW|u=i2?YZy>7rCHjF)^Ph>(JZ6wT=hF?VA*g|qETMjyGGShA_6_zVE z%&TAO1{DgEx1Ur(V7%HR_D{+4i0hQ&%E$-1pQzv~Ot*u_5KULgEDC{sb&%a_afR z8gF44^%iq`s-4V=t4WTXxxf3R2S=QqW^76fKh~{h>*jkizphV5)qzVh3xh$}4^o0b z$7xC0vIN-IACB7Y9FKw>NjW&Nd(UMb2w>y%lX=iMkUyOPJ;{_;R~r{`ei{kXRr_)X zHLMVHVQAZUpASB^WbQBYjY%$D#8nO7(f6x{7u)5r6EE_bvXemLx{`f}dLaf0DlN1`3Iji#28K-9Fp%I$4yWoMpOlacEYP+Aw~ zYF5=yZD!EFMindw`c*OWxuJ#oK_l=~cVlLHrIcz*Rjli}=1x_ungAU16m6aVG48oP zeK0kGI2}^STIB5=4=3c0_xoQ2G^IZF3W6B9I5pxPzyHv#XIa?jNOMjCt8a}B=C9+`?RR4guaBL*3DfH z)5l?FgI0BA3k0z6n&!&xliUR|irM#`eA^>E7NSX~87ipeCk7OXGTsS05}LlS_wHL= z;I3i5UT>3p#7f+pN7N!@Xf;c18*oa4N8{JC<=L_0>PuAJ_LrfKvkv}6N0+I$p;oRw z=^0AI2zgms8t3%9S6fqM5x8B@4u+vT8s|k3&xjhf-_zkr7cX^>f4q6pw#nex`^IhA z7k!slV0Wyomp(cpm_A=I8P#axgk@zB0Xm}!QhzMFU6u==PF;#X+z7G1T3;RMO|f9M zAwAfhaC|WYHQ!7Mcty!;m**vX}MHvzC%8MC)xSU zwN1y{nHuJGQX0v{ACLvhegqVO#o&a{Jx)*H?cq697#knU8V|-hT~X|PZw$Jud4?u*p68Sg5})ma)hzRn*zs&I@S^07Pp~0A%=n1;=(0mVuC|Qck)rNm1XA z69-}%wElzH<77^vG zf;ZO{-%v&A>NF@nPFjd>A@`=@a~n(5bNT%rt?QHZo5+^Rfq49r9j)t0qVe zaCFbh#?KbLMtLaVO$ou}sYeNVj~9`_iQYW!h=L;uF(v~S z19Ki%ges56#Lu8D9x!C8k;o%bu_Ayt!`p)v}?l$*_h| zo4=g%>=VJs0lZZJ;$pXTF!!d}`J3MTQg05_)HrMP>1?>Bhg51}RaVZ?o5ci)8>RhQ z2jY@ZAvG*f%n`pY^HmGVQ_1iB#t6>`>uR)#l&*d8{NPhw*r%CV4&;7S&kJh1?T3DF zM%~wW4NF8-K~%|pt(%puIivUS_wv`D{?I(mc=&^y`7ft&*1w+4hHH0K>?Qi%pa0ha zyjaYn5|yodZ};sS+cbcd12l#V9Wr!?Jgn0bEkPWqhSE({xcvV4ELwjq-YcmWZU}L! zF%JY{H>;jiZ^D<)evI$!xqX-y)a$k**+aI<3F@=_B3UR`!*&@5m-XfhaT>3D zbvJI4&tsK{=9$z--xJe#3(D5S@dn)NFzlURULNF8H4M=zD7HxcPN1yMKNjS)`C7fhymt`s}h| ziK2-yXYnlNetI_6qp=$s8a*&;8g8Q}^}>%ozCH8K(r5vDM1Wb&$_^--Rl`{JkyXQt zxd?Bx&7rV%4xd|mr8$FLl?Gx3c!#t%-*)%KyjQW5=zHN-oES|EO=I=Wq*x(U>Pv&Niz|(H?mQGGN{mCkmk<5m41Rjmt6AA{{nm?lBiqW0 zSv9V>tl=h-g=HTPu7T^qr3;@vuaVu5(u&=mulKsrX)EU$z&p1cjOyzP>Wh=|>?J?P zdmomQF&O}Svu6qSoc-vq3NaUhxHI1UVsG9+aN&1_hoqMao;-)=uY48fDrLJbHWZ2Q zyb3bHZ)isD!f{5mW>#yIGtrI7(rC}0`S@vd_Y?nY%SHB`i#CVIA_w@|YoE#A^Zh+{ zSoCIA?p;dn-yX(xYNa6+g7_gdObWglJ?~8)19XI!ZRrJd+qeLhzSXnD!mR$k{L|hM z0pIuY-ydnmy0mid(){n{JusJd@9vF$8do`4LsF}=j&Cwjq(Hzb3 b8#VqH(J%8%E3HYy00000NkvXXu0mjf`h(6k literal 0 HcmV?d00001