From ed2d9394dd9f63df936666b7969af935c894a087 Mon Sep 17 00:00:00 2001 From: Radovan Bast Date: Mon, 27 Jan 2025 21:28:55 +0100 Subject: [PATCH] re-shuffle episodes; closes #2 --- content/good-practices.md | 598 +++++++++++++++++++ content/img/productivity/chatgpt.png | Bin 0 -> 54916 bytes content/img/productivity/code-completion.gif | Bin 0 -> 91290 bytes content/index.md | 22 +- content/refactoring-concepts.md | 4 - content/refactoring-demo.md | 117 ---- content/refactoring/countstars.py | 66 -- content/refactoring/snakefile | 21 - content/refactoring/stars.png | Bin 11550 -> 0 bytes 9 files changed, 612 insertions(+), 216 deletions(-) create mode 100644 content/good-practices.md create mode 100644 content/img/productivity/chatgpt.png create mode 100644 content/img/productivity/code-completion.gif delete mode 100644 content/refactoring-demo.md delete mode 100644 content/refactoring/countstars.py delete mode 100644 content/refactoring/snakefile delete mode 100644 content/refactoring/stars.png diff --git a/content/good-practices.md b/content/good-practices.md new file mode 100644 index 0000000..840bfbd --- /dev/null +++ b/content/good-practices.md @@ -0,0 +1,598 @@ +# Tools and useful practices + +:::{objectives} +- How does good Python code look like? And if we only had 30 minutes, which + good practices should we highlight? +- Some of the points are inspired by the excellent [Effective Python](https://effectivepython.com/) book by Brett Slatkin. +::: + + +## Follow the PEP 8 style guide + +- Please browse the [PEP 8 style guide](https://pep8.org/) so that you are familiar with the most important rules. +- Using a consistent style makes your code easier to read and understand for others. +- You don't have to check and adjust your code manually. There are tools that can do this for you (see below). + + +## Linting and static type checking + +A **linter** is a tool that analyzes source code to detect potential errors, unused +imports, unused variables, code style violations, and to improve readability. +- Popular linters: + - [Autoflake](https://pypi.org/project/autoflake/) + - [Flake8](https://flake8.pycqa.org/) + - [Pyflakes](https://pypi.org/project/pyflakes/) + - [Pycodestyle](https://pycodestyle.pycqa.org/) + - [Pylint](https://pylint.readthedocs.io/) + - [Ruff](https://docs.astral.sh/ruff/) + +We recommend [Ruff](https://docs.astral.sh/ruff/) since it +can do **both checking and formatting** and you don't have to switch between +multiple tools. + +:::{discussion} Linters and formatters can be configured to your liking +These tools typically have good defaults. But if you don't like the defaults, +you can configure what they should ignore or how they should format or not format. +::: + +This code example (which we possibly recognize from the previous section about +{doc}`profiling`) +has few problems (highlighted): +```{code-block} python +--- +emphasize-lines: 2, 7, 10 +--- +import re +import requests + + +def count_unique_words(file_path: str) -> int: + unique_words = set() + forgotten_variable = 13 + with open(file_path, "r", encoding="utf-8") as file: + for line in file: + words = re.findall(r"\b\w+\b", line.lower())) + for word in words: + unique_words.add(word) + return len(unique_words) +``` + +Please try whether you can locate these problems using Ruff: +```console +$ ruff check +``` + +If you use version control and like to have your code checked or formatted +**before you commit the change**, you can use tools like [pre-commit](https://pre-commit.com/). + +Many editors can be configured to automatically check your code as you type. Ruff can also +be used as a **language server**. + + +## Use an auto-formatter + +[Ruff](https://docs.astral.sh/ruff/) is one of the best tools to automatically +format your code according to a consistent style. + +To demonstrate how it works, let us try to auto-format a code example which is badly formatted and also difficult +to read: +:::::{tabs} + ::::{tab} Badly formatted + ```python + import re + def count_unique_words (file_path : str)->int: + unique_words=set() + with open(file_path,"r",encoding="utf-8") as file: + for line in file: + words=re.findall(r"\b\w+\b",line.lower()) + for word in words: + unique_words.add(word) + return len( unique_words ) + ``` + :::: + + ::::{tab} Auto-formatted + ```python + import re + + + def count_unique_words(file_path: str) -> int: + unique_words = set() + with open(file_path, "r", encoding="utf-8") as file: + for line in file: + words = re.findall(r"\b\w+\b", line.lower()) + for word in words: + unique_words.add(word) + return len(unique_words) + ``` + + This was done using: + ```console + $ ruff format + ``` + :::: +::::: + +Other popular formatters: + - [Black](https://black.readthedocs.io/) + - [YAPF](https://github.com/google/yapf) + +Many editors can be configured to automatically format for you when you save the file. + +It is possible to automatically format your code in Jupyter notebooks! +For this to work you need +the following three dependencies installed: +``` +jupyterlab-code-formatter +black +isort +``` + +More information and a screen-cast of how this works can be found at +. + + +## Consider annotating your functions with type hints + +Compare these two versions of the same function and discuss how the type hints +can help you and the Python interpreter to understand the function better: +:::::{tabs} + ::::{tab} Without type hints + ```{code-block} python + --- + emphasize-lines: 1 + --- + def count_unique_words(file_path): + unique_words = set() + with open(file_path, "r", encoding="utf-8") as file: + for line in file: + words = re.findall(r"\b\w+\b", line.lower()) + for word in words: + unique_words.add(word) + return len(unique_words) + ``` + :::: + ::::{tab} With type hints + ```{code-block} python + --- + emphasize-lines: 1 + --- + def count_unique_words(file_path: str) -> int: + unique_words = set() + with open(file_path, "r", encoding="utf-8") as file: + for line in file: + words = re.findall(r"\b\w+\b", line.lower()) + for word in words: + unique_words.add(word) + return len(unique_words) + ``` + :::: +::::: + +A (static) type checker is a tool that checks whether the types of variables in your +code match the types that you have specified. +Popular tools: +- [Mypy](https://mypy.readthedocs.io/) +- [Pyright](https://github.com/microsoft/pyright) (Microsoft) +- [Pyre](https://pyre-check.org/) (Meta) + + +## Consider using AI-assisted coding + +We can use AI as an assistant/apprentice: +- Code completion +- Write a test based on an implementation +- Write an implementation based on a test + +Or we can use AI as a mentor: +- Explain a concept +- Improve code +- Show a different (possibly better) way of implementing the same thing + + +:::{figure} img/productivity/chatgpt.png +:alt: Screenshot of ChatGPT +:width: 100% + +Example for using a chat-based AI tool. +::: + +:::{figure} img/productivity/code-completion.gif +:alt: Screen-cast of working with GitHub Copilot +:width: 100% + +Example for using AI to complete code in an editor. +::: + +:::{admonition} AI tools open up a box of questions which are beyond our scope here +- Legal +- Ethical +- Privacy +- Lock-in/ monopolies +- Lack of diversity +- Will we still need to learn programming? +- How will it affect learning and teaching programming? +::: + + +## Debugging with print statements + +Print-debugging is a simple, effective, and popular way to debug your code like +this: +```python +print(f"file_path: {file_path}") +``` +Or more elaborate: +```python +print(f"I am in function count_unique_words and the value of file_path is {file_path}") +``` + +But there can be better alternatives: + +- [Logging](https://docs.python.org/3/library/logging.html) module + ```python + import logging + + logging.basicConfig(level=logging.DEBUG) + + logging.debug("This is a debug message") + logging.info("This is an info message") + ``` +- [IceCream](https://github.com/gruns/icecream) offers compact helper functions for print-debugging + ```python + from icecream import ic + + ic(file_path) + ``` + + +## Often you can avoid using indices + +Especially people coming to Python from other languages tend to use indices +where they are not needed. Indices can be error-prone (off-by-one errors and +reading/writing past the end of the collection). + +### Iterating +:::::{tabs} + ::::{tab} Verbose and can be brittle + ```python + scores = [13, 5, 2, 3, 4, 3] + + for i in range(len(scores)): + print(scores[i]) + ``` + :::: + + ::::{tab} Better + ```python + scores = [13, 5, 2, 3, 4, 3] + + for score in scores: + print(score) + ``` + :::: +::::: + + +### Enumerate if you need the index +:::::{tabs} + ::::{tab} Verbose and can be brittle + ```python + particle_masses = [7.0, 2.2, 1.4, 8.1, 0.9] + + for i in range(len(particle_masses)): + print(f"Particle {i} has mass {particle_masses[i]}") + ``` + :::: + + ::::{tab} Better + ```python + particle_masses = [7.0, 2.2, 1.4, 8.1, 0.9] + + for i, mass in enumerate(particle_masses): + print(f"Particle {i} has mass {mass}") + ``` + :::: +::::: + + + +### Zip if you need to iterate over two collections + +:::::{tabs} + ::::{tab} Using an index can be brittle + ```python + persons = ["Alice", "Bob", "Charlie", "David", "Eve"] + favorite_ice_creams = ["vanilla", "chocolate", "strawberry", "mint", "chocolate"] + + for i in range(len(persons)): + print(f"{persons[i]} likes {favorite_ice_creams[i]} ice cream") + ``` + :::: + + ::::{tab} Better + ```python + persons = ["Alice", "Bob", "Charlie", "David", "Eve"] + favorite_ice_creams = ["vanilla", "chocolate", "strawberry", "mint", "chocolate"] + + for person, flavor in zip(persons, favorite_ice_creams): + print(f"{person} likes {flavor} ice cream") + ``` + :::: +::::: + + +### Unpacking +:::::{tabs} + ::::{tab} Verbose and can be brittle + ```python + coordinates = (0.1, 0.2, 0.3) + + x = coordinates[0] + y = coordinates[1] + z = coordinates[2] + ``` + :::: + + ::::{tab} Better + ```python + coordinates = (0.1, 0.2, 0.3) + + x, y, z = coordinates + ``` + :::: +::::: + + +### Prefer catch-all unpacking over indexing/slicing + +:::::{tabs} + ::::{tab} Verbose and can be brittle + ```python + scores = [13, 5, 2, 3, 4, 3] + + sorted_scores = sorted(scores) + + smallest = sorted_scores[0] + rest = sorted_scores[1:-1] + largest = sorted_scores[-1] + + print(smallest, rest, largest) + # Output: 2 [3, 3, 4, 5] 13 + ``` + :::: + + ::::{tab} Better + ```python + scores = [13, 5, 2, 3, 4, 3] + + sorted_scores = sorted(scores) + + smallest, *rest, largest = sorted(scores) + + print(smallest, rest, largest) + # Output: 2 [3, 3, 4, 5] 13 + ``` + :::: +::::: + + +### List comprehensions, map, and filter instead of loops + +:::::{tabs} + ::::{tab} For-loop + ```python + string_numbers = ["1", "2", "3", "4", "5"] + + integer_numbers = [] + for element in string_numbers: + integer_numbers.append(int(element)) + + print(integer_numbers) + # Output: [1, 2, 3, 4, 5] + ``` + :::: + + ::::{tab} List comprehension + ```python + string_numbers = ["1", "2", "3", "4", "5"] + + integer_numbers = [int(element) for element in string_numbers] + + print(integer_numbers) + # Output: [1, 2, 3, 4, 5] + ``` + :::: + + ::::{tab} Map + ```python + string_numbers = ["1", "2", "3", "4", "5"] + + integer_numbers = list(map(int, string_numbers)) + + print(integer_numbers) + # Output: [1, 2, 3, 4, 5] + ``` + :::: +::::: + +:::::{tabs} + ::::{tab} For-loop + ```python + def is_even(number: int) -> bool: + return number % 2 == 0 + + + numbers = [1, 2, 3, 4, 5, 6] + + even_numbers = [] + for number in numbers: + if is_even(number): + even_numbers.append(number) + + print(even_numbers) + # Output: [2, 4, 6] + ``` + :::: + + ::::{tab} List comprehension + ```python + def is_even(number: int) -> bool: + return number % 2 == 0 + + + numbers = [1, 2, 3, 4, 5, 6] + + even_numbers = [number for number in numbers if is_even(number)] + + print(even_numbers) + # Output: [2, 4, 6] + ``` + :::: + + ::::{tab} Filter + ```python + def is_even(number: int) -> bool: + return number % 2 == 0 + + + numbers = [1, 2, 3, 4, 5, 6] + + even_numbers = list(filter(is_even, numbers)) + + print(even_numbers) + # Output: [2, 4, 6] + ``` + :::: +::::: + + +## Know your collections + +How to choose the right collection type: +- Ordered and modifiable: `list` +- Fixed and (rather) immutable: `tuple` +- Key-value pairs: `dict` +- Dictionary with default values: `defaultdict` from {py:mod}`collections` +- Members are unique, no duplicates: `set` +- Optimized operations at both ends: `deque` from {py:mod}`collections` +- Cyclical iteration: `cycle` from {py:mod}`itertools` +- Adding/removing elements in the middle: Create a linked list (e.g. using a dictionary or a dataclass) +- Priority queue: {py:mod}`heapq` library +- Search in sorted collections: {py:mod}`bisect` library + +What to avoid: +- Need to add/remove elements at the beginning or in the middle? Don't use a list. +- Need to make sure that elements are unique? Don't use a list. + + +## Making functions more ergonomic + +- Less error-prone API functions and fewer backwards-incompatible changes by enforcing keyword-only arguments: + ```python + def send_message(*, message: str, recipient: str) -> None: + print(f"Sending to {recipient}: {message}") + ``` + +- Use dataclasses or named tuples or dictionaries instead of too many input or output arguments. + +- Docstrings instead of comments: + ```python + def send_message(*, message: str, recipient: str) -> None: + """ + Sends a message to a recipient. + + Parameters: + - message (str): The content of the message. + - recipient (str): The name of the person receiving the message. + """ + print(f"Sending to {recipient}: {message}") + ``` + +- Consider using `DeprecationWarning` from the {py:mod}`warnings` module for deprecating functions or arguments. + + +## Iterating + +- When working with large lists or large data sets, consider using generators or iterators instead of lists. + Discuss and compare these two: + ```python + even_numbers1 = [number for number in range(10000000) if number % 2 == 0] + + even_numbers2 = (number for number in range(10000000) if number % 2 == 0) + ``` + +- Beware of functions which iterate over the same collection multiple times. + With generators, you can iterate only once. + +- Know about {py:mod}`itertools` which provides a lot of functions for working with iterators. + + +## Use relative paths and pathlib + +- Scripts that read data from absolute paths are not portable and typically + break when shared with a colleague or support help desk or reused by the next + student/PhD student/postdoc. +- {py:mod}`pathlib` is a modern and portable way to handle paths in Python. + + +## Project structure + +- As your project grows from a simple script, you should consider organizing + your code into modules and packages. + +- Function too long? Consider splitting it into multiple functions. + +- File too long? Consider splitting it into multiple files. + +- Difficult to name a function or file? It might be doing too much or unrelated things. + +- If your script can be imported into other scripts, wrap your main function in + a `if __name__ == "__main__":` block: + ```python + def main(): + ... + + if __name__ == "__main__": + main() + ``` + +- Why this construct? You can try to either import or run the following script: + ```python + if __name__ == "__main__": + print("I am being run as a script") # importing will not run this part + else: + print("I am being imported") + ``` + +- Try to have all code inside some function. This can make it easier to + understand, test, and reuse. It can also help Python to free up memory when + the function is done. + + +## Reading and writing files + +- Good construct to know to read a file: + ```python + with open("input.txt", "r") as file: + for line in file: + print(line) + ``` +- Reading a huge data file? Read and process it in chunks or buffered or use a library which does it for you. +- On supercomputers, avoid reading and writing thousands of small files. +- For input files, consider using standard formats like CSV, YAML, or TOML - then you don't need to write a parser. + + +## Use subprocess instead of os.system + +- Many things can go wrong when launching external processes from Python. The {py:mod}`subprocess` module is the recommended way to do this. +- `os.system` is not portable and not secure enough. + + +## Parallelizing + +- Use one of the many libraries: {py:mod}`multiprocessing`, {py:mod}`mpi4py`, [Dask](https://dask.org/), [Parsl](https://parsl-project.org/), ... +- Identify independent tasks. +- More often than not, you can convert an expensive loop into a command-line + tool and parallelize it using workflow management tools like + [Snakemake](https://snakemake.github.io/). diff --git a/content/img/productivity/chatgpt.png b/content/img/productivity/chatgpt.png new file mode 100644 index 0000000000000000000000000000000000000000..679480101a3a56eeb38f15f9eecb0ddf294cdb2b GIT binary patch literal 54916 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 literal 0 HcmV?d00001 diff --git a/content/index.md b/content/index.md index 11f1b09..c006e63 100644 --- a/content/index.md +++ b/content/index.md @@ -61,9 +61,16 @@ them to own projects**. - 11:30-12:15 - Lunch break -- 12:15-13:00 - TBA +- 12:15-12:45 - {doc}`dependencies` -- 13:15-14:00 - {doc}`dependencies` +- 12:45-13:30 - Working with Notebooks + - Notebooks and version control + - Other tooling + - Sharing notebooks + +- 13:30-14:15 - Other useful tools for Python development + - {doc}`good-practices` + - {doc}`profiling` - 14:15-15:00 - Debriefing and Q&A - Participants work on their projects @@ -76,12 +83,9 @@ them to own projects**. - 09:00-10:00 - {doc}`testing` -- 10:15-11:30 - Code quality and good practices - - Tools - - Concepts in refactoring and modular code design - - From a notebook to a script to a workflow - - Good practices - - {doc}`profiling` (30 min) +- 10:15-11:30 - Modular code development + - {doc}`refactoring-concepts` + - How to parallelize independent tasks using workflows - 11:30-12:15 - Lunch break @@ -124,6 +128,8 @@ documentation collaboration dependencies testing +refactoring-concepts +good-practices profiling software-licensing publishing diff --git a/content/refactoring-concepts.md b/content/refactoring-concepts.md index d136161..554d03b 100644 --- a/content/refactoring-concepts.md +++ b/content/refactoring-concepts.md @@ -1,7 +1,3 @@ ---- -orphan: true ---- - # Concepts in refactoring and modular code design diff --git a/content/refactoring-demo.md b/content/refactoring-demo.md deleted file mode 100644 index b085680..0000000 --- a/content/refactoring-demo.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -orphan: true ---- - -# Demo: From a script towards a workflow - -In this episode we will explore code quality and good practices in Python using -a hands-on approach. We will together build up a small project and improve it -step by step. - -We will start from a relatively simple image processing script which can read a -telescope image of stars and our goal is to **count the number of stars** in -the image. Later we will want to be able to process many such images. - -The (fictional) telescope images look like the one below here ([in this -repository](https://github.com/workshop-material/random-star-images) we can find more): -:::{figure} refactoring/stars.png -:alt: Generated image representing a telescope image of stars -:width: 60% - -Generated image representing a telescope image of stars. -::: - -:::{admonition} Rough plan for this demo -- (15 min) Discuss how we would solve the problem, run example code, and make it work (as part of a Jupyter notebook)? -- (15 min) Refactor the positioning code into a function and a module -- (15 min) Now we wish to process many images - discuss how we would approach this -- (15 min) Introduce CLI and discuss the benefits -- (30 min) From a script to a workflow (using Snakemake) -::: - -:::{solution} Starting point (spoiler alert) - -We can imagine that we pieced together the following code -based on some examples we found online: -```python -import matplotlib.pyplot as plt -from skimage import io, filters, color -from skimage.measure import label, regionprops - - -image = io.imread("stars.png") -sigma = 0.5 - -# if there is a fourth channel (alpha channel), ignore it -rgb_image = image[:, :, :3] -gray_image = color.rgb2gray(rgb_image) - -# apply a gaussian filter to reduce noise -image_smooth = filters.gaussian(gray_image, sigma) - -# threshold the image to create a binary image (bright stars will be white, background black) -thresh = filters.threshold_otsu(image_smooth) -binary_image = image_smooth > thresh - -# label connected regions (stars) in the binary image -labeled_image = label(binary_image) - -# get properties of labeled regions -regions = regionprops(labeled_image) - -# extract star positions (centroids) -star_positions = [region.centroid for region in regions] - -# plot the original image -plt.figure(figsize=(8, 8)) -plt.imshow(image, cmap="gray") - -# overlay star positions with crosses -for star in star_positions: - plt.plot(star[1], star[0], "rx", markersize=5, markeredgewidth=0.1) - -plt.savefig("detected-stars.png", dpi=300) - -print(f"number of stars detected: {len(star_positions)}") -``` -::: - - -## Plan - -Topics we wish to show and discuss: -- Naming (and other) conventions, project organization, modularity -- The value of pure functions and immutability -- Refactoring (explained through examples) -- Auto-formatting and linting with tools like black, vulture, ruff -- Moving a project under Git -- How to document dependencies -- Structuring larger software projects in a modular way -- Command-line interfaces -- Workflows with Snakemake - -We will work together on the code on the big screen, and participants will be -encouraged to give suggestions and ask questions. We will **end up with a Git -repository** which will be shared with workshop participants. - - -## Possible solutions - -:::{solution} Script after some work, with command-line interface (spoiler alert) -This is one possible solution (`countstars.py`): -```{literalinclude} refactoring/countstars.py -:language: python -``` -::: - -:::{solution} Snakemake rules which define a workflow (spoiler alert) -This is one possible solution (`snakefile`): -```{literalinclude} refactoring/snakefile -:language: python -``` - -We can process as many images as we like by running: -```console -$ snakemake --cores 4 # adjust to the number of available cores -``` -::: diff --git a/content/refactoring/countstars.py b/content/refactoring/countstars.py deleted file mode 100644 index e139fd1..0000000 --- a/content/refactoring/countstars.py +++ /dev/null @@ -1,66 +0,0 @@ -import click -import matplotlib.pyplot as plt -from skimage import io, filters, color -from skimage.measure import label, regionprops - - -def convert_to_gray(image): - # if there is a fourth channel (alpha channel), ignore it - rgb_image = image[:, :, :3] - return color.rgb2gray(rgb_image) - - -def locate_positions(image): - gray_image = convert_to_gray(image) - - # apply a gaussian filter to reduce noise - image_smooth = filters.gaussian(gray_image, sigma=0.5) - - # threshold the image to create a binary image (bright objects will be white, background black) - thresh = filters.threshold_otsu(image_smooth) - binary_image = image_smooth > thresh - - # label connected regions in the binary image - labeled_image = label(binary_image) - - # get properties of labeled regions - regions = regionprops(labeled_image) - - # extract positions (centroids) - positions = [region.centroid for region in regions] - - return positions - - -def plot_positions(image, positions, file_name): - # plot the original image - plt.figure(figsize=(8, 8)) - plt.imshow(image, cmap="gray") - - # overlay positions with crosses - for y, x in positions: - plt.plot(y, x, "rx", markersize=5, markeredgewidth=0.1) - - plt.savefig(file_name, dpi=300) - - -@click.command() -@click.option( - "--image-file", type=click.Path(exists=True), help="Path to the input image" -) -@click.option("--output-file", type=click.Path(), help="Path to the output file") -@click.option("--generate-plot", is_flag=True, default=False) -def main(image_file, output_file, generate_plot): - image = io.imread(image_file) - - star_positions = locate_positions(image) - - if generate_plot: - plot_positions(image, star_positions, f"detected-{image_file}") - - with open(output_file, "w") as f: - f.write(f"number of stars detected: {len(star_positions)}\n") - - -if __name__ == "__main__": - main() diff --git a/content/refactoring/snakefile b/content/refactoring/snakefile deleted file mode 100644 index f40bdab..0000000 --- a/content/refactoring/snakefile +++ /dev/null @@ -1,21 +0,0 @@ -# the comma is there because glob_wildcards returns a named tuple -numbers, = glob_wildcards("input-images/stars-{number}.png") - - -# rule that collects the target files -rule all: - input: - expand("results/{number}.txt", number=numbers) - - -rule process_data: - input: - "input-images/stars-{number}.png" - output: - "results/{number}.txt" - log: - "logs/{number}.txt" - shell: - """ - python countstars.py --image-file {input} --output-file {output} - """ diff --git a/content/refactoring/stars.png b/content/refactoring/stars.png deleted file mode 100644 index f4c5cf7f129349b7ecb6004bb0f64d51d3899d43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11550 zcma)C3p`Zm`+sLlF4dB<+r@24tyQ8ZO%ziKu~BL_i?SyHC)r4FTS0<%S@k-}WHCEgQMP z-T{GIwr?{vT4-cq$o)PjNEm2tZ0tWgz-W8GX5*=j3in|W6`|dCfe0Dt;s30V469&- z4EL{Cwq$LHsQvNkfTsl)X0J-Wb}D3w%_c3KbAKJIl^j=W+@p4N<&_5)ybf}cecwM4 z{P^H-U*fGJW+oHz67P(GS%q7pe=&k@m3;zax5Gq^!%D1Vs z-g#e?0B-XZg5U@x5cqR=8Tv_bHqvsGFNTmfr!gsfFgnnb8cW<;ZfJG0@MKuH4Stf# zV&Sjp0uFI)ZZ}Bb)s>PgGxp3%ywg#Ft-zZnUx=_ydE)w8!2u%>M$m`N0?TXDUv7w3 zq>~#G>;ON>bs&ahYGk2`hw%^V5RZ*lm|i;=FuMP6U!20Aw+a_uNLL`PnRcs@S(TZm z9GA0r6Y}Beqj5+WY=gM^j8sZ+4Nd3bPlCfNiGTcS#}fY_79vZ3D=P%Y??zzu&Q&wW?a2d5 zsBR;*+W6Zn;hsa$FjZCh5$7-i*Vun<4h@b%=yeTC{A=;-)+di5Bp~GLTu=%~bsNOk zuyV)xMGw=}P-l}=1zj4afZ{Lg=G>gNaiBYAzEuZLM;pzeR86KfP}@{#LBz959RXfG zQWlEJIpX~8@j6!K3@pD^9G;fXW(=#0tP5;lb%C2XzK)H@H^^{W{Z8Z5Ef{^TKyjR8 z$>JkRmiYUxn$aAfN#5NrThBrsD-b!(M|xjV*X*DE*X>Ek=NIpMY=FL-jF%@kLGWq7 z8&Kj}fb_d7hR$D`q=+_qM~@4i3U?g;h?KPrqXsz{iOxptk-{0mC~&(}job>S$4gWZnW_Q;B(>I7 z`cF&R)c7UaudLk4uZ(_{k7qzClUOL^*JLokf$OvJg#qeg1=sg z^_bQcJ__A*#CMPi=!95b(C++ww(409l8Eqb>4+3~ib&9asMdf@80744b_my93-X{g zxPT61*czt#`tF{|>Rnc*ZaYtRDK7#^l))VaI|f z^sKkO1sj;?X~mzXe0iJY}yd-){BGnPk5<*Z5-~ti)1Ed;xP;{A6cYo3h0>aH; z<&N2F+-;LsSFyRko|Ml#60a4R-hstH1xze3JBOtR?Uv%C#`!*Mu?{t2x|wZ%6o*y>Gq-?~&RYqoKr+N^#vJjcub%?X#MjV!Er9Sqmf%rQXZBZFOK<@F{`HR8 z8HoW~I(E-u5szLpm7A8PY=~swPaE-PI)V$|w1?+V+R*`}s=vqc;ZHk0mUhnCj$5YX zuCLPVC65eQpod{dftwHs;PHsati1Tp=kopC;6$72WqZb(j& z8Fm8XLph}v#BGquSS%te0r@QRUbt~_UyV1op3zZv_VKMd4xvB~)SSKWh zRy`>0>YYK8L+A2vETgI$w5GX{N<^&fF-txwiD<1Avqf5avh>3-ZN4<#| zEqOE~YPQ2Ol@B0=gxw&i=H8YWf5veU+63-~P;gm=RguT+4Bi1YH#@XEalx^3m3>pt zsSiLOU=UajLMg&;X2yAQ0Eq*iLJE*lmgBN4;1;oR5{t-XB*wr?D736ew7k(`!khDf zgGo3qw8sR`>hx^1fmk9JKDzv6y@Mv8Y4kL_0FR|Fd$fs){^?wNf#4Xj7KwEh1O``% zu#%%0J1}&KO=?h{m;#Zuza?rH;!n$g@ztiXMvT~<+71Z5xGX(9mt2$m!AfMi zd#LZudmHfzJ1H&n|D{oHa${%E-v)((sG)e@%HL@HsZsM zPvFEsNyMKS?j~B8_GOi5CL4*r0DbOruTe&%hcY78_6EEGj^#G!3w-6-?QogN8+bMt z+XU9$!5~MLR!LDs5vP65p);6!Yx~`rvE8UGO zYw?ypkvm7I2Y?y4whm-)vWs#yno6Nglfvu04%pkpXAN?^_q}Q{;VuS!lGj8pU?`3* z;+ypk23y7x&i3F#HOuizuZB%QvRp(8*oKRrNXIP91~{J=$@bF6g9uI={RN^Y*r%O* zyTW1-N{GkTu-9~+epq`dYzvT<%g>rD5wc~#Fhp}b9`UfI=4cWPnS3Sk&}pxPL(zjk zEe_+G65{f<=N&t`o98R(*;0XJx6F2v2V)F6cz^@HYncXvd$;cMHONQ=#^kOtbO5F# zmP`xVEBr!%G^4U)|Ide_tNx^Lgi3BBKu66dA|u@XsCdoZ29Qj|ywk{Vnp+r`sdXh7 z-L%89P_`ywUS|Aa^v@RC9BpJ0@EI2_L(w3x4fFJwn^(643oSJJ&{rnC=(U+_;Zt`? zj_G1O%&3veei({W)5}(-1l4|7DXnN9deGmu0trpjZ>4ZtYrlcJZAoH*1>WSHV`@%X z$4K9{o@+(B@2FAfm-a=wS9Y0%k2I!fJQ7tLjM~eJc%do)oKZm%L4`33bt*5g3#nc- z0m5zHt0x0@8i6B$quRg}nKgPP(;tBcD1jTa{Qzv1*m=*{zI1SAR3*Sd+D{1SwW5aD z1y?|VxI`m#w0XDbwi1rSy5rW1d{=)(MO0Nio)0%EMtui!9k0{!ZNg=wa@vi3vwPZ+ z?^gS|`mj*{?Mx^(_h&p5)koxY)ocsL32E4ym9*NQ$q^S57_iPK_`%T9WwHSOcRDIS zr+_W?$&zrG#$Vuc9vZk7oxM{yqw_qb&8IvT!sLry_a?kskhZQV%B>=~Ujisc%Igaz zd(enNF#dCC;cvnv7^;7k_LGs2+Cm%TMUKEAD5 zquw~P7R~7n|6w!aXvr2ELnt?{F$$->n2Xo?Z|*LAG8)(?PmuzP=?QP9kPmDBmKPF! zPjOu;oTq-Pttij@%&+yy*LIxXkzGBpHv(~m*7gfi$^ceKp6MdRmRj3I_gdg8FNVQgsB|tWNG6!hgej`KLbuAmHQ=9| ziN)a`psIpnb5$~pz%UE#?imVz|{P-ja}}>;3^=#I*Ks4k(cQFH&B-x z{9sgbFS&p&m_LuG@S`1k zWGX(460+q9-r`I62?4a#AS2!g8^MLiL{#qvk-5tZQ)1n+AV77dQX?(G3@2vSLBH(H zA}Sl*u&$-Y@!MYQrlKEQ0h(Fa+QO@``1}`fHe~i zl&<6^;nJ%>+T!(&UQEZY1E`AQ)Znxu9vv` zEtf-14BMh6%O9>EI;Vs8XvH+GLzJt7UqCC6I2G^%sDLWz8A!*h;!`e2twec7+t=3v zthW1}FAWZon%4C{AbsD)I@=rM<^6FOZ9XxQ3se>kG=G1&CGNhazKqPm3X<@L8)GCe z(T25@Qw@H7Ib6o`KGQRlIfj&a@$Pfb<;_ZHQMyytjO*|ekFAY5l^mrp>vC^sdRT8B zOLjn}V})yf2W8uwZnZ^ObfXG}?(z9wqH}RK=G-0&i+n`xeQWSV^|skCo-Qn(xn`Ym z5Gc@GkZD7L&CC|V2(tWB0rDUB0wa86(@r6}o%vPdzWH0RJ-($VUbf}()-{i! zH^{rOawZLPA+1%A1gxxTqup}92uaqtm3*A(a2!~HZzH9Lmp zYaG_#U*cUp(ha2`x{&WEWf8W;)6vm~<2E-Y!b)UG3z~EjH&BqugSh@C)+bN=+QRFHr+ZtVkG1smeme0%R;S8bL|6o&wiKW&#NiOVv1BS0 zdLb%HnoHU(QA=d9sQ#rUE*^E54!?MC20`gOWLdmyz5WAt{dc&Y2LBcGQB#v0A4NI& z`aH|sfdZ!^)-X)y!N4dD&RqN`-M#^LJ-wc-+!-6|{p|xP^h#?6-!zA2SIZW4?6|nL z@Vl9xQIg_V!H>}eg?>-#Z}0m~zMqI1jDa;tR)9SucHq%ujLKA?;Y&GF|`2G97GTHI-mf*(c07)d(9MpL_^hMM0Ob}FE z896@teD+i{lt0jXF6}&Aflvd8YWCQHU=N-q-D;uG%SQ*=&ez}&L$9(%V2r|Av)h@^ z+gJB&Oic8r9_8gd%({B4itQ#~wKgt=DtInGo3RVMqxtpU>ChsOv76d-+?>H$C9H zbK_S`iRbY0*FraFD?I0QcqV89xD{!qx&j5zIe|DBChMQ;k~Ie+xH|xJMU|%bi-I}H zUqzos``G9ZrT}3=^PG7K9vMyxHr(Ey6Z7-pqkY`UHfwV$3p^Z?%UOF}e%q4sPNCrd z95fN4V=JrTD=~4oO<;Ev@|T(ghF@B=U}Wf z$TionBM|K)r%bZBOTnh1WM9NW<1Z$B&O0SP_b4x6nv*{tKyOR@EYDCK*1uAmW{I4| zGhq9nEm$0a^Yd#&*NP8?u31(xFWXm+Hg8 z2_6FNER^uezc34_uKXZs>H1CltIq1M>n$e8p6)o={qa$J3kwjb1uBG+R)`}2b@D6_ z??=nXph)N|xkJp5b1B>sObqMD*tPktFLm@l8ZmvYh0Nh4=KOW@n~ttZxgUy%Q~O*} z@8`V;(g+bjw2DK^pI2OPK&XxjN4XSpPkcg?&m~yi#K;auh~%OlVC)=IAohNL%qQTw z)tsi)R)Oo@msI9&Zb=_VqIXNx)WO~*I`?8V!cQp>r!L~8$2%N);;CQ!e(en$yp5|* zo~0EBJgKgM4NS6`H3QALqfrk85>jWuul`KU4PWFOjJlVHn<(&OxC{1Cilox>)jG_# zYP`vRR8a8WP)8u-(Tb~H;7h+JnH6$)qnLV#u^pvReBJ~hIX+kPmp?w1yUG8LkpMTb zmwuxB5{_QueoLbsA3(GnLEL2MPdxTk*Epp-rOl z`&P!qaQ5JTyhn2~;75LyG_+h9slB3m*&s{^0bNnh{>4GLFd4+jN2+4_Z>#L7Q+bbfJs6qEEpJ<2DBOLXr<D9MoWUjBUgY-nW%4wTKh(F>3L5Qj7?ZmvS>{%_ykQIrO@H=G z)(|8FhaC&us98`{-~7|SNEq}1W_)N1JO9Sqc^0p7GIVz$I3Zi(UY~=-a@k9ZAb}=e zQg2Bxb}@3_$8|HaIbRf0*(04By4F|QT}1{Ex9%VJs?g6>5&ugjb892=1=X7AWdeQV zAP3jT6sWb`jM#LiLV9|~v?I|Iv$Y31mX0`s$4T2nowQ7`7G3MA^+1NfRei@5&%u>DC9TO zCcliUJ?@M>F{n%4f^C%H55yfs&riP0N6RASO)98`r>aiioOL(l^o2XsDZZQ=z~K&m@AD?C>iN z_^FziW0BWdT5NFtLdJw(gGuM0J5ryZgw6qa!#|bb>(9-OLovk+1>wRikin4Ubtd+CzNfG2M3y8IMDJ9_WJC3D zr6|FrkykN>epE+-HH)9zs?>rN-%$bDsi7|`+epWsuuv5_JckD*S+%2}w(b7XZ%l6L z0^_daEv*Wu?oQ@&$1}JpEWa_FK82&92!Ruv%rOXOV|W#aDL5VL!A-~=E*wR%{Opbn zOD@b$i3}zmu1mMExW^l-Xoj%3rr$W;!KQ@{(7;a8jS(f}#0^s|o7O=zH#V&$ZHCVG&b8 za`6Ik(*oaG8cTU>AFQ()B4N5$Hs&JsrFtw^8%ohgQm)Gz%C~SlhBt`+ew@s_>Lr0*G5n)@p{i}Yi9^)62H8k4 zpbwv6xG#J`wj;Ba8+OOly-c@Cu^(-#aM9@KeJ>X5gZ)qX)0fwG=Ew6n)h zP*9#cP<^8BxwH?zG&1RVs~Z-Br^-T%@jw*nUAdgf)G5GOussOQrJ+q66#QGC)Y}ql zC!y=Y;Rdt?GSlcfn0Lu6s@EsS`|=)Kj=97GI!^lPWVDJm3)Q772&^436i-?X_Y_q2 zu!wAi(lPi%ZP4yKepjqiY98*EH(QhFmIn3m znS}4L({}C$M~~ou&c=Uzi-=~Z(sb8jHHq=dmH%ny&<@DQcjQX|sFPedY@>u9seAY( zGkN6*e#>QIpl7+~Q@UEYaiKT3Jlj?(+C9lCm>^F~`%{f*nENU8U%I?*A2 zSuOfywZM=H6S$rntuJeC#@#{HYU1qqL1GE7CebUU1dhqh;FR$r0H1G&s z!GNV>pAe4N@Z;hS*w`xP?%DmU)Q?Y_ zSJ_joob$yStZ5)hSAa zPe8)2dY-Ht(_C|G0qo7M3};Y6zZJSsOgu`hR<0=QK2TYE2KInfEO%U%vsCcI{{a{m Bs$Kv9