{ "cells": [ { "cell_type": "markdown", "id": "0ae4c48e", "metadata": {}, "source": [ "![Training Scientists](https://www.training-scientists.de/wp-content/uploads/2021/07/training_scientists.webp)" ] }, { "cell_type": "markdown", "id": "55e48c41", "metadata": {}, "source": [ "# Python for Beginners using ChatGPT & Claude" ] }, { "cell_type": "markdown", "id": "a94c36ff-d17f-4828-adaf-5d624db2e11d", "metadata": {}, "source": [ "## Basics\n", "By the end of this section, you will be able to:\n", "1. Understand the concept of **Integrated Development Environments (IDEs)**\n", "2. Know how **AI tools** can help you learn faster but also realize their limitations\n", "3. Differentiate between Python **scripts** and Jupyter **Notebooks**\n", "4. Write and execute a basic **\"Hello World\"** program\n", "5. Recognize the importance of **code readability and PEP 8** guidelines\n", "\n", "### Comparison of Python, MATLAB, C++, and R\n", "\n", "| **Aspect** | Python | MATLAB | C++ | R |\n", "|------------|--------|--------|-----|---|\n", "| **Learning Curve** | Easy, clean syntax **(Most beginner-friendly)** | Moderate, good for math background | Steep, requires low-level understanding | Moderate, can be challenging for beginners |\n", "| **Performance** | Slower than C++, optimizable with NumPy | Good for matrix operations | Typically fastest | Can be slow for large datasets, optimized for stats |\n", "| **Use Cases** | General-purpose, web dev, data science, AI/ML **(Most Versatile)** | Engineering, scientific computing, signal processing | System/software dev, games, resource-intensive apps | Statistical computing, data analysis, bioinformatics |\n", "| **Data Analysis & Visualization** | Strong libraries (Pandas, Matplotlib) | Excellent built-in capabilities | Limited built-in, needs external libraries | Excellent tools (e.g., ggplot2) |\n", "| **Community & Ecosystem** | Large, active, vast library ecosystem **(Largest community)** | Smaller, strong in academia/engineering | Large, extensive domain libraries | Strong in statistics and data science |\n", "| **Cost** | **Free**, open-source | Proprietary, licensed (expensive) | Free compilers, some paid IDEs | Free, open-source |\n", "| **Language Integration** | Easy with C/C++ and others **(Excellent interoperability)** | Can integrate with C/C++, Java, Python | Integrates with most languages | Can integrate with C/C++ and Python |\n", "| **ML & AI Support** | Excellent (TensorFlow, PyTorch, scikit-learn) **(Leader in AI/ML tools)** | Good support, less extensive than Python | Used for low-level ML and optimization | Good for statistical learning, less for deep learning |\n", "\n", "I focus mainly on the science and engineering applications of Python but e.g. \n", "\n", "- **Netflix** uses Python extensively for its recommendation engine, data analysis, and backend services.\n", "- **YouTube** uses Python for video sharing and viewing functionality\n", "- **Instagram** uses Python (Django framework) for its backend\n", "- **BitTorrent** used Python for the original BitTorrent client\n", "\n", "### Integrated Development Environments\n", "\n", "I recommend either using Jupyter Lab Desktop (available for all operating systems) or Anaconda Cloud which doesn't require installation.\n", "Jupyterlab Desktop will run faster, however Anaconda Cloud has Anaconda AI Assistant built in for free. And if you are on a university computer where you can't install anything Anaconda Cloud is a good choice.\n", "\n", "If you want to know about the other options for IDEs and why I decided to choose Jupyterlab for this and my other courses check out these two videos:\n", "\n", "+ [13 Beginner-Friendly Python IDEs Compared in 2024: Jupyter Lab, VS Code, PyCharm, Wing, Zed and More](https://youtu.be/6lj-Mv25eWs)\n", "

\n", "\n", "

\n", "\n", "+ [Choosing the Best Beginner Friendly Python IDE in 2024: VS Code vs. JupyterLab vs. Anaconda Cloud](https://youtu.be/U41WhFaggtA)\n", "

\n", "\n", "

\n", "\n", "\n", "### Jupyter Lab\n", "For a detailed video about the installation of JupyterLab Desktop check out this video:\n", " + [Jupyter Lab Desktop: Installation, Configuration, and Best Practices for Windows & Mac](https://youtu.be/Q5li7FMUKEk)\n", "

\n", "\n", "

" ] }, { "attachments": {}, "cell_type": "markdown", "id": "99b5e10f-c532-4594-a8d8-3e96a975c96f", "metadata": {}, "source": [ "### Line Width and Limiter Lines (PEP8)\n", "\n", "In this notebook, you'll notice two limiter lines: one at 80 characters and another at 100 characters. These lines relate to an important aspect of Python coding style.\n", "\n", "**PEP 8: The Style Guide for Python Code**\n", "\n", "PEP 8 is the official style guide for Python code. It provides guidelines to improve code readability and consistency across the Python community. One key recommendation concerns line length:\n", "\n", "> 🔍 **Guideline**: Keep lines of code between 79-99 characters long.\n", "\n", "**Why Limit Line Length?**\n", "\n", "1. **Readability**: Shorter lines are easier to read and understand.\n", "2. **Side-by-Side Viewing**: Allows multiple files to be open side-by-side.\n", "3. **Printing**: Ensures code prints well on standard paper or small screens.\n", "\n", "**Example**\n", "```python\n", "# This is a very long line of code that exceeds the recommended 79-character limit and might be hard to read\n", "result = some_long_function_name(first_long_parameter_name, second_long_parameter_name, third_long_parameter_name)\n", "\n", "# Better: Split into multiple lines\n", "result = some_long_function_name(\n", " first_long_parameter_name,\n", " second_long_parameter_name,\n", " third_long_parameter_name\n", ")\n", "```\n", "**More on Pep8** and good programming principles in the **advanced courses**:\n", "+ [Python Basics](https://training-scientists.com/python-basics-course/)\n", "+ [Python for Scientists & Engineers](https://training-scientists.com/python-for-scientists-and-engineers/)\n", "+ [Python for Biologists](https://training-scientists.com/python-for-biologists/)\n", "\n", " > You can **download** this Jupyter Notebook from the video description (as PDF or as a Jupyter Notebook).\n", "\n", " > There are exercises that you can get on my course website https://training-scientists.com (Python Beginner Course using AI)" ] }, { "cell_type": "markdown", "id": "0ae1a03e-8dae-45e5-ac38-b9f8edcd7fd8", "metadata": {}, "source": [ "### Anaconda Cloud\n", "For Anaconda Cloud \n", "> https://anaconda.cloud\n", "\n", "no installation is necessary, you can just create an Account on their website and start coding.\n", "\n", "While Jupyter Notebooks run perfectly, running Python scripts with graphical output does not work." ] }, { "cell_type": "markdown", "id": "53867bc4-c5f5-4ae1-8499-053a5ee7eb69", "metadata": {}, "source": [ "### AI Tools\n", "\n", "We will use ChatGPT, Claude and Anaconda Assistant in this course to help you learn programming faster.\n", "\n", "AI Tools are great at explaining code and concepts so you can 2X your learning curve.\n", "\n", "> To use Claude go to https://claude.ai create an account and start chatting with it.\n", "\n", "> To use ChatGPT do the same on: https://chatgpt.com\n", "\n", "E.g. Ask Claude 🤖💬:\n", "> 1. `Can you tell me how Python compares to Matlab, C++ and R?`\n", "> \n", "> 2. `Can you reformat that into a visually appealing table that I can copy paste into a Jupyter Notebook markdown cell?`\n", "\n", "Using AI tools is not cheating. Cars will look like cheating for someone who sells horse carriages. Or dinosaurs who don't want to learn something new.\n", "\n", "The code AI tools generate is not always working so we still need to learn programming ourselves.\n", "If you want to know more check out:\n", "\n", "+ [Can Claude 3.5 | ChatGPT 4o | GitHub Copilot build Snake & Electron Cloud simulation in Python? #GPT](https://youtu.be/m8YKaG4-_x8)\n", "

\n", "\n", "

\n", "\n", "\n", "+ [GitHub Copilot: Accelerating Coding or False Hope? | Reaction Video](https://youtu.be/vgsNdaxnXlE)\n", "

\n", "\n", "

\n", "\n", "+ [Debunking AI Myths: My Reaction to 'Why is everyone LYING?](https://youtu.be/KVLNA2231U4)\n", "

\n", "\n", "

\n", "\n" ] }, { "cell_type": "markdown", "id": "6413de94-9c67-4826-8834-2185b5d99360", "metadata": {}, "source": [ "### Python Scripts vs Jupyter Notebooks\n", "\n", "Scripts always run completely top to bottom, so if there is an error somewhere in the end you will need to change the code and run everything again. \n", "\n", "Whereas Notebooks you can run code cell by cell (line by line if you want to).\n", "This makes debugging and overall development a lot faster.\n", "+ You can show multiple plots, add text like this and structure the Notebook with a Table of Contents\n", "\n", "+ Jupyter Notebooks allow you to structure your code with markdown cells, headings etc.\n", "\n", "+ Scripts are better though if you want to run games (like snake) or simulations with a video like output\n", "\n", "+ Jupyter Notebooks have a lot of advantages but also some pitfalls like cell state we will look at later" ] }, { "cell_type": "markdown", "id": "a81c3b33-16a8-488b-a1aa-fe93127f49da", "metadata": {}, "source": [ "### Hello World (Jupyter) 👋\n", "This would not be a programming tutorial without a Hello World script" ] }, { "cell_type": "code", "execution_count": 1, "id": "fbd1ebd3-9d8f-4f2a-9ec6-c61593315156", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello World\n" ] } ], "source": [ "print(\"Hello World\")" ] }, { "cell_type": "markdown", "id": "59cc6c0f-15f9-41d4-acc6-4f321b058c45", "metadata": {}, "source": [ "### Hello World (Script)" ] }, { "cell_type": "markdown", "id": "70203aa5", "metadata": {}, "source": [ "## Variables & Data Types 🏷️\n", "By the end of this section, you will be able to:\n", "1. Define and use **variables** in Python\n", "2. Identify and work with different **data types** (int, float, string, boolean)\n", "3. Understand and use **f-strings** for string formatting\n", "4. Create and manipulate **lists, tuples, and dictionaries**\n", "5. Recognize the **appropriate use cases** for different data structures" ] }, { "cell_type": "code", "execution_count": 2, "id": "4f4f950d-8737-4774-9a75-041ec5517549", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:03.154556Z", "start_time": "2022-03-08T14:59:03.140558Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello World\n", "16\n", "1.3\n", "(5+3j)\n", "True\n" ] } ], "source": [ "z = \"Hello World\" # string\n", "x = 16 # integer\n", "u = 1.3 # float\n", "complex_number = 5+3j # complex\n", "on_or_off = True # boolean\n", "\n", "print(z)\n", "print(x)\n", "print(u)\n", "print(complex_number)\n", "print(on_or_off)" ] }, { "cell_type": "code", "execution_count": 3, "id": "a18384a6-e21f-4f79-8956-78d2111fe940", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:03.200558Z", "start_time": "2022-03-08T14:59:03.188556Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "# Use type() function to give you variable type\n", "print(type(complex_number))" ] }, { "cell_type": "markdown", "id": "95832cfe-fe68-4daf-8dd9-113a4a7d26de", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "id": "d0a051c6-8061-4574-a119-d5d6e1cbe047", "metadata": {}, "source": [ "### Strings\n", "**Let's look at an example to understand what variables are what they are useful for**" ] }, { "cell_type": "code", "execution_count": 4, "id": "15473edd-a09b-4277-a4ba-e74fa835d650", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tim is 4 and loves to play.\n", "He builds with blocks every day.\n", "4-year-old Tim stacks them high,\n", "Tim's towers almost touch the sky.\n" ] } ], "source": [ "print(\"Tim is 4 and loves to play.\")\n", "print(\"He builds with blocks every day.\")\n", "print(\"4-year-old Tim stacks them high,\")\n", "print(\"Tim's towers almost touch the sky.\")" ] }, { "cell_type": "markdown", "id": "31ec6996-460c-4983-a426-1fa5ffed33d4", "metadata": {}, "source": [ "\n", "**What if we want to change the name or the age though? We would have to change it in multiple places manually**" ] }, { "cell_type": "code", "execution_count": 5, "id": "6faada13-347c-4edf-ab6a-b49f494be11e", "metadata": {}, "outputs": [], "source": [ "name = \"Max\"\n", "age = 4" ] }, { "cell_type": "code", "execution_count": 6, "id": "f6be9a84-dc09-4c78-8f5f-08cd96543c25", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Max is 4 and loves to play.\n", "He builds with blocks every day.\n", "4-year-old Max stacks them high,\n", "Max's towers almost touch the sky.\n" ] } ], "source": [ "# We can use f-strings to insert our variables into the text:\n", "print(f\"{name} is {age} and loves to play.\")\n", "print(f\"He builds with blocks every day.\")\n", "print(f\"{age}-year-old {name} stacks them high,\")\n", "print(f\"{name}'s towers almost touch the sky.\")" ] }, { "cell_type": "markdown", "id": "10a37f80-7117-4625-81dc-23c78fff8b7e", "metadata": {}, "source": [ "**We do need to execute both cells for the output to update**\n", "\n", "**f-strings are useful e.g. when creating file names and you want to store variable data (like a temperature) to the filename**\n", "\n", "**more on f-strings in the advanced courses**" ] }, { "cell_type": "code", "execution_count": 7, "id": "39a95ce1-228d-4366-8b6a-df411d388762", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:04.268251Z", "start_time": "2022-03-08T14:59:04.258250Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "I am a cheetah\n" ] } ], "source": [ "# Single and double quoted strings are the same\n", "text = 'I am a cheetah'\n", "print(text)" ] }, { "cell_type": "code", "execution_count": 8, "id": "42b472ab-d7c1-41ff-8810-c32e4b62555b", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:04.268251Z", "start_time": "2022-03-08T14:59:04.258250Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tim's towers almost touch the sky.\n" ] } ], "source": [ "# with double quoted strings you can still use apostrophes inside of the string\n", "print(\"Tim's towers almost touch the sky.\")" ] }, { "cell_type": "markdown", "id": "f29388b6-c615-4cf8-b783-052f653b8fd1", "metadata": {}, "source": [ "### Integer variables & Basic Math" ] }, { "cell_type": "code", "execution_count": 9, "id": "fb9675c4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n" ] } ], "source": [ "a = 5\n", "print(a)" ] }, { "cell_type": "code", "execution_count": 10, "id": "31acbac7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# instead of using the print statement, we can just use the variable name to print\n", "# This works for only one variable per cell though\n", "b = 3\n", "b" ] }, { "cell_type": "code", "execution_count": 11, "id": "fecce215", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = a + b\n", "c" ] }, { "cell_type": "markdown", "id": "04282e4e", "metadata": {}, "source": [ "### Cell state (Jupyter Notebook pitfall)" ] }, { "cell_type": "code", "execution_count": 12, "id": "567e3973-7d3b-4a5f-81a4-51a65c27195f", "metadata": {}, "outputs": [], "source": [ "x = 5\n", "y = 2" ] }, { "cell_type": "code", "execution_count": 13, "id": "ed4f810c-b9f3-4e60-abdc-c5516ea3770b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# If the cells are executed top to bottom everything is working\n", "# If you execute this cell without the previous one Python will not know what x and y are\n", "z = x + y\n", "z" ] }, { "cell_type": "markdown", "id": "d7762ce6-1efe-4939-a664-c424a4fa5ee0", "metadata": {}, "source": [ "One common mistake I see beginners do is name all their variables x and y which leads to different results depending on the order in which cells are executed." ] }, { "cell_type": "code", "execution_count": 14, "id": "52c380c5-ac58-4eba-b916-69500c48f289", "metadata": {}, "outputs": [], "source": [ "x = 10\n", "y = 15" ] }, { "cell_type": "markdown", "id": "77f06c0e-f525-4a14-b1fa-fcbe6efa0a17", "metadata": {}, "source": [ "This is still an issue even if you delete the cell because the variables you define are kept in memory.\n", "\n", "You need to restart the kernel to clear the memory and rerun the cells to add the variables that you do want to memory again." ] }, { "cell_type": "markdown", "id": "47217094-610c-4d2c-addd-a0d54345f19e", "metadata": {}, "source": [ "### Comments\n", "\n", "You see me use comments throughout the Notebook to add context, clarify things and for explanations.\n", "\n", "Comments are text that Python ignores when running code. They make your code more readable and understandable.\n", "\n", "Start with `#`\n", "```python\n", " # This is a single-line comment\n", " x = 5 # Comment at the end of a line\n", "```\n", "\n", "Best Practices for Using Comments\n", "\n", "+ **Be Clear and Concise**: Write comments that are easy to understand and to the point.\n", "+ **Update Comments**: Always update comments when you change your code to avoid misleading information.\n", "+ **Avoid Obvious Comments**: Don't state the obvious. Focus on explaining 'why' rather than 'what'.\n", "\n", "```python\n", " # Bad: Increment x by 1\n", " x += 1\n", "\n", " # Good: Increment age after birthday\n", " age += 1\n", "```\n", "+ Use Comments for Complex Logic: **Explain** tricky, non-obvious, or important parts of your code.\n", "\n", "+ **Code Sectioning**: Use comments to divide your code into logical sections. (in Jupyter you can use markdown cells and headings for that)\n", "```python\n", "# Data Preprocessing\n", "...\n", "\n", "# Model Training\n", "...\n", "\n", "# Results Analysis\n", "...\n", "```\n", "+ **TODO Comments**: Mark areas that need future work.\n", "\n", "```python\n", "# TODO: Implement error handling for invalid inputs\n", "```\n", "\n", "Remember: While comments are important, **clear and self-explanatory code is even better**. \n", "Use **descriptive variable and function names** to reduce the need for excessive commenting." ] }, { "cell_type": "markdown", "id": "b1994a76-cfde-44c6-8682-8cc7e1b1c72b", "metadata": {}, "source": [ "### Tuples 🔗\n", "\n", "Tuples cannot be changed after creation, so they are constants" ] }, { "cell_type": "code", "execution_count": 15, "id": "84945fd0-d841-4f2a-b3be-b813dc03ab61", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(5, 2)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create by using round brackets ()\n", "coordinates = (5, 2)\n", "coordinates" ] }, { "cell_type": "code", "execution_count": 16, "id": "f1c0f23c-981a-41be-9b2d-8eb0c2e3812c", "metadata": {}, "outputs": [], "source": [ "# This will not work:\n", "#coordinates[1] = 5" ] }, { "cell_type": "markdown", "id": "3aa15002-ca5c-48bc-a85a-222ce1f6d334", "metadata": {}, "source": [ "If a function (section 5) has more than 1 return value it will be returned as a tuple" ] }, { "cell_type": "markdown", "id": "4a558903", "metadata": {}, "source": [ "### Lists 📝" ] }, { "cell_type": "code", "execution_count": 17, "id": "7018e37f", "metadata": {}, "outputs": [], "source": [ "temp1 = 5\n", "temp2 = 7\n", "temp3 = 10" ] }, { "cell_type": "code", "execution_count": 18, "id": "992c7a95", "metadata": {}, "outputs": [], "source": [ "# Create a list by using square brackets []\n", "temp = [5, 7, 10]" ] }, { "cell_type": "code", "execution_count": 19, "id": "98d99848", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[5, 7, 10]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "temp" ] }, { "cell_type": "code", "execution_count": 20, "id": "ab0f544a-412c-43a9-9c72-a8d2110583a5", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:03.339557Z", "start_time": "2022-03-08T14:59:03.327556Z" } }, "outputs": [ { "data": { "text/plain": [ "[5, 7, 10, 15]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Appending\n", "\n", "temp.append(15) # add 15 to list at the end\n", "temp" ] }, { "cell_type": "code", "execution_count": 21, "id": "77065424-1cb0-49d9-972c-b8efa7d651e2", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:03.278556Z", "start_time": "2022-03-08T14:59:03.271553Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 'x', 4, 6, 8]\n" ] } ], "source": [ "# Mixing of datatypes is possible:\n", "\n", "testlist_1 = [1,'x',4,6,8] \n", "\n", "print(testlist_1)" ] }, { "cell_type": "code", "execution_count": 22, "id": "826c21a3-7185-4984-8148-bcccba138382", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:03.308556Z", "start_time": "2022-03-08T14:59:03.288558Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x\n", "[1, 'x']\n", "[4, 6, 8]\n" ] } ], "source": [ "# Indexing, Slicing\n", "\n", "print(testlist_1[1]) # Use indexing, in python indices start at 0\n", "\n", "print(testlist_1[0:2]) # Use slicing, :2 means 'until but not including 2'\n", "\n", "print(testlist_1[2:]) # 2: means from index 2 until the end" ] }, { "cell_type": "markdown", "id": "116585e2-df51-407d-9350-84be44ec8bf3", "metadata": {}, "source": [ "" ] }, { "cell_type": "code", "execution_count": 23, "id": "b8902e46-ace6-499c-b696-4af671017dae", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:03.323553Z", "start_time": "2022-03-08T14:59:03.312556Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 'x', 4, 6, 8, 'boat', 42, 39.9, 'x']\n" ] } ], "source": [ "# Concatenating\n", "\n", "testlist_2 = ['boat', 42, 39.9, 'x']\n", "\n", "merged_list = testlist_1 + testlist_2\n", "print(merged_list)" ] }, { "cell_type": "code", "execution_count": 24, "id": "088d8ea7-2fb1-43dc-82e3-f6df7aad78b1", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:03.354554Z", "start_time": "2022-03-08T14:59:03.344556Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 4, 6, 8, 'boat', 42, 39.9, 'x']\n" ] } ], "source": [ "# Remove by value\n", "merged_list.remove('x') # remove 'x'\n", "print(merged_list)" ] }, { "cell_type": "code", "execution_count": 25, "id": "df174241-119a-4399-995c-9e0a20e4a987", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:03.369557Z", "start_time": "2022-03-08T14:59:03.358558Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 6, 8, 'boat', 42, 39.9, 'x']\n" ] } ], "source": [ "# Remove by index\n", "merged_list.pop(1) # remove item with index 1\n", "print(merged_list)" ] }, { "cell_type": "code", "execution_count": 26, "id": "75f6b965-4d29-42fb-82bd-46af3f8c7dba", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:03.384557Z", "start_time": "2022-03-08T14:59:03.374555Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['boat', 'car', 'cow', 'house', 'pig']\n" ] } ], "source": [ "# Sorting\n", "list_of_strings = ['car','house','boat','cow', 'pig']\n", "list_of_strings.sort() # Can use sort to sort alphabetically or numerically\n", "print(list_of_strings)" ] }, { "cell_type": "markdown", "id": "e413631a-bba4-4da7-88fc-257587888568", "metadata": {}, "source": [ "We will mostly be using numpy arrays and pandas dataframes in the advanced courses\n", "\n", "so if you want to know more about lists, \n", "> ask Claude 🤖💬: `Tell me about python lists and everything I can do with them`" ] }, { "cell_type": "markdown", "id": "e97983fc-2eac-4459-a49f-0c3e991f78b4", "metadata": {}, "source": [ "### Dictionaries 📖\n", "\n", "A dictionary in Python is a collection of key-value pairs. Each key is unique, and it is associated with a value. You can think of a dictionary as a real-world dictionary where you look up a word (the key) and find its definition (the value).\n", "\n", "Dictionaries are created using curly braces {} and the key-value pairs are separated by a colon :" ] }, { "cell_type": "code", "execution_count": 27, "id": "4a625d35-7728-487e-8440-c7c63109ab89", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Alice\n", "30\n", "+49 178 12345\n" ] } ], "source": [ "# Creating a dictionary to store a person's details\n", "person = {\n", " \"name\": \"Alice\",\n", " \"age\": 30,\n", " \"phone\": \"+49 178 12345\"\n", "}\n", "\n", "# Accessing values using keys\n", "print(person[\"name\"])\n", "print(person[\"age\"])\n", "\n", "# alternatively use the .get() function which defaults to none if the key doesn't exist\n", "print(person.get(\"phone\"))" ] }, { "cell_type": "markdown", "id": "18d44ec3-c453-40e9-9482-0fa4f940e6d6", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "id": "92837146-b060-4a73-8bdd-18f80120b8b9", "metadata": {}, "source": [ "**Dictionaries are for example useful when we are plotting (more later)**" ] }, { "cell_type": "markdown", "id": "d54d6519-619b-4eaf-862a-73b38d53d75e", "metadata": {}, "source": [ "> Ask Claude 🤖💬: `What are the main differences between lists, tuples, and dictionaries in Python?`" ] }, { "cell_type": "markdown", "id": "6f174bc6-7263-46ec-bc20-6b1f17b16952", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "---\n", "### Why Use Dictionaries?\n", "\n", "Dictionaries are particularly useful when:\n", "\n", "- **You need to look up values by a unique key.** \n", " For example, if you have an employee ID and you want to quickly find the corresponding employee name, a dictionary is ideal.\n", " \n", "- **You want to store data with named properties.** \n", " This is common in cases where you have related information (like user data) and need to access parts of it frequently.\n", "\n", "---\n", "\n", "### Comparison of Data Structures\n", "\n", "*Here's how dictionaries differ from other data structures:*\n", "\n", "- **Lists:**\n", " - Lists are ordered collections of items that are accessed by their index (a position number starting from 0).\n", " - Useful when the order of elements is important or you want to store multiple items of the same type.\n", " - *Example*: `my_list = [1, 2, 3, 4]`\n", " - **Dictionaries are better** when you need named access to items rather than indexed access.\n", "\n", "- **Tuples:**\n", " - Tuples are similar to lists, but they are immutable (cannot be changed after creation).\n", " - Useful for fixed collections of items.\n", " - *Example*: `my_tuple = (1, 2, 3)`\n", " - **Dictionaries provide more flexibility** as they allow for dynamic modifications (adding/removing key-value pairs).\n", "\n", "- **NumPy Arrays:** (later)\n", " - NumPy arrays are specialized for numerical data and mathematical operations. They offer fast processing for large amounts of numerical data.\n", " - *Example*: `np.array([1, 2, 3, 4])`\n", " - **Dictionaries are better** for mixed data types (like strings and numbers) and quick lookups by key.\n", "\n", "- **Pandas DataFrames:** (in advanced course)\n", " - DataFrames are 2-dimensional tabular data structures in the pandas library. They are great for handling and analyzing structured data.\n", " - *Example*: `pd.DataFrame({\"Name\": [\"Alice\", \"Bob\"], \"Age\": [30, 25]})`\n", " - **Dictionaries are simpler and more lightweight** for cases where you just need a quick lookup table or small, unstructured data.\n", "\n", "---\n", "\n", "> **Note**: **Lists []** use square brackets, **Tuples ()** use round brackets, **dictionaries {}** use curly brackets.\n", "> \n", "> For numpy arrays it depends whether we convert a list to an array or if we create an array from scratch (more later)" ] }, { "cell_type": "markdown", "id": "8551535d-92b4-4f81-a0f8-18ca00f75acc", "metadata": {}, "source": [ "## If statements 🔀\n", "By the end of this section, you will be able to:\n", "1. Write basic conditional statements using **if, elif, and else**\n", "2. Use **comparison operators** (==, !=, <, >, <=, >=) in conditional statements\n", "3. Combine conditions using logical operators **(and, or, not)**\n", "4. Understand and apply **boolean logic** in programming contexts" ] }, { "cell_type": "markdown", "id": "9e448f18-40c9-43e7-ad03-1407f4f63c5b", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "id": "200eea84-5495-4c0e-be9a-ce2234069232", "metadata": {}, "source": [ "### Indentation" ] }, { "cell_type": "code", "execution_count": 28, "id": "dc419a1d-faef-404a-a3eb-251b76bc3e8e", "metadata": { "ExecuteTime": { "end_time": "2022-03-14T03:33:57.587415Z", "start_time": "2022-03-14T03:33:57.571747Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "i is 0\n" ] } ], "source": [ "# Indentation indicates blocks of code\n", "\n", "i = 0\n", "if (i==0):\n", " print('i is 0')\n", "else:\n", " print('i is not 0')" ] }, { "cell_type": "code", "execution_count": 29, "id": "b6859e92-22a2-45ce-ba24-abf636f3b255", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:03.076553Z", "start_time": "2022-03-08T14:59:03.062553Z" } }, "outputs": [], "source": [ "# Arbitrary use of indentation creates error\n", "\n", "f=1\n", "# This will not work:\n", " #g=1" ] }, { "cell_type": "markdown", "id": "cb175444-a7e9-40b5-8045-912c852e1fd4", "metadata": {}, "source": [ "If statements control the program flow: \n", "\n", "If you only want parts of the code executed in case a certain condition is met then use if statements." ] }, { "cell_type": "code", "execution_count": 30, "id": "5c738542-8cd8-4cb6-935e-fde5df3cec4f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Enjoy the sunny day!\n" ] } ], "source": [ "# The if statement checks for a boolean variable (True/False)\n", "# We can define it beforehand:\n", "\n", "is_sunny = True\n", "\n", "if is_sunny:\n", " print(\"Enjoy the sunny day!\")\n", "else:\n", " print(\"Don't forget your umbrella!\")" ] }, { "cell_type": "markdown", "id": "789c1148-8967-4838-922e-d39ddd3d055d", "metadata": {}, "source": [ "### \"and\" operator" ] }, { "cell_type": "code", "execution_count": 31, "id": "f6b1b2b5-724d-41d7-b7fc-43474514a807", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "It is either not sunny or not warm or neither\n" ] } ], "source": [ "# \"and\" to check for multiple conditions\n", "is_sunny = False\n", "is_warm = False\n", "\n", "if is_sunny and is_warm:\n", " print(\"Enjoy the warm, sunny day. Take sunglasses.\")\n", "else:\n", " print(\"It is either not sunny or not warm or neither\")" ] }, { "cell_type": "markdown", "id": "94ff5689-dead-43d9-8b44-dee6c1a76e95", "metadata": {}, "source": [ "### \"or\" operator" ] }, { "cell_type": "code", "execution_count": 32, "id": "9a5c0ea7-054c-4483-9207-44dd1b82b3b3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "It is neither sunny nor warm. Just stay home\n" ] } ], "source": [ "# \"or\" to check for multiple conditions:\n", "is_sunny = False\n", "is_warm = False\n", "\n", "if is_sunny or is_warm:\n", " print(\"It is either sunny or warm or both\")\n", "else:\n", " print(\"It is neither sunny nor warm. Just stay home\")" ] }, { "cell_type": "markdown", "id": "6aaaa3db-893d-4385-a309-26e1066df5a5", "metadata": {}, "source": [ "### Boolean Logic Weather example\n", "\n", "Let's explore how boolean variables work using two weather conditions: sunniness and warmth.\n", "\n", "**Key:**\n", "- X means True (Yes)\n", "- O means False (No)\n", "\n", "**All Possible Combinations:**\n", "\n", "| Weather Condition | Case 1 | Case 2 | Case 3 | Case 4 |\n", "|-------------------|--------|--------|--------|--------|\n", "| Is it sunny? | X | X | O | O |\n", "| Is it warm? | X | O | X | O |\n", "\n", "**Logical Operations:**\n", "\n", "| Operation | Case 1 | Case 2 | Case 3 | Case 4 | Explanation |\n", "|----------------------------|--------|--------|--------|--------|------------------------------------|\n", "| Is it sunny AND warm? | X | O | O | O | True only when both are true |\n", "| Is it sunny OR warm? | X | X | X | O | True if at least one is true |" ] }, { "cell_type": "markdown", "id": "de967991-ef91-4239-8033-3d55da56b725", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "id": "e7eb1223-04ce-4442-84c8-d0829e663c7c", "metadata": {}, "source": [ "### elif" ] }, { "cell_type": "code", "execution_count": 33, "id": "bbcf7c0b-c955-4243-a628-f305fc38bac2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "It is not sunny but it is warm. Take an umbrella\n" ] } ], "source": [ "# Let's catch all four cases:\n", "is_sunny = False\n", "is_warm = True\n", "\n", "if is_sunny and is_warm: # case 1\n", " print(\"Enjoy the warm, sunny day. Take sunglasses.\")\n", "elif is_sunny and not(is_warm): # case 2\n", " print(\"It is sunny but it isn't warm. Take a jacket\")\n", "elif is_warm: # case 3\n", " print(\"It is not sunny but it is warm. Take an umbrella\")\n", "else: # case 4\n", " print(\"It is neither sunny nor warm. Just stay home\")\n", "\n", "# for case 3 there is no need to check again whether it is sunny because \n", "# we already checked the 2 cases where it is sunny" ] }, { "cell_type": "markdown", "id": "a8c90457-a0e7-497e-a075-b807744fe43e", "metadata": {}, "source": [ "> Ask Claude 🤖💬: `Explain this code cell to me. How do these if statements work? Why did we not have to check again for is_sunny in case 3?`" ] }, { "cell_type": "markdown", "id": "12da5b0f-3f79-4c0a-8433-1e508631d9cd", "metadata": {}, "source": [ "### Creating booleans by comparison\n", "Comparing two numbers with `>` `<` `==` `!=` `<=` `>=` creates booleans " ] }, { "cell_type": "code", "execution_count": 34, "id": "dfb800f3-3fcd-41ca-827d-526948228375", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "False\n", "False\n" ] } ], "source": [ "print(1 > 0)\n", "print(1 < 0)\n", "print(1 == 0)" ] }, { "cell_type": "code", "execution_count": 35, "id": "bf579e61-c371-4a9b-ab9e-25c6e923cd40", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "i greater than 0\n" ] } ], "source": [ "# You can create booleans by comparison:\n", "\n", "i = 5\n", "if (i==0):\n", " print('i is 0')\n", "elif(i < 0):\n", " print('i is smaller than 0')\n", "else:\n", " print('i greater than 0')" ] }, { "cell_type": "markdown", "id": "72bec9a2-dee8-4d65-8c4e-9aeecb77944b", "metadata": {}, "source": [ "---\n", "As a beginner, it's enough to understand the following concepts:\n", "\n", "1. **Boolean Variables**: What they are and how they work\n", "2. **Conditional Statements**: The syntax and logic behind `if`... `elif`... `else`\n", "3. **Logical Operators**: Combining multiple conditions with:\n", " - `and`\n", " - `or`\n", " - `not(..)`\n", "4. **Comparison Operators**: Used to compare values\n", " - `==` (equal to)\n", " - `!=` (not equal to)\n", " - `<` (less than)\n", " - `>` (greater than)\n", " - `<=` (less than or equal to)\n", " - `>=` (greater than or equal to)\n", "\n", "---\n", "\n", "🚀 This foundational knowledge is all you need for the advanced courses:\n", "\n", "- [Python Basics](https://training-scientists.com/python-basics-course/)\n", "- [Python for Scientists & Engineers](https://training-scientists.com/python-for-scientists-and-engineers/)\n", "- [Python for Biologists](https://training-scientists.com/python-for-biologists/)\n", "\n", "\n", "---" ] }, { "cell_type": "markdown", "id": "d73d3712-7a61-4983-88a8-f6726acd989a", "metadata": {}, "source": [ "## Functions 🧮\n", "By the end of this section, you will be able to:\n", "1. Define and explain the **purpose of functions** in Python\n", "2. **Create functions** using the `def` keyword\n", "3. Understand the concept of function **parameters and return values**\n", "4. Call functions and use their **return values**\n", "5. Explain the difference between **local and global scope** in functions\n", "6. Recognize and apply **best practices** in function naming and design" ] }, { "cell_type": "code", "execution_count": 36, "id": "fd2cabaf-62a5-414c-98fa-e244ec29ec90", "metadata": {}, "outputs": [], "source": [ "# To define a function we need to use the \"def\" specifier, the name of the function\n", "# and in parenthesis the input arguments + a colon at the end\n", "# all the code that will be inside the funtion needs to be indented\n", "\n", "def hello_world():\n", " print(\"Hello World\")" ] }, { "cell_type": "code", "execution_count": 37, "id": "8caa8176-374b-4edf-a6fc-0fe9e2c03a90", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello World\n" ] } ], "source": [ "# We need to call the function for something to happen\n", "hello_world()" ] }, { "cell_type": "markdown", "id": "d000de7b-d931-41ad-a0e4-8903ea581ab9", "metadata": {}, "source": [ "" ] }, { "cell_type": "code", "execution_count": 38, "id": "6d337103-41c6-42d4-aad3-d582b97a7d12", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:03.462552Z", "start_time": "2022-03-08T14:59:03.448558Z" } }, "outputs": [], "source": [ "def square_function(x):\n", " return x**2" ] }, { "cell_type": "code", "execution_count": 39, "id": "ac9fab0f-cadc-4083-8b78-ad620afd94f1", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:03.477556Z", "start_time": "2022-03-08T14:59:03.464552Z" } }, "outputs": [ { "data": { "text/plain": [ "9" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "square_function(3)" ] }, { "cell_type": "code", "execution_count": 40, "id": "7d9db7dc-4646-4f64-ada8-bcfbcf612270", "metadata": {}, "outputs": [], "source": [ "# We can save the return value of the function in another variable:\n", "\n", "result = square_function(3)" ] }, { "cell_type": "code", "execution_count": 41, "id": "ec65b963-7272-47b1-b625-0c4544828690", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "9" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result" ] }, { "cell_type": "code", "execution_count": 42, "id": "62dad2fa-bf69-4445-8731-15f11fc02bee", "metadata": {}, "outputs": [], "source": [ "# A function can have multiple input values:\n", "def multiple_input(x,y):\n", " return x**2 + y**2" ] }, { "cell_type": "code", "execution_count": 43, "id": "8f7b4af6-71ae-441c-b7c9-563b7a0b8005", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "13" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = multiple_input(2,3)\n", "z" ] }, { "cell_type": "markdown", "id": "775283c2-8d95-4ce4-955a-9817eda94004", "metadata": {}, "source": [ "> \"Ask ChatGPT: Can you explain the concept of return values in functions in Python and why they're important?\"" ] }, { "cell_type": "markdown", "id": "0302f39f-1405-47d2-bc98-099f1df1222f", "metadata": {}, "source": [ "### Why Use Functions?\n", "\n", "Functions are fundamental building blocks in programming that offer several advantages:\n", "\n", "1. **Organize Code**: Functions help structure your program into logical, manageable chunks.\n", "\n", "2. **Avoid Repetition**: Instead of copy-pasting code, functions allow you to reuse code efficiently.\n", "\n", "3. **Enhance Readability**: Well-named functions make your code self-documenting and easier to understand.\n", "\n", "4. **Improve Maintainability**: When code is organized into functions, it's easier to update and debug.\n", "\n", "> 💡 **Pro Tip**: Whenever you find yourself copy/pasting parts of code, there's usually a better way – and that way often involves functions!\n", "\n", "Here's an **example** of how functions can **simplify our code**:" ] }, { "cell_type": "code", "execution_count": 44, "id": "7533d4d6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Result for 30: 935\n" ] } ], "source": [ "temp1 = 30\n", "result_1 = temp1**2 + temp1 + 5\n", "print(f\"Result for {temp1}: {result_1}\")" ] }, { "cell_type": "code", "execution_count": 45, "id": "06c86791-4b4b-4739-a0d9-53346d67d171", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Result for 40: 1645\n" ] } ], "source": [ "temp2 = 40\n", "result_2 = temp2**2 + temp2 + 5\n", "print(f\"Result for {temp2}: {result_2}\")" ] }, { "cell_type": "code", "execution_count": 46, "id": "97fc3a8c", "metadata": {}, "outputs": [], "source": [ "def polynomial_function(x):\n", " return (x**2 + x + 5)" ] }, { "cell_type": "code", "execution_count": 47, "id": "57c2a262", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "935" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "polynomial_function(temp1)" ] }, { "cell_type": "code", "execution_count": 48, "id": "3b0b931a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1645" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "polynomial_function(temp2)" ] }, { "cell_type": "markdown", "id": "064e5ac6-6305-4b20-8be3-c084db628888", "metadata": {}, "source": [ "### Multiple return values" ] }, { "cell_type": "code", "execution_count": 49, "id": "ab5b40ed-930f-484d-bb6e-18c4949df11b", "metadata": {}, "outputs": [], "source": [ "def min_max_average(numbers):\n", " minimum = min(numbers)\n", " maximum = max(numbers)\n", " average = sum(numbers) / len(numbers)\n", " return minimum, maximum, average" ] }, { "cell_type": "code", "execution_count": 50, "id": "3d12a48d-c3ff-489e-b77b-4539b5d0993c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1, 9, 5.142857142857143)" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numbers = [4, 2, 9, 7, 5, 1, 8]\n", "min_max_average(numbers)" ] }, { "cell_type": "markdown", "id": "beea210a-e9e4-490b-9f75-2514c561b30b", "metadata": {}, "source": [ "**Note, how this returns a tuple: (min, max, average)**" ] }, { "cell_type": "code", "execution_count": 51, "id": "e205f866-e8c7-4b59-bf2f-71ca96b61db0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Minimum: 1\n", "Maximum: 9\n", "Average: 5.14\n" ] } ], "source": [ "# We can \"unpack\" the tuple like this:\n", "min_val, max_val, avg_val = min_max_average(numbers)\n", "\n", "print(f\"Minimum: {min_val}\")\n", "print(f\"Maximum: {max_val}\")\n", "print(f\"Average: {avg_val:.2f}\")" ] }, { "cell_type": "markdown", "id": "fb7bbc67-1a78-49f8-a840-1f99e39cee2c", "metadata": {}, "source": [ "> 💡 **Note**: For **math operations** like this we will be using **numpy (section 8)** and numpy arrays. Numpy has a lot of built in functions that have **multiple return values**" ] }, { "cell_type": "markdown", "id": "b925ebae-fce4-4b8c-ad56-0bff40df3193", "metadata": {}, "source": [ "### Understanding Scope in Python 🔍\n", "\n", "In Python, the scope of a variable determines where it can be accessed in your code. Let's explore two main types of scope:\n", "\n", "### Global Scope\n", "\n", "- Variables defined outside of functions\n", "- Accessible throughout the entire code\n", "- Can be read from anywhere, but modifying them requires special handling\n", "\n", "### Local Scope\n", "\n", "- Variables defined inside functions\n", "- Only accessible within that specific function\n", "- Helps prevent naming conflicts and unintended modifications\n", "\n", "> 💡 **Best Practice**: Keep the scope of variables as small as possible. This helps prevent errors and makes your code more maintainable." ] }, { "cell_type": "markdown", "id": "397b0541-6cf2-4394-9a6b-edbc6ad5dc11", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "id": "e8809f07-d12c-4ab4-9951-a0c4db3b4a33", "metadata": {}, "source": [ "### Why Scope Matters\n", "\n", "1. **Prevents Naming Conflicts**: Local variables can have the same name as global variables without interfering with each other.\n", "2. **Improves Code Organization**: Clearly defined scopes make it easier to understand where variables are used and modified.\n", "3. **Enhances Debugging**: Limiting scope makes it easier to track down issues in your code." ] }, { "cell_type": "code", "execution_count": 52, "id": "6039f9f5-5d6a-48e1-acb6-b7f5d0a633e2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "I'm global - inside the function\n", "I'm local - inside the function\n", "I'm global\n" ] } ], "source": [ "# Let's look at an example of global vs. local variables\n", "global_var = \"I'm global\"\n", "\n", "def scope_example():\n", " local_var = \"I'm local\"\n", " print(global_var + \" - inside the function\") # Can access global variables\n", " print(local_var + \" - inside the function\") # Can access local variables\n", "\n", "scope_example()\n", "print(global_var) # This works\n", "#print(local_var) # This would raise an error because local_var is not accessible here" ] }, { "cell_type": "markdown", "id": "2652a3eb-6b1b-46d6-b2da-2aecb4033a09", "metadata": {}, "source": [ "### Good Programming Practice ⭐\n", "\n", "While global variables are sometimes necessary, it's generally considered good programming practice to avoid accessing them directly within functions. Instead:\n", "\n", "- Pass required data as input parameters to your functions\n", "- Return modified values from functions rather than changing global state\n", "\n", "This approach, known as \"passing parameters,\" offers several benefits:\n", "1. **Improved Readability**: It's clear what data the function needs to operate.\n", "2. **Better Testability**: Functions that don't rely on global state are easier to test.\n", "3. **Reduced Side Effects**: Functions don't unexpectedly modify global variables.\n", "4. **Enhanced Reusability**: Functions can be used in different contexts without relying on specific global variables.\n", "\n", "Example of good practice:" ] }, { "cell_type": "code", "execution_count": 53, "id": "613412f3-37f0-4f92-9737-290e45e86d9f", "metadata": {}, "outputs": [], "source": [ "# Instead of this:\n", "global_data = 10\n", "\n", "def process_data():\n", " global global_data\n", " return global_data * 2\n", "\n", "# Prefer this:\n", "def process_data(input_data):\n", " return input_data * 2\n", "\n", "result = process_data(10)" ] }, { "cell_type": "markdown", "id": "99e6a0da", "metadata": {}, "source": [ "### Error messages ⚠️" ] }, { "cell_type": "markdown", "id": "bc4fd295-45f0-40ae-b32f-ea82e1db1d84", "metadata": {}, "source": [ "```python\n", "def polynomial_function(x):\n", " return (x**2 + x + 5)\n", "```" ] }, { "cell_type": "code", "execution_count": 54, "id": "ac462a1e", "metadata": {}, "outputs": [], "source": [ "test_list = [1, 2, 3]\n", "#polynomial_function(test_list)" ] }, { "cell_type": "markdown", "id": "16f3b110-9e6c-4386-8b6f-00863e9fab32", "metadata": {}, "source": [ "We will see later how to apply mathematical functions to numpy arrays (so multiple values at once). It does not work with lists\n", "> \"Ask Anaconda Cloud 🤖💬: Why are we getting an error message here?" ] }, { "cell_type": "markdown", "id": "0e7a995e-b295-44d7-b0b9-ac73d5dcfedf", "metadata": {}, "source": [ "### Common Errors (How to Handle Them)\n", "\n", "When learning Python, encountering errors is part of the process. Here are some common errors you might face and how to address them:\n", "\n", "1. **SyntaxError**\n", " - Cause: Incorrect Python syntax\n", " - Example: `print \"Hello World\"` (missing parentheses in Python 3)\n", " - Fix: Correct the syntax: `print(\"Hello World\")`\n", "\n", "2. **IndentationError**\n", " - Cause: Incorrect indentation of code blocks\n", " - Example:\n", " ```python\n", " if True:\n", " print(\"This is incorrectly indented\")\n", " ```\n", " - Fix: Properly indent the code:\n", " ```python\n", " if True:\n", " print(\"This is correctly indented\")\n", " ```\n", "\n", "3. **NameError**\n", " - Cause: Using a variable or function name that hasn't been defined\n", " - Example: `print(undefined_variable)`\n", " - Fix: Ensure the variable is defined before use or check for typos in the name\n", "\n", "4. **TypeError**\n", " - Cause: Performing an operation on an inappropriate data type\n", " - Example: `\"2\" + 2` (trying to add a string and an integer)\n", " - Fix: Convert types appropriately: `int(\"2\") + 2` or `\"2\" + str(2)`\n", "\n", "5. **IndexError**\n", " - Cause: Trying to access a list index that doesn't exist\n", " - Example: `my_list = [1, 2, 3]` then `print(my_list[3])`\n", " - Fix: Ensure your index is within the valid range: `print(my_list[2])` (remember, indexing starts at 0)\n", "\n", "6. **KeyError**\n", " - Cause: Trying to access a dictionary key that doesn't exist\n", " - Example: `my_dict = {\"a\": 1, \"b\": 2}` then `print(my_dict[\"c\"])`\n", " - Fix: Check if the key exists before accessing or use the `.get()` method: `my_dict.get(\"c\", \"Key not found\")`\n", "\n", "When you encounter an error:\n", "1. Read the (end of the) error message carefully - it often points to the line where the error occurred and gives a description of the problem.\n", "2. Check the line number and surrounding code for issues.\n", "3. If you're unsure, try searching the error message online or ask AI tools for help.\n", "\n", "Remember, errors are not failures - they're opportunities to learn and improve your code!" ] }, { "cell_type": "markdown", "id": "f9a1bba6-d59b-49f3-bcdf-92dc65e55d2c", "metadata": {}, "source": [ "## Loops 🔄\n", "By the end of this section, you will be able to:\n", "1. Understand the concept of **iteration** in programming\n", "2. Write and use **while loops** for indefinite iteration\n", "3. Implement **for loops** to iterate over sequences (like lists or strings)\n", "5. Avoid and handle infinite loops" ] }, { "cell_type": "markdown", "id": "c2609b96-b5e6-408e-8afc-00da192f807e", "metadata": {}, "source": [ "### while loop" ] }, { "cell_type": "code", "execution_count": 55, "id": "303f4f0f-84a3-47de-9480-215e65ddc664", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "2\n", "3\n", "4\n", "5\n", "Have fun\n" ] } ], "source": [ "i = 0\n", "while i < 6:\n", " print(i)\n", " i = i + 1\n", "\n", "print(\"Have fun\")" ] }, { "cell_type": "markdown", "id": "09046e3c-e12b-4e6d-b7f8-ccc141ed89cb", "metadata": {}, "source": [ "---\n", "**careful** when defining your criteria, if it is always true the loop will never end\n", "\n", "this can be useful in generators though that we cover in the advanced courses\n", "\n", "---" ] }, { "cell_type": "code", "execution_count": 56, "id": "6d1a8814-4e73-4449-9803-c00b696f57c3", "metadata": {}, "outputs": [], "source": [ "# use kernel interrupt should you be stuck\n", "# Keyboard shortcut: Esc i i\n", "\n", "#while True:\n", "# print(\"This is an infinite loop that will never end\")" ] }, { "cell_type": "markdown", "id": "31054a7d-9d18-483f-ae2c-dd30b2898ba7", "metadata": {}, "source": [ "### for loop" ] }, { "cell_type": "code", "execution_count": 57, "id": "59e2300c-6eeb-40b1-b920-84a3487ed33a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "H\n", "e\n", "l\n", "l\n", "o\n", " \n", "W\n", "o\n", "r\n", "l\n", "d\n", "Have fun\n" ] } ], "source": [ "for letter in \"Hello World\":\n", " print(letter)\n", "\n", "print(\"Have fun\")\n", "\n", "# Note that \"letter\" is not a keyword in Python, we could give it another name\n", "# Jupyter marks Python keywords in green" ] }, { "cell_type": "code", "execution_count": 58, "id": "d32511ba-6bcb-4c95-a015-76f1f1d80322", "metadata": {}, "outputs": [], "source": [ "binaries = [2, 4, 8, 16, 32, 64]" ] }, { "cell_type": "code", "execution_count": 59, "id": "e9b37075-1611-4bf0-a155-6cced8ab72b7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "I am at 2 now\n", "I am at 4 now\n", "I am at 8 now\n", "I am at 16 now\n", "I am at 32 now\n", "I am at 64 now\n" ] } ], "source": [ "for number in binaries:\n", " print(f\"I am at {number} now\")" ] }, { "cell_type": "markdown", "id": "94460c61-32c4-4339-a9fd-8717fcb6388c", "metadata": {}, "source": [ "> Ask Claude 🤖💬: `Explain the difference between a for loop and a while loop in Python. When would you use one over the other?`\n", "> \n", "> Ask ChatGPT 🤖💬: `Can you give me an example of how to use a for loop to iterate over a dictionary in Python?`" ] }, { "cell_type": "markdown", "id": "9893089a-cec8-425d-9b68-98c0a38aa949", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "id": "d35cb71a-0e72-4422-9c28-57e33c7bcf2e", "metadata": {}, "source": [ "## Keyboard Shortcuts ⌨️\n", " > **Note**: The shortcuts shown here also work in VS Code by the way." ] }, { "cell_type": "markdown", "id": "888b68b2-095c-436d-8e56-902583646501", "metadata": {}, "source": [ "### General Shortcuts\n", "| Shortcut | Action |\n", "|----------|--------|\n", "| `[ESC]` | Go to command mode |\n", "| `[Enter]` | Enter edit mode for the selected cell |" ] }, { "cell_type": "markdown", "id": "9abd2041-4fc3-4dda-a82e-9c2fd4fc738f", "metadata": {}, "source": [ "### Command Mode Shortcuts\n", "| Shortcut | Action |\n", "|----------|--------|\n", "| `i i` | Interrupt Kernel |\n", "| `a` | Insert cell above |\n", "| `b` | Insert cell below |\n", "| `m` | Convert cell to Markdown |\n", "| `y` | Convert cell to Code |\n", "| `d d` | Delete selected cells |\n", "| `Shift Enter` | Execute cell and select below |\n", "| `Ctrl Enter` | Execute cell and stay |\n", "| `↑` / `↓` | Select cell above/below |\n", "| `Shift ↑` / `↓` | Extend selection above/below |\n", "| `Shift m` | Merge selected cells |\n", "| `Ctrl Shift -` | Split cell at cursor |\n", "| `c` | Copy selected cells |\n", "| `v` | Paste cells below |\n", "| `x` | Cut selected cells |\n", "\n", "### Edit Mode Shortcuts\n", "| Shortcut | Action |\n", "|----------|--------|\n", "| `Ctrl /` | Comment/uncomment selected lines (Windows/Linux); On Mac use `Cmd /`|\n", "| `Ctrl z` | Undo (within a Cell); On Mac use `Cmd z` |\n", "| `Ctrl Shift z` | Redo (within a Cell); On Mac use `Cmd Shift z` |\n", "\n", "---\n", "For more shortcuts, visit: [Jupyter Notebook Shortcuts](https://towardsdatascience.com/jypyter-notebook-shortcuts-bf0101a98330)" ] }, { "cell_type": "markdown", "id": "b1732ec7-1260-40f7-b7f8-c4364e4c816d", "metadata": {}, "source": [ "## Virtual Environments 📦\n", "By the end of this section, you will be able to:\n", "1. Explain the **purpose and benefits** of virtual environments in Python\n", "2. Create and activate a virtual environment using **conda**\n", "3. Install and manage **libraries** within a virtual environment\n", "4. Understand the difference between **conda and pip** for package management\n", "5. Create, use and export **environment.yml** files for project reproducibility" ] }, { "cell_type": "markdown", "id": "ea345ab4", "metadata": {}, "source": [ "### Libraries\n", "A library in Python (like NumPy or Matplotlib) is simply a **collection of pre-written code** that someone has created to solve specific problems. You can use this code in your own programs without having to write it from scratch.\n", "\n", "The vast number of available libraries is a great strength of Python because they **enhance the functionality and versatility** of Python." ] }, { "cell_type": "code", "execution_count": 60, "id": "e8defef0", "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 61, "id": "27651817-ad6f-4c05-a04d-8cf2d5bcd9a5", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:04.965247Z", "start_time": "2022-03-08T14:59:04.952251Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 2, 4, 8, 16]\n" ] } ], "source": [ "# Convert a list to a numpy array\n", "\n", "test_list = [1, 2, 4, 8, 16]\n", "print(test_list)" ] }, { "cell_type": "code", "execution_count": 62, "id": "f426f866-4cfc-4513-a6e1-c93777e709b2", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:04.980254Z", "start_time": "2022-03-08T14:59:04.968255Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1 2 4 8 16]\n" ] } ], "source": [ "test_list_converted = np.asarray(test_list)\n", "print(test_list_converted)" ] }, { "cell_type": "code", "execution_count": 63, "id": "a24717f5", "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 64, "id": "8013eb55", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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XJxXf7Y/CPbrk4L/Grm+wBfs1xjs1ycF/zU21PUZhqGioiIlJycrJOTcqzr8buYjJCREKSkpDfoYcXFxQfkX6rRgvz4p+K+R6wt8wX6NwX59UvBfY0Nc3/lmPE5jwSkAAPApygcAAPCpRlU+rFarnnzySVmtVrOjNIhgvz4p+K+R6wt8wX6NwX59UvBfoz9cn98tOAUAAMGtUc18AAAA81E+AACAT1E+AACAT1E+AACATwVd+fjLX/6idu3aKTIyUn369NGXX355zvNXrVqlPn36KDIyUu3bt9crr7zio6T1U5frW7lypSwWyxm3bdu2+TDxhVu9erVGjhyp5ORkWSwWLVmy5Lz3CbTxq+s1BtIYZmZmql+/foqNjVViYqJGjx6t3Nzc894vkMawPtcYSGP48ssvq0ePHtWbT1122WX617/+dc77BNL4SXW/xkAav9pkZmbKYrHogQceOOd5vh7HoCof7777rh544AHNnDlTGzZs0BVXXKHhw4crLy+v1vP37NmjG264QVdccYU2bNigGTNm6P7779fChQt9nPzC1PX6TsvNzdWhQ4eqb506dfJR4ropKSlRz549NXfu3As6P9DGT6r7NZ4WCGO4atUqTZ48Wd99952WL1+uqqoqDR06VCUlJWe9T6CNYX2u8bRAGMOUlBQ9++yzysrKUlZWlq655hqNGjVKW7ZsqfX8QBs/qe7XeFogjN/PrV27VvPmzVOPHj3OeZ4p42gEkf79+xt33313jWNdunQxpk2bVuv5jzzyiNGlS5cax+666y7j0ksvbbCMF6Ou17dixQpDknHixAkfpPMuScbixYvPeU6gjd/PXcg1BvIYFhYWGpKMVatWnfWcQB/DC7nGQB5DwzCMZs2aGX/7299q/V6gj99p57rGQB2/oqIio1OnTsby5cuNq666ypgyZcpZzzVjHINm5qOiokLr1q3T0KFDaxwfOnSovvnmm1rv8+23355x/rBhw5SVlaXKysoGy1of9bm+03r16qWkpCQNGTJEK1asaMiYPhVI43exAnEMHQ6HJCk+Pv6s5wT6GF7INZ4WaGPodru1YMEClZSU6LLLLqv1nEAfvwu5xtMCbfwmT56sESNG6Nprrz3vuWaMY9CUj6NHj8rtdqtly5Y1jrds2VIFBQW13qegoKDW86uqqnT06NEGy1of9bm+pKQkzZs3TwsXLtSiRYuUlpamIUOGaPXq1b6I3OACafzqK1DH0DAMTZ06VYMGDVJ6evpZzwvkMbzQawy0MczOzlaTJk1ktVp19913a/HixerWrVut5wbq+NXlGgNt/CRpwYIFWr9+vTIzMy/ofDPG0e8+1fZiWSyWGl8bhnHGsfOdX9txf1GX60tLS1NaWlr115dddpny8/P1u9/9TldeeWWD5vSVQBu/ugrUMbz33nu1adMmffXVV+c9N1DH8EKvMdDGMC0tTRs3btTJkye1cOFCTZo0SatWrTrrk3Mgjl9drjHQxi8/P19TpkzRsmXLFBkZecH38/U4Bs3MR/PmzRUaGnrGLEBhYeEZje60Vq1a1Xp+WFiYEhISGixrfdTn+mpz6aWXaseOHd6OZ4pAGj9v8vcxvO+++/Thhx9qxYoVSklJOee5gTqGdbnG2vjzGEZERKhjx47q27evMjMz1bNnT/3xj3+s9dxAHb+6XGNt/Hn81q1bp8LCQvXp00dhYWEKCwvTqlWr9Kc//UlhYWFyu91n3MeMcQya8hEREaE+ffpo+fLlNY4vX75cl19+ea33ueyyy844f9myZerbt6/Cw8MbLGt91Of6arNhwwYlJSV5O54pAmn8vMlfx9AwDN17771atGiRvvjiC7Vr1+689wm0MazPNdbGX8ewNoZhyOVy1fq9QBu/sznXNdbGn8dvyJAhys7O1saNG6tvffv21W233aaNGzcqNDT0jPuYMo4NtpTVBAsWLDDCw8ONv//970ZOTo7xwAMPGDExMcbevXsNwzCMadOmGRMnTqw+f/fu3UZ0dLTx4IMPGjk5Ocbf//53Izw83PjnP/9p1iWcU12v7w9/+IOxePFiY/v27cbmzZuNadOmGZKMhQsXmnUJ51RUVGRs2LDB2LBhgyHJeOGFF4wNGzYY+/btMwwj8MfPMOp+jYE0hvfcc49hs9mMlStXGocOHaq+lZaWVp8T6GNYn2sMpDGcPn26sXr1amPPnj3Gpk2bjBkzZhghISHGsmXLDMMI/PEzjLpfYyCN39n8/N0u/jCOQVU+DMMw/vznPxtt2rQxIiIijN69e9d4C9ykSZOMq666qsb5K1euNHr16mVEREQYbdu2NV5++WUfJ66bulzfc889Z3To0MGIjIw0mjVrZgwaNMhYunSpCakvzOm3tP38NmnSJMMwgmP86nqNgTSGtV2XJOO1116rPifQx7A+1xhIY/irX/2q+vdLixYtjCFDhlQ/KRtG4I+fYdT9GgNp/M7m5+XDH8bRYhg/rioBAADwgaBZ8wEAAAID5QMAAPgU5QMAAPgU5QMAAPgU5QMAAPgU5QMAAPgU5QMAAPgU5QMAAPgU5QMAAPgU5QMAAPgU5QMAAPgU5QMAAPjU/w+/RllVqxqwgAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(test_list_converted)" ] }, { "cell_type": "markdown", "id": "a1bcae5e-04ce-4328-af0c-ac0a9c46b88f", "metadata": {}, "source": [ "### Why use virtual environments?\n", "\n", "**In a nutshell**: Think of environments like sandboxes and the libraries (like Numpy) like children. If you put too many children in one sandbox there will be conflicts. So it is better to have separate sandboxes (environments) to keep it civil.\n", "\n", "> Ask Claude 🤖💬: `Why are virtual environments important in Python development?`\n", "\n", "In Python, virtual environments are used to create isolated environments for your projects, allowing you to manage dependencies and packages separately for each project. They are used to solve a common problem in software development: conflicting dependencies and package versions.\n", "\n", "In Detail:\n", "\n", "- **Isolation**: Virtual environments provide a sandboxed environment for your Python projects. Each virtual environment is self-contained, meaning it has its own directory structure and doesn't interfere with other Python projects or the system-wide Python installation. This isolation helps prevent conflicts between packages and dependencies.\n", "\n", "- **Dependency Management**: In a virtual environment, you can install and manage specific versions of Python packages and libraries independently of the global Python environment. This allows you to specify the exact package versions required for your project.\n", "\n", "- **Collaboration**: When collaborating on a Python project, you can share the project's virtual environment configuration with others. They can then create the same virtual environment, ensuring that everyone is working with the same packages.\n", "\n", "- **Testing and Development**: Virtual environments are crucial for testing and development. They allow you to create an isolated environment where you can experiment with different package versions and configurations.\n", "\n", "- If you install everything in your base environment installing new packages can lead to conflicts" ] }, { "cell_type": "markdown", "id": "2270dfc7-5cde-4b81-ad4b-d457a71def95", "metadata": {}, "source": [ "### Anaconda environments\n", "\n", "Anaconda environments are the go to solution when you are on your own computer and you can install anaconda or if you are in Anaconda Cloud.\n", "\n", "Very nice cheat sheet about the commands:\n", "\n", "https://docs.conda.io/projects/conda/en/4.6.0/_downloads/52a95608c49671267e40c689e0bc00ca/conda-cheatsheet.pdf\n", "\n", "**Advantages:**\n", "\n", " - Anaconda automatically checks dependencies for your packages and installs the necessary additional libraries\n", " - It is easy to switch environments\n", " \n", "**Disadvantages:**\n", "\n", " - Anaconda is a bit intrusive\n", " - Not available on every machine\n", "\n", "Benchmarks have shown that since anaconda uses packages that use the Intel MKL (Math kernel library) they can often be faster on Intel CPUs than when using PIP:\n", "\n", "https://www.youtube.com/watch?v=AWWaL6pZieo\n", "\n", "**Pip** is nevertheless used a lot. Often when you google how to install a package, you will find the pip install command first. \n", "\n", "**DO NOT MIX** Conda and pip installs in the same environment, as both package managers cannot cross check for compatibiltity with the packages installed by the other one. \n", "\n", "You will **not** get an error message and the installation will most likely go through **BUT** you might get **unexpected behavior** later. \n", "\n", "Only use pip install in a conda environment as a last resort. By now 95% of packages available in pip are also available in conda. Just google \"conda install packagename\"" ] }, { "attachments": {}, "cell_type": "markdown", "id": "a53f4137-01c8-45a9-a51c-95fdf4c7e8ca", "metadata": {}, "source": [ "### Yaml files\n", "\n", "The best and easiest way to install virtual environments is by creating .yaml files that contain all the packages of your virtual environment. This way, the conda package manager can check beforehand which version numbers of all the packages work together.\n", "\n", "They are regular text files with a .yml or .yaml file ending and look like this:\n", "\n", "--------------------------------------------\n", "name: lab_python_course_env\n", "channels:\n", " - conda-forge\n", " - defaults\n", "\n", "dependencies:\n", "\n", " - jupyterlab\n", " - matplotlib\n", " - numpy\n", " - scipy\n", " - pandas\n", " - altair\n", " - h5py\n", " - openpyxl\n", " - vega_datasets\n", " - sympy\n", " - dask\n", " - ipywidgets\n", " - ipympl\n", " - nodejs\n", " - conda-forge::ffmpeg\n", " - conda-forge::jsonschema-with-format-nongpl\n", " - conda-forge::webcolors\n", " \n", "install by running this command in the command line while in the same folder as the .yml file:\n", "> `conda env create --file lab_python_course_env.yml`\n", "\n", "--------------------------------------------\n", "In .yml files **name** specifies the environment name, **channels** tell conda where to look for the packages, **dependencies** are the libraries that you want." ] }, { "cell_type": "markdown", "id": "f2d84fb9-9309-4a5a-9d82-bfd6704ca5ef", "metadata": {}, "source": [ "### Add Conda to Powershell\n", "\n", "In Windows out of the box you unfortunately have to deal with multiple shells. To add the functionality of conda commands in Windows Powershell use these two commands.\n", "\n", "In Anaconda Prompt:\n", "> `conda init powershell`\n", "\n", "In Powershell:\n", ">`Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser`" ] }, { "cell_type": "markdown", "id": "1a7c1a3d-e583-4e08-ad84-99eed6afd0e4", "metadata": {}, "source": [ "### Activating environments\n", "\n", "**After installation you need to activate the environment, it does not activate itself**\n", "\n", "> `conda activate python_course_env`\n", "\n", "You need to do this every time you start a new shell as the default environment is the base environment" ] }, { "cell_type": "markdown", "id": "35c6cca7-bac2-47a3-8336-ee9955901cd9", "metadata": {}, "source": [ "### Default environments in Jupyter Lab\n", "\n", "- Click on your active environment in the top right\n", "- Click on the gear icon\n", " \n", "\n", "\n", "- Copy the Python Path from the environment you want to make default\n", "\n", "\n", " \n", "- In the settings, paste it into the first box\n", "\n", "" ] }, { "cell_type": "markdown", "id": "09d55970-91ad-4d58-820a-03b102d1f0c4", "metadata": {}, "source": [ "Installed environment are available everywhere on your computer, not just in the folder you installed them\n", "> Ask Claude 🤖💬: `Give me a machine learning example in Python + the YAML file with the necessary libraries`" ] }, { "cell_type": "markdown", "id": "2f8d96f8-ebfb-4417-b31e-c6055e49c637", "metadata": {}, "source": [ "### Anaconda Cloud\n", "\n", "Anaconda cloud has **pre-installed** environments but you **can't install additional libraries** into them.\n", "\n", "You can **install your own environment** with a .yaml file the same way you can do on your computer.\n", "\n", "> **However**: for free you only get 5GB of storage, so make sure to **clear the cache** after installation (Disk usage->Clear Cache)." ] }, { "cell_type": "markdown", "id": "2f918f46-9716-41a2-953c-b14a271863fb", "metadata": {}, "source": [ "### Exporting environments\n", "\n", "You can export your current environment with the exact version numbers of all the libraries using \n", "\n", "> `conda env export > export_env.yml`\n", "\n", "This will guarantee that the other person has the **exact same setup** as you.\n", "\n", "When you are using a version control software like **GIT** (we cover gid in the advanced courses), you can put the **.yaml file** for your Python code into the **repository**" ] }, { "cell_type": "markdown", "id": "603f6146-e892-4cb7-adbe-84c9d496720f", "metadata": {}, "source": [ "### Word of advice\n", "\n", "Once you have a working environment, do not update/change it. If you need more modules later it is generally a better idea to create a new environment with the additional packages such that conda can check again which version numbers are compatible" ] }, { "cell_type": "markdown", "id": "194a2b3f-afb1-4eca-89f2-1c9cb9b63a92", "metadata": {}, "source": [ "## First steps with numpy 🔢\n", "By the end of this section, you will be able to:\n", "1. Understand the basic concept and **benefits of NumPy arrays**\n", "2. **Create** and manipulate NumPy arrays\n", "3. Perform basic **mathematical operations** on NumPy arrays\n", "4. Use NumPy's built-in functions for **array manipulation and analysis**\n", "5. Recognize the **performance benefits** of NumPy over standard Python lists" ] }, { "cell_type": "markdown", "id": "07eba926-bfd2-4b79-8b5c-f23bd4ea34f2", "metadata": {}, "source": [ "Numpy arrays are stored continuously in memory. Processing can therefore be 100x faster than lists.\n", "\n", "Built in functions for fast computation are written in C or C++" ] }, { "cell_type": "code", "execution_count": 65, "id": "6b950ac8-f9c7-4a42-9c29-1d4a41faf230", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:04.902255Z", "start_time": "2022-03-08T14:59:04.657247Z" } }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "markdown", "id": "9c914d88-ad84-452d-8814-65eee0be5f0d", "metadata": {}, "source": [ "### Initialize an array" ] }, { "cell_type": "code", "execution_count": 66, "id": "3dcda521-61b8-48e3-9f98-d1d681c8c6a6", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:04.917253Z", "start_time": "2022-03-08T14:59:04.908254Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 2 3 4 5]\n" ] } ], "source": [ "# Initialize 1D array\n", "\n", "test_array = np.array([1, 2, 3, 4, 5])\n", "print(test_array)" ] }, { "cell_type": "code", "execution_count": 67, "id": "fdf94ea3-042c-4011-81f9-d0dd156e3416", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:04.965247Z", "start_time": "2022-03-08T14:59:04.952251Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 3, 5, 7, 9]\n" ] } ], "source": [ "# Convert a list to a numpy array\n", "\n", "test_list = [1, 3, 5, 7, 9]\n", "print(test_list)" ] }, { "cell_type": "code", "execution_count": 68, "id": "03137193-8a60-45cb-b406-f44ff598db64", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:04.980254Z", "start_time": "2022-03-08T14:59:04.968255Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 3 5 7 9]\n" ] } ], "source": [ "test_list_converted = np.asarray(test_list)\n", "print(test_list_converted)" ] }, { "cell_type": "code", "execution_count": 69, "id": "6420e350-cf25-4807-9b43-5c5323a76950", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-5. , -4.5, -4. , -3.5, -3. , -2.5, -2. , -1.5, -1. , -0.5, 0. ,\n", " 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create an array with a range of values and the step in between\n", "arr1 = np.arange(start=-5, stop=5, step=0.5)\n", "arr1" ] }, { "cell_type": "code", "execution_count": 70, "id": "88a76fff-511d-46b0-acf8-a0c89a6d08fb", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-5. , -4.5, -4. , -3.5, -3. , -2.5, -2. , -1.5, -1. , -0.5, 0. ,\n", " 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. ])" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create an array in a range with a fixed number of values (symmetric)\n", "arr2 = np.linspace(start=-5, stop=5, num=21)\n", "arr2" ] }, { "cell_type": "markdown", "id": "ae160989-096c-4a61-980c-246f5c9c92fc", "metadata": {}, "source": [ "### Accessing array elements\n", "Numpy arrays start counting at 0 (like in C):" ] }, { "cell_type": "code", "execution_count": 71, "id": "2c528b3d-08fc-4ac3-a341-09818cf8a943", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:05.043251Z", "start_time": "2022-03-08T14:59:05.018254Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "First element: 2\n" ] } ], "source": [ "# Accessing 1D array\n", "\n", "arr = np.array([2, 4, 8, 16])\n", "\n", "print(f'First element: {arr[0]}')" ] }, { "cell_type": "code", "execution_count": 72, "id": "852ef710-3254-4962-9ffb-08f2e7e4db82", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:05.074251Z", "start_time": "2022-03-08T14:59:05.062250Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Last element: 16\n" ] } ], "source": [ "# Accessing array counting from the end (negative indexing)\n", "\n", "print(f'Last element: {arr[-1]}')" ] }, { "cell_type": "markdown", "id": "179dd179-0380-4037-8a0e-a18ec661763c", "metadata": {}, "source": [ "### Array Iteration" ] }, { "cell_type": "code", "execution_count": 73, "id": "51820452-fe12-4043-a66f-412c24313da9", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:05.213248Z", "start_time": "2022-03-08T14:59:05.202249Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n", "4\n", "8\n", "16\n" ] } ], "source": [ "# Simple iteration on 1D array similar to lists\n", "for x in arr:\n", " print(x)" ] }, { "cell_type": "code", "execution_count": 74, "id": "1fa1ab6e-7134-440d-9c0d-f8a3634b54df", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:05.229250Z", "start_time": "2022-03-08T14:59:05.218252Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "index 0: 2\n", "index 1: 4\n", "index 2: 8\n", "index 3: 16\n" ] } ], "source": [ "# Or use enumerate, if you want the loop iteration index\n", "for idx, x in enumerate(arr):\n", " print(f\"index {idx}: {x}\")" ] }, { "cell_type": "markdown", "id": "9aa42ea8-5260-4ba8-a024-63f31f534101", "metadata": {}, "source": [ "### numpy.where for searching" ] }, { "cell_type": "code", "execution_count": 75, "id": "bbf02e4c-d1c7-451c-a005-bd5822ea4edb", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:05.489250Z", "start_time": "2022-03-08T14:59:05.477249Z" } }, "outputs": [ { "data": { "text/plain": [ "(array([1]),)" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Suppose you want to find the indices where the value of an array is 4:\n", "\n", "np.where(arr == 4)" ] }, { "cell_type": "markdown", "id": "5b031d5b-249e-4cc4-946c-32af397f2410", "metadata": {}, "source": [ "### np.min() np.max() etc." ] }, { "cell_type": "code", "execution_count": 76, "id": "6c1ca97c-54c5-4b4c-8326-5075caa6587f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The minimum of arr is 8 at index 1\n", "The maximum of arr is 1024 at index 3\n" ] } ], "source": [ "arr = np.array([16, 8, 32, 1024, 64])\n", "minimum = np.min(arr)\n", "maximum = np.max(arr)\n", "min_idx = np.argmin(arr)\n", "max_idx = np.argmax(arr)\n", "\n", "print(f\"The minimum of arr is {minimum} at index {min_idx}\")\n", "print(f\"The maximum of arr is {maximum} at index {max_idx}\")" ] }, { "cell_type": "markdown", "id": "1b185d53-19f5-4ffa-9788-59b077f04232", "metadata": {}, "source": [ "" ] }, { "cell_type": "code", "execution_count": 77, "id": "1abbb1a3-e634-4a31-9e08-91eb143474e8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The squareroot of 16 is 4.0\n" ] } ], "source": [ "num = 16\n", "print(f\"The squareroot of {num} is {np.sqrt(num)}\")" ] }, { "cell_type": "code", "execution_count": 78, "id": "98b1a6a8-6a4d-44ae-be5f-923f7e41ed89", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3.141592653589793" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.pi" ] }, { "cell_type": "code", "execution_count": 79, "id": "6052021d-5005-41df-b174-e1132ea1b3cf", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7.38905609893065" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.exp(2)" ] }, { "cell_type": "code", "execution_count": 80, "id": "ff7ecfed-4085-4972-9dd6-1936c9932a3d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4.9" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.abs(-4.9)" ] }, { "cell_type": "markdown", "id": "147be3cb-49e9-4f99-bf2a-dfe9528ec895", "metadata": {}, "source": [ "### Summary\n", "\n", "This is not a full tutorial on Numpy, this is just a quick look at what external libraries can do.\n", "\n", "In the advanced courses (https://training-scientists.com) we look at\n", "\n", "+ multidimensional array initialization, access, slicing and iteration\n", "+ joining / stacking of arrays\n", "+ Filtering arrays (e.g. give me all values in the array larger than a certain value, or all even numbers)\n", "+ Performance comparisons between numpy arrays and lists\n", "+ pre-allocation of arrays\n", "+ linear algebra\n", "+ statistics\n", "+ Fourier Transforms\n", "\n", "and a lot more hands on examples of everything numpy can do like\n", "\n", "+ interpolation\n", "+ fitting\n", "+ filtering noise out of large data sets" ] }, { "cell_type": "markdown", "id": "f999c1eb-6ffa-4ede-a910-0d49cc2ff215", "metadata": {}, "source": [ "> Ask Claude 🤖💬: `What are the main advantages of using NumPy arrays over Python lists for numerical computations?`" ] }, { "cell_type": "markdown", "id": "02709ee6-9394-4caf-bf82-1ff2b94ea039", "metadata": {}, "source": [ "## First steps with matplotlib 📊\n", "By the end of this section, you will be able to:\n", "1. **Create plots** using Matplotlib (line plots, scatter plots, histograms)\n", "2. **Customize appearance** (colors, labels, titles, legends)\n", "3. Generate and understand different **types of visualizations**" ] }, { "cell_type": "code", "execution_count": 81, "id": "0b30aa28-8e0c-4b20-ab76-7e4d676d7da8", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:18.201945Z", "start_time": "2022-03-08T14:59:17.720478Z" } }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "id": "9bc84d22-0c36-4669-8041-3a99edc12db5", "metadata": {}, "source": [ "### x / y plot:" ] }, { "cell_type": "code", "execution_count": 82, "id": "b212c339-29e6-4d6c-a33e-34952a0891e8", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:18.231912Z", "start_time": "2022-03-08T14:59:18.212927Z" } }, "outputs": [], "source": [ "# Generate two arrays to be plotted as x-values\n", "\n", "x = np.linspace(start=0, stop=10, num=11)\n", "x_fine = np.linspace(start=0, stop=10, num=101)" ] }, { "cell_type": "markdown", "id": "e62d45af-dbeb-48a4-bb5b-246055e1fa00", "metadata": {}, "source": [ "Polynomial function from functions section\n", "DO NOT define a function twice in a production script\n", "```python\n", "def polynomial_function(x):\n", " return (x**2 + x + 5)\n", "```" ] }, { "cell_type": "code", "execution_count": 83, "id": "fd217f5a-d655-471f-8825-a4e2f523740a", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:18.247912Z", "start_time": "2022-03-08T14:59:18.234922Z" } }, "outputs": [], "source": [ "# Calculate the y values running the polynomial function on the x values\n", "\n", "y = polynomial_function(x)\n", "y_fine = polynomial_function(x_fine)" ] }, { "cell_type": "code", "execution_count": 84, "id": "7412ff8d-7ad2-41d5-a31f-a92b15527841", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:18.498924Z", "start_time": "2022-03-08T14:59:18.250916Z" } }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Create a figure to plot these two x/y sets\n", "\n", "plt.figure()\n", "plt.plot(x,y,'o')\n", "plt.plot(x_fine, y_fine)" ] }, { "cell_type": "code", "execution_count": 85, "id": "bdafb0fb-946a-40ff-a6ec-66452a2e9301", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:19.060480Z", "start_time": "2022-03-08T14:59:18.508925Z" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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ucsjNWrUoEaNGjm27d69mxEjRtC0aVPKlStHqVKlqFevHs899xxnz57NdYw///yTZ555hrp16xIYGMh1111Ho0aNeOKJJ7DbL86/cLVjZvbt28djjz1GzZo1sVqtVKxYkQ4dOjB79uxcbefMmUOrVq0IDg4mODiYVq1aMWfOnFztLh3jsnnzZrp160ZISAhhYWHceeed7N+/P1dbgJUrV2KxWJyP7BryGzOT/fmmpKQwbNgwqlatitVqpXHjxnz22We56urQoYPzXH8XGxuLxWLJURs4euxee+01brrpJgIDAwkLC6Njx44sWrQo1zEu9/9g9uzZOd5TthUrVnDrrbcSHh6O1WolPDycDh06MHPmzDzrFPF61hCzK7gqCjOeIi0l/0f6hUK0PX8Nbc/l3e4azZ49m6ysLB555BEqVaqUb7uXXnoJgHffffeqz7VgwQLee+89atWqxQMPPMBjjz3Gddddx8SJE+nSpQvp6enOtufOnSM6Oprp06dTu3ZtnnrqKe6//35q1qzJ7NmzOXny5FXXAbB27VqaNGnCjBkzaNCgAcOGDaNPnz6cP3+eadOm5Wg7dOhQYmNjOXjwIA8//DCDBw8mOTmZ2NhYhg0blufxN23aRLt27fDz8+PRRx+lefPmLFy4kM6dO3PhguPPTI0aNRg1ahQAkZGRjBo1yvmIioq64ntIT0+na9euLFmyhD59+jBw4ED27t3LPffcw9KlS6/p8zEMg379+jFs2DAuXLjAkCFDGDBgAL/88gu33XZbjlB7NRYtWsQtt9zC+vXr6datG88++yw9e/YkJSWFefPmXdOxRTzGyd/h83/Aqf1mV3JNdJnJU7wanv++ul3hvk8vvv6/OpB+Lu+2kW3hwUv+VTu1EZw7kXfb8CbwSPzF12/cDLYDuduNtuVfWwH89NNPANxyyy2XbdegQQPCw8PZu3cvhw8fpnLlyoU+16BBgxg2bBgBAQE5to8dO5ZRo0bxySefcN999wHwww8/sG/fPoYOHcqUKVNytD9z5gxWq7XQ58+WmppKv379OHPmDIsXL6Z79+459h88eND5/Mcff2Tq1Klcf/31rF27lrCwMADGjBlDq1ateO211+jTpw9t27bNcYxFixYxf/58+vXr59x2//3387///Y+FCxdy7733UqNGDUaPHs2YMWOczwvj0KFDtGjRghUrVjg/0wEDBtC5c2emTJlC165Xv6bL3LlzWbBgATExMSxdutR5/BdeeIFmzZoxfPhwbr/9dmrWrHlVx3///fcxDIP4+HgaN26cY9+JE/n8Toh4mx/G/rV0gR0GfGx2NVdNPTNiusOHDwNQrVq1K7bNbpOcnHxV56patWquIAOOAbwAy5Yty7Uvr/E5ISEheR6noL766iuSkpIYOHBgriADEBER4XyefWlk9OjRziADEBYW5uxVyeuyVPv27XMEGYCHHnoIgI0bN1517X/32muv5fgsbrnlFiIjI6/5HNnvadKkSTmOHxERwdChQ0lPT3dJD0pe/3/LlSt3zccVcXsHNzmCDBbo9JLZ1VwT9cx4iucP5b/P4pvz9b/2XKbt3/LrP7cVvO2Q9YCRf/tiYBiO82dlZV31z8+aNYvZs2ezfft2bDZbjmMdOnTxc27fvj2VK1dm/PjxbN26lZ49e9K2bVsaNWqU79iPS02dOpXTp0/n2BYbG0uNGjXYsGEDQIF6LrZs2QKQ59ig7G1bt27Nta9p06a5tmWHpL/XdbXKlCmTZ89IREQEa9euvaZjb9myhcDAQFq2bJlr3+Xed0Hdc889LFiwgJtvvpn+/fvTqVMn2rVrR8WKFa/6mCIewzBg6YuO51H3QeUbza3nGinMeIqAIDdoW7rgbQuhcuXK7Nq1i6SkJOrXr3/ZttmXX/4+SLignn76af773/9SrVo1evXqRZUqVZyXi8aMGUNqaqqzbVhYGGvXrmXUqFF8/fXXLF68GHB8UcfFxfHEE09c9lxTp07ljz/+yLGtQ4cO1KhRwxkmCvI+7HY7Pj4+VKhQIde+SpUq4ePjg82W+1Lfpb042fz8HL/ymZmZVzxvQeR1juzzXG3gzGa32/Ptrcu+xJjX+y6ofv364e/vz9SpU3nnnXd48803nQPKp0yZUqAxQyIea9ciOLAW/AI9atmC/CjMiOnatGlDfHw8P/zwA507d8633a5duzh06BBly5Z1fplZLBYyMjLybG+z2XJ82R49epQ33niDxo0bs3btWkqXvhjODh8+zJgxY3Ido0aNGsyZM4fMzEy2bdvG0qVLef311xkyZAhly5alf//++db79ztzLlWmTBmgYJfLQkNDycrK4tixY7l6DY4ePUpWVhahoe6/GJyPj6OnLyMjwxmqsuUVSkJDQzly5Eiex8refun7vvT4f5df6OnTpw99+vTBbrfz008/OQeId+vWjd9++835/0nEq2SmX1y2oPUQCL3MmEwPoTEzYrrY2Fh8fHx49913OXbsWL7txo0bB8DAgQOdX1xly5bNMxDs378/16WU33//HcMw6Ny5c44gA45Btpfj6+tLVFQUI0aM4KOPPgIc416uVvalk4Lc8dOkSROAPG85XrlyJcA19yL4+Pi4rLcmP2XLOmYU/fv/r6ysLBISEnK1b9KkCefPn3dekrtUXu87v+PDxUt1+QkNDaV79+7MmDGD2NhYjh49yvr16y//hkQ81Za5cHIvlC4P0c+YXY1LKMyI6erWrcuwYcM4ceIEt99+O3/++WeO/VlZWbz88svMnTuXMmXK8M9//tO5r3nz5uzfvz/HF31aWlqetytHRkYCjrunLr0EcvDgQZ577rlc7bdv357rMhFc7BW4lon7evXqRUREBHPnzuW7777Ltf/SL+QHHngAcFwGu3RuG7vd7uxNym5zta677rocd1AVhebNmwO5BytPmTKFffv25Wqf/Z7i4uJy3DKfnJzMlClT8PPzc955dunxP/jggxz/f9euXZvnQOEffvjBeYv6pY4ePQpc2/9fEbfW6G7oEAedR0Ep9+/VLQhdZhK3MH78eGw2G++++y5169alZ8+e1K5dG7vdztKlS0lMTKRUqVLMnz+fWrVqOX9u6NChLF26lJ49e9K/f39Kly7N999/T5kyZahSpUqOc1SpUoW+ffvy+eef07x5c2655RaOHDnCN998Q6dOnfj9999ztF+2bBnPPvss0dHRNGjQgHLlyvH777/z1VdfERgY6LwD6mpYrVY++eQTunfvzq233kr37t256aabsNvtbN26lXPnzjl7E9q3b89TTz3F9OnTufHGG+nbty+GYbBgwQKSkpJ4+umnad++/VXXAtCpUyc++eQT7rrrLpo0aYKvry89e/akUaNG13TcSz344INMmjSJ0aNHs3XrVmrXrs2mTZvYvn07MTExzt6WbIMGDWLBggV8+eWXNG7cmNtuu42UlBQ++eQTTpw4weTJk3P8WWjVqhWtW7dm+fLltG7dmvbt2/PHH3/w1Vdfcfvtt/PFF1/kOP6zzz7LgQMHnOOYLBYLq1evZsOGDbRp04bo6GiXvXcRt2INhg65/wHn0QwpMjabzQAMm8122Xbnz583du7caZw/f76YKnNfP/zwg3HPPfcY4eHhhp+fn4Hj9imjZcuWRmJiYp4/8/HHHxuNGjUyAgICjMqVKxtPPfWUcebMGSMyMtKIjIzM0fbMmTPGs88+a9SoUcOwWq1G3bp1jZdfftlIS0szACMmJsbZdufOncYzzzxjNGnSxChXrpxhtVqNWrVqGbGxscbOnTtzHHfUqFEGYKxYsaJQ73fPnj3Gww8/bERERBj+/v5GxYoVjQ4dOhgffPBBrrbvv/++0aJFC6N06dJG6dKljRYtWhjvv/9+rnYrVqwwAGPUqFG59u3bt88AjAceeCDH9j///NO45557jPLlyxs+Pj4GYMyaNeuyx8vr880WExNj5PXXy+bNm41bbrnFKF26tBEaGmrccccdRmJiovHAAw8YgLFv374c7dPT043//Oc/RqNGjQyr1WqEhIQYMTExxpdffpnneY8dO2YMGjTIuO6664zAwECjVatWxnfffWfMmjUrx3syDMOYP3++cc899xi1a9c2SpcubYSFhRlRUVHGpEmTjLNnz+Z5/L/T7654lAt2w8jMNLuKAivod6hhGIbFMAxz77X1Yna7nbCwMGw222UHaF64cIF9+/ZRs2ZNSpXyvDUxitLu3btp1aoV/v7+rF69mrp165pdkoiTfnfFoyx4BI7vhttec0yK6uYK+h0KGjMjbq5evXp89tlnnDp1ii5duhT5uA4REa90aAv88rHjv17Yh6EwI26vU6dOfP7558TGxrJ69WqzyxER8SyGAUv/muG3cT+omntCTU+nAcDiEW6//XZuv/12s8sQEfE8u7+F/T+CXymPX7YgP+qZERER8VaZ6Rd7ZVo9AWWuvAaeJ1KYERER8VY/z4YTiY4J8toONbuaIqMwIyIi4q12/zUpZ8c4r5kgLy8aM+NGdJe8iGfR76y4vQGfwK5voH4PsyspUuqZcQO+vr4AOaZsFxH3l/07m/07LOJ2fHzghl7g6919FwozbsDf3x+r1YrNZtO/9EQ8hGEY2Gw2rFYr/v7+ZpcjktO2zyD1rNlVFBuPi2pz587lxx9/5Oeff2bbtm2kpaUxa9YsYmNj82xvt9sZPXo0n3/+OYcPH6Zy5cr07duX0aNH5zuj4IcffsjUqVPZsWMHAQEBtG7dmrFjxzoXsisK5cuXJzk5mYMHDxIWFoa/vz8Wi6XIziciV8cwDNLT07HZbJw9e5aqVauaXZJITgfWwecPQ2hVGLLBsRaTl/O4MPPiiy/yxx9/UL58eapUqZLnqsbZUlJSiImJYevWrXTp0oX+/fuTkJDAa6+9xooVK1i9ejVBQUE5fubVV1/lhRdeoHr16jz22GOcPXuW+fPnEx0dzXfffUeHDh2K5H1lB6vjx4/nWDFZRNyT1WqlatWqV5xmXaRYZWXBt3GO53U6l4ggAx4YZmbOnEndunWJjIxkwoQJxMXF5dt20qRJbN26lREjRjBx4kTn9lGjRjF27FgmTZrEmDFjnNsTExMZNWoU9erVY8OGDYSFhQHw9NNP07JlSwYPHsyuXbvw8yuajy00NJTQ0FDS09PJzMwsknOIyLXz9fXVpSVxT9s/g0ObISAYOr5gdjXFxuPCTOfOnQvUzjAMZs6cSXBwMCNHjsyxLy4ujunTp/Pee+8xevRo5+WcWbNmkZGRwQsvvOAMMgANGzbk/vvv5+2332b58uV07drVdW8oD/7+/vqLUkRECiftHCwb7Xje9p8QUsnMaoqV1w4ATkxM5NChQ0RHR+e6lFSqVCnat29PcnIye/bscW6Pj48HyDOsdOvWDYCVK1cWXdEiIiJX66fpYE+GsGrQ+kmzqylWXh1mAOrWrZvn/uzt2e2ynwcHB1O5cuUCtf+71NRU7HZ7joeIiEiRsx+CNVMdz7uMAf9AU8spbl4bZmw2G0COy0WXyh60l90u+3lh2v/d+PHjCQsLcz6qVfPONTBERMTdWKD+rVCtFTTsY3Yxxc5rw4wZ4uLisNlszkdSUpLZJYmISEkQWgXueh/u/xJK4LQeHjcAuKCye1jy60nJvgR0aU9MWFhYodr/ndVqxWq1XlW9IiIi18y/lNkVmMJre2auNMYlrzE1devW5ezZsxw+fLhA7UVEREy180v49EE4fcDsSkzl1WEmPDycNWvWkJKSkmPfhQsXWLVqFeHh4dSpU8e5PSYmBoClS5fmOt53332Xo42IiIip0i/A0hdhxwLYMs/sakzltWHGYrEwePBgzp49y9ixY3PsGz9+PKdOnWLw4ME5lgx48MEH8fPzY9y4cTkuN+3YsYMPPviA2rVr06lTp2J7DyIiIvla94ajRyYkHKKfNrsaU1kMD1vZcObMmaxevRqAbdu2sXnzZqKjo509LL1796Z3796AYzmDtm3bOpczaNasGQkJCSxZsoSoqKg8lzMYN24cL774ItWrV+euu+4iJSWFjz76iPPnz/Pdd9/RsWPHAtdqt9ud43A05bmIiLjMmcPwelNIT4E7Z8BN/cyuyOUK8x3qcWEmNjaWOXPm5Lt/1KhRjB492vnaZrMxZswYPvvsM+dCk3fddRejRo3KdzDvvHnz8lxoskWLFoWqVWFGRESKxMInYOs8qNocHv4efLzvQotXhxlPojAjIiIul7wZ3v3rKsHgHyCiubn1FJHCfId6X5QTERHxZqtfc/y3cT+vDTKF5bXzzIiIiHil3m9BxeuhWazZlbgNhRkRERFPYg2Gjs+bXYVb0WUmERERT3B4G2RlmV2FW1KYERERcXenk2BmF5h5C5w7aXY1bkdhRkRExN19PxIyzoN/IASWNbsat6MwIyIi4qZ+OXia0dPfdSxZgAW6TyiRq2JficKMiIiIm/ri5wPcfWy640WzB6BKY3MLclO6m0lERMSNHDx1jlMp6Vgs4Lt1Lg19/uAMpTl4/TNkHLRRNsifiLKlzS7TrSjMiIiIuJG2E1cAEEoKy60fgQVeS+/L+zN/dbbZP6GnWeW5JV1mEhERcSNT+0Xh52OhrOUMyUZ59mSF80FmFwD8fCxM7RdlboFuSD0zIiIibqR3k6rUqRjMbdNX0zttLJU4RcZfX9cLh0RzY9W8F0kuydQzIyIi4q4sPhymnG5gugL1zIiIiLiTXYuJ3LeBakHNKVu2DP1aVOPjjUn8efoC5YIDzK7OLSnMiIiIuIv08/Dtvwk5fYAVHV/Ct/2zWCwWBrSsTlpmFlY/X7MrdEsKMyIiIu7ip+lw+gCEVsWv9ePOCfIsFouCzGVozIyIiIg7OJ0EP05xPO/6MgQEmVuPB1GYERERcQdLX3SsvxQZDQ37mF2NR1GYERERMdvvK2HnQrD4wK0Ttf5SISnMiIiImMkwYNlox/MWg6FyI1PL8UQKMyIiImayWOCeORA1EDo+b3Y1Hkl3M4mIiJitTHXo/YbZVXgs9cyIiIiY5cResyvwCgozIiIiZkjaANObwYJHICvT7Go8msKMiIhIccvKhMXDAQN8/MFHE+JdC4UZERGR4vbzLPgzAaxh0Hm02dV4PIUZERGR4pRyHH4Y63je6UUIrmBuPV5AYUZERKQ4LRsNF2xQqRE0f8jsaryCwoyIiEhxObgJtvzP8bznf8BXM6S4gj5FERGR4nL+NARXgtq3QPVWZlfjNRRmREREikvdzvDkJsjKMLsSr6IwIyIiUpxKhZpdgdfRmBkREZGi9v0o2PqRY1FJcTn1zIiIiBSlpA2wZqrjeaWGUKWxqeV4I/XMiIiIFJXMDFg0zPE8aqCCTBFRmBERESkqm96Dw9ugVBnoMsbsaryWwoyIiEhROHMElr/ieH7LSAgqb249XkxhRkREpCh8/xKk2iG8CTSLNbsar6YwIyIi4mrH98AvnwAW6DlZq2IXMd3NJCIi4mrl68CDSyBpHVRtZnY1Xk9hRkREpChEtnY8pMjpMpOIiIir2JLh1H6zqyhxFGZERERcZfFweONm+OVTsyspURRmREREXGHXYvhtsWMRycqNzK6mRFGYERERuVZp52DJvx3PWz8JFRuYW08JozAjIiJyrVZNAtsBCKsGMSPMrqbEUZgRERG5Fkd/hZ+mO573+D8ICDK3nhJIYUZERORqZWXBN0Md42Qa3Ab1bzW7ohJJYUZERORqGZlQMwYCr4NbJ5pdTYmlSfNERESulq8/dIyDNk+BNdjsakos9cyIiIhcDcO4+FxBxlQKMyIiIoW1fzXMiIGDP5tdiaAwIyIiUjgZqfD1P+HPBNjyP7OrERRmRERECmf1VDiRCEEVofMos6sRFGZEREQK7vge+PE/jufdx0NgWXPrEUBhRkREpGAMA775J2SmQZ3OcGNfsyuSvyjMiIiIFETCfNj/I/gFQs/JYLGYXZH8RWFGRESkIHZ94/hvh39D2RqmliI5adI8ERGRgrjnf7BjAdxwh9mVyN8ozIiIiBSEjw80usvsKiQPuswkIiKSn/TzsHISpJ41uxK5DIUZERGR/Kz6D6wYB//rnXP5AnErXh9mDMNgwYIFdOzYkSpVqlC6dGnq16/Po48+yu+//56rvd1uZ9iwYURGRmK1WomMjGTYsGHY7XYTqhcREdMc2Qlrpjqet3lady+5MYtheHfUfPbZZ5kyZQpVqlThjjvuIDQ0lISEBJYuXUpwcDA//fQTN954IwApKSm0bduWrVu30qVLF5o2bUpCQgLffvstUVFRrF69mqCgoAKf2263ExYWhs1mIzQ0tKjeooiIuFpWFrzfFQ5uhAa3wb3zzK6oxCnMd6hXDwA+fPgwU6dOpUaNGiQkJOT4MKZOncrQoUOZMmUK77//PgCTJk1i69atjBgxgokTJzrbjho1irFjxzJp0iTGjBlT7O9DRESK2ab3HEEmIARunWR2NXIFXn2Zaf/+/WRlZREdHZ0r1fXs2ROAo0ePAo7LUTNnziQ4OJiRI0fmaBsXF0fZsmV577338PKOLBERsSXDsr/+4dp5FIRVNbceuSKvDjN169YlICCANWvWcObMmRz7Fi9eDECnTp0ASExM5NChQ0RHR+e6lFSqVCnat29PcnIye/bsyfd8qamp2O32HA8REfEwy0ZB2hmIaAHNHzK7GikAr77MVK5cOcaNG8e//vUvrr/+enr16kVISAjbtm1j2bJlPPLIIzz11FOAI8yAIwDlJXt7YmJivm3Gjx+vy1AiIp6u6yuQlQnt/wU+vmZXIwXg1WEGYPjw4YSHh/Poo4/y1ltvObe3adOGgQMH4u/vD4DNZgMgLCwsz+NkX6bKbpeXuLg4hg0b5nxtt9upVq3aNb8HEREpRiGV4e5ZZlchheDVl5kAXnnlFWJjY4mLiyMpKYmzZ8+yevVqMjIy6NixIwsWLHDZuaxWK6GhoTkeIiLiIY7sMLsCuUpeHWaWL1/OSy+9xJNPPsnzzz9PREQEQUFBREdH88033xAYGMjQoUOBiz0y+fW8ZI9/ya/nRkREPNjvK+GtNvD5YMclJvEoXh1mFi1aBEDHjh1z7atQoQKNGjXiwIEDHD9+PMeYmLxcaUyNiIh4qPTz8PUzjufWUI2T8UBeHWbS0tIAOHbsWJ77s7dbrVbq1q1LeHg4a9asISUlJUe7CxcusGrVKsLDw6lTp07RFi0iIsUrfjyc2gch4Y5bscXjeHWYiY6OBmDKlCm5Lh/NmTOHPXv20KxZM0JCQrBYLAwePJizZ88yduzYHG3Hjx/PqVOnGDx4MBZNZy0i4j2SN8NP0x3Pb5sCpTSUwBN59XIGmZmZdO7cmfj4eCpUqECvXr0oW7YsCQkJfP/991itVpYtW0bbtm2B3MsZNGvWjISEBJYsWaLlDEREvE1mOszoAEe2w4194a73za5ILlGY71CvDjPgmMhu2rRpfPzxx+zatYu0tDQqVapETEwMcXFxznWZstlsNsaMGcNnn33G4cOHqVy5MnfddRejRo0q9OBfhRkREff0y8HT7Px4FPeemQ2B18GQDRBcweyy5BIKM25CYUZExD2N/moHf6z7gmlBswm9bRzc1M/skuRvtNCkiIjI3xw8dY5TKelYLPB1wiFOZDWhR2Zj3i7XHuOgjbJB/kSULW12mXIVFGZERKREaDtxBQD+ZJDx19df8jlfbvvvGmeb/RN6mlKbXBuvvptJREQk29R+UUT6HGel9Z/c5RsPGGSPs/DzsTC1X5Rptcm1UZgREZESoXdUOItqfkK45SR3+a7CwsUhowuHRNO7SVUTq5NroTAjIiIlw5b/EZy8mguGP89l/AMDHzR1mHcokjEzS5YsYc2aNZw7d44aNWrQp08fIiIiiuJUIiIiV2Y/BN+9AMDbvgMIqdCAcS2q8fHGJP48fYFywQEmFyjX4qpvzX7iiSe47bbb6NGjh3PbiRMnuOOOO1i7di2XHrZUqVK88cYbPPjgg9desQfRrdkiIm7AMOCje2H3t1C1GakPfEuAvz8WiwXDMEjLzMLqp/WY3E1hvkOv+jLT22+/zaZNm3JsGzRoED/99BPR0dG89957fPnll8TFxQHw6KOP5movIiJS5LZ96ggyvgFwxxtYAwKcS9NYLBYFGS/gsstMv/zyC99++y09evTg66+/dv5Buf3227n11luJiYlh6tSpzJ0711WnFBERubITewELtB8BFa83uxopAi4LMz/99BMWi4VRo0blWoyxbdu2dO3alR9//NFVpxMRESmYjnFQtytUaWx2JVJEXHY306lTpwC44YYb8tx/4403cuTIEVedTkREpOAimoGvv9lVSBG5pjBzaQ9M1aqO+/NTU1PzbJuamkqpUqWu5XQiIiIFc/YYfDTgr0tM4u2u6TLTa6+9xqxZs4CLIWbHjh20a9cuV9v9+/dTqVKlazmdiIhIwSweDr8tgpSj8PD3aEIZ73bVPTPVq1cnLCwMwzAwDIOAgACqV6/OypUrc7W12Wz88MMPNG3a9JqKFRERuaIdX8DOheDjBz0nK8iUAFfdM7N///4Ctz106BAjRoygY8eOV3s6ERGRK0s5DouGO563HQZVbjK3HikWVz1pnlyZJs0TESlmn9wPO7+Eig3hkXjw08y+nqpYJs0TERFxK9sXOIKMjx/c+ZaCTAmiMCMiIt5h8xzHf9sN1+WlEqZIFpoUEREpdgM+hZ9nQ7NYsyuRYqYwIyIi3sEvAG5+xOwqxAS6zCQiIp7rzGFY+X+QkWZ2JWKiIgkzBw4cwG63F8WhRUREHAwDvnoaVrwCXz9tdjVioiIJMzVr1mTatGlFcWgRERGHLXMh8TvwDYDoZ8yuRkxUJGEme1ZgERGRInH6AHwb53je6UWoeL259YipNGZGREQ8S1YWfDkE0s5AtZuh9ZNmVyQmU5gRERHPsuk92LcK/EtD77fAx9fsisRkRRZmLFrYS0REXC39PMRPcDzvPAbK1Ta3HnEL17w2U61atXJt279/P2XKlKFMmTI5T2axsHfv3ms5nUfR2kwiIkXgxF7Y9D50eRl8dIHBWxXmO/SaJ82rXr16rl6Y/fv3ExYWRmRk5LUeXkREJKdytaHbOLOrEDdyzWEmPj4+1zYfHx8efPBBRo4cea2HFxERgcPb4cJpqNHW7ErEDal/TkRE3FtGKiz4B8y+DbZ+ZHY14oYUZkRExL2tGAdHd0JQeajbxexqxA0pzIiIiPv6Yy2sed3x/PZpjkAj8jcKMyIi4p4u2OGLRwADou6DBj3Nrkjc1DUPAM5LVlZWURxWRERKku/iHMsWhFWH7hPMrkbcmHpmRETE/SRtdCwkiQXufBtKaa4uyV+R9MyIiIhck4jmjqUKTidBjWizqxE3pzAjIiLux2KBqAFmVyEeQpeZRETEfexdAedOml2FeBiXhJkff/zRFYcREZGS7PgemD8A3moDp/abXY14EJeEmW7durFw4UJXHEpEREqizHRYMBjSz0H5uo47mEQKyCVhpmbNmtx9993MmDEj3zZnz55l1KhRrjidiIh4m5UT4dAWKFUGer+t1bClUFzyp2XNmjW0atWKxx9/nLFjx+bYl5aWxmuvvUatWrV45ZVXXHE6ERHxJn+shR8nO57fPhXCqppajngel4SZMmXKsGzZMnr37s3o0aN54oknyMjIYPbs2dSrV4/hw4eTmZmpMCMiIjllz/JrZMFN/aHhnWZXJB7IYhiG4aqDGYbB008/zZtvvklYWBg2m43g4GCeeeYZhg8fTmhoyZr0yG63Oz+HkvbeRUQK5NvnYd0bUKY6PLZGk+OJU2G+Q106z8z69evZtWsXhmFw+vRpKleuzObNm6lcubIrTyMiIt4i5l+QcgyaP6QgI1fNJZeZfv75Z3r27El0dDTLly/nvvvu45lnnuHw4cPExsaSkpLiitOIiIi3CSwLfd+FyNZmVyIezCU9My1atADg1ltvZfz48TRu3BiAGjVqMGzYMDp06MDixYupUKGCK04nIiKeLCsTflsMDW5zzPQrco1c0jPTqlUr4uPjWbRokTPIADzzzDPMmzePbdu2ER0dzb59+1xxOhER8WQ/ToGPB8LCJ8yuRLyES3pmfvrpp3z33XvvvZQvX54+ffrQpk0b/vzzT1ecUkREPFHSRogf73hes725tYjXKJZZiTp37kx8fHxxnEpERNxV6hnHLL9GJtzYF2661+yKxEsU2xSLTZs2Zc2aNcV1OhERcTeLhjvWXAqrBj2naLyMuEyxzhddq1at4jydiIi4i4SP4Zf5YPGBvjMhsIzZFYkX0eIXIiJStC7YYcm/HM9jnoPqrcytR7yOwoyIiBStUqHQfz40uhvaDze7GvFCLp0BWEREJE+RbRwPkSJQJD0zBw4cwG63F8WhRUTEUxxYB8d2m12FlABFEmZq1qzJtGnTiuLQIiLiCc4eg0/uhxkx8Ef+c5GJuEKRhBnDMHDhYtwiIuJJsrJg4WNw9ohjNewqUWZXJF5OA4BFRMQlfjl4mv4z1nHo2//AnmXgVwrumgUBpc0uTbycBgCLiIhLLNicTMq+DVQ6NMGxoft4qHSDuUVJiVBkPTMWN5vZ8YsvvqBLly6UK1eOwMBAatasSf/+/UlKSsrRzm63M2zYMCIjI7FarURGRjJs2DANaBYRycPBU+fYdtDG9mQby7fuYbr/dHzJxFazB9sq9eHgqXNmlyglgMW4xsEtec3qu3//fsqUKUOZMmVynsxiYe/evddyukIzDIPHHnuMGTNmULt2bbp160ZISAiHDh1i5cqVzJs3j7Zt2wKQkpJC27Zt2bp1K126dKFp06YkJCTw7bffEhUVxerVqwkKCirwue12O2FhYdhsNkJDQ4vqLYqImKbGc4ucz5/2XcAw/884aJSnR+p47Dj+vtw/oadZ5YkHK8x36DVfZqpevXquXpj9+/cTFhZGZGTktR7+mk2fPp0ZM2YwZMgQpk2bhq+vb479GRkZzueTJk1i69atjBgxgokTJzq3jxo1irFjxzJp0iTGjBlTbLWLiLi7qf2iGP5pAhlZBm9k3oG/JYMVmVHYCcLPx8J/7r7J7BKlBLjmnpm8+Pj4MHr0aEaOHOnqQxfK+fPniYiIoEyZMvz222/4+eWf3QzDICIiArvdzuHDh3P0wFy4cIHw8HBKly5NUlJSgS+hqWdGREqC7ck2bpu+Otf2b55qy41Vw0yoSLxBYb5Dvfpupu+//56TJ0/Su3dvMjMzWbBgARMmTODtt99mz549OdomJiZy6NAhoqOjc11KKlWqFO3btyc5OTnXz4mIlGhpKVTY8l/8yXAugu1mQyalBPDqu5k2bdoEgJ+fHzfddBO//fabc5+Pjw9Dhw7lP//5D+AIMwB169bN81jZ2xMTE/Ntk5qaSmpqqvO1Bg2LiNdbNJxKCR/ybmALppQbTb8W1fh4YxJ/nr5AueAAs6uTEsKre2aOHj0KwOTJkwkNDWXDhg2cOXOGVatWUa9ePSZPnsxbb70FgM1mAyAsLO8u0ewurux2eRk/fjxhYWHOR7Vq1Vz5dkRE3MvWDyHhQ7D40GbgKL4cEs19N0fy5ZBoVj/XkSphgWZXKCWEV4eZrKwsAAICAli4cCEtWrQgODiYdu3a8dlnn+Hj48PkyZNddr64uDhsNpvz8ffbvkVEvMbRXbDoWcfzDs8TULudczyhxWLB6ud7mR8Wca0iucyUHSLMlt3L0rx5c8LDw3Psa9iwIbVq1WLPnj2cPn3a2Ta/npfsS0b59dwAWK1WrFarK0oXEXFfaSnw6QOQfg5qxkC7YWZXJCWcV/fM1K9fHyDXfDfZsrefP38+x5iYvFxpTI2ISImxaDgc2wXBlaDvTPBRL4yYy6sHAHfs2BGAX3/9Nde+9PR09uzZQ1BQEBUqVKBy5cqEh4ezZs0aUlJSct2avWrVKsLDw6lTp06x1S8i4nZOJ8Gub8DiA3e9D8EVza5IxLt7ZmrXrk3Xrl3Zs2cPM2fOzLFvwoQJnD59mjvvvBM/Pz8sFguDBw/m7NmzjB07Nkfb8ePHc+rUKQYPHux2yzSIiBSrMtXg0ZXQ679Qo63Z1YgARTRpnjvZu3cvbdq04ejRo/Ts2ZMGDRqwZcsWli9fTmRkJOvWraNy5cpA7uUMmjVrRkJCAkuWLNFyBiIiIsVIk+Zdonbt2mzatInY2Fh+/vlnXn/9dRITExkyZAgbNmxwBhmAoKAg4uPjGTp0KLt27WLy5Mls376doUOHEh8fX6ggIyLiNQwDFv8L9iwzuxKRPHl9z4yZ1DMjIl5h40zHbdi+AfD0VgiranZFUgIUac9MVlYW27dv59ChQ7n2paens2rVqsIeUkRE3FXyZvg2zvG800sKMuKWChVm/vjjDxo1akTjxo2pVq0avXr14sSJE879J0+edN5BJCIiHu78Kcd8Mplp0OA2aPOU2RWJ5KlQYWbEiBFERERw4MABEhISSE1NJTo6Okcvja5aiYh4gaws+OIxOH0AytaAO97QCpLitgoVZlauXMmkSZOIiIjgxhtv5Ntvv6Vdu3a0a9eOAwcOAOjWZRERb7BmKuz+FnytcPccCCxjdkUi+SpUmDl37lyO6fotFgvvvvsuXbt2pX379uzdu9flBYqISDEzDDi13/H81okQHmVmNSJXVKgwU79+fTZt2pRr+1tvvUWPHj247bbbXFaYiIiYxGKBXq9D7CJoFmt2NSJXVKgw06dPHz788MM897355pv069dPY2ZERDxVZrpjrEy2Gm01TkY8guaZKUKaZ0ZEPMqS5+DEHugzA0pfZ3Y1UsJpBmARESmc7Z/D+rdgz/dwMPdwAhF35pIw8+OPP7riMCIiYoajv8KXf80h03Yo1Otqbj0iheSSMNOtWzcWLlzoikOJiEhxumCD+fdBegrUjIGOL5pdkUihuSTM1KxZk7vvvpsZM2bk2+bs2bOMGjXKFacTERFXyMqCLx6Hk3shNALueh98/cyuSqTQXBJm1qxZQ6tWrXj88ccZO3Zsjn1paWm89tpr1KpVi1deecUVpxMREVdYMxV+W+RYQLLfBxBU3uyKRK6KS8JMmTJlWLZsGb1792b06NE88cQTZGRkMHv2bOrVq8fw4cPJzMxUmBERcSd1boEy1aHnZKjazOxqRK6aS2/NNgyDp59+mjfffNN5O1VwcDDPPPMMw4cPL3G3J+vWbBFxe2kpEBBkdhUiuRTmO9SlF0fXr1/Prl27MAyD06dPU7lyZTZv3kzlypVdeRoREblaaefg+O6LSxQoyIgXcMllpp9//pmePXsSHR3N8uXLue+++3jmmWc4fPgwsbGxpKSkuOI0IiJyLQwDvnoK3usCCR+bXY2Iy7ikZ6ZFixYA3HrrrYwfP57GjRsDUKNGDYYNG0aHDh1YvHgxFSpUcMXpRETkaqx7E7Z/Bj5+EBZhdjUiLuOSnplWrVoRHx/PokWLnEEG4JlnnmHevHls27aN6Oho9u3b54rTiYhIYf2+Epa+5Hje7VWoEW1uPSIuVCxrMy1btow+ffoQFBTEn3/+WdSncxsaACwibuH0AZjRAc6dgJv6Q++3tICkuD23W5upc+fOxMfHF8epRETkUmnnYP4AR5CpchPc9pqCjHidYltosmnTpqxZs6a4TiciIgCb58DhbRBUAfrNA/9AsysScblinbe6Vq1axXk6ERFp+SiknnWMkSlTzexqRIqEFuEQEfFmPj4Q8y+zqxApUsV2mUlERIrJ8T3w1dOO8TIiJYB6ZkREvMn50/DRvXAi0THQ9/ZpZlckUuRc2jNjt9s5cOBAvq9FRKQIZWXC5w87gkxoVejwvNkViRQLl4aZ1157jZo1a+b7WkREitCyUbBnGfgFwr0fQkglsysSKRYaMyMi4g22fgQ/TXc87/3mxYUkRUoAhRkREU93cBN8/Yzjeft/wY19zK1HpJhpALCIiKfLygRrMFTrrHEyUiIpzIiIeLrqN8Mj8RBY1jGvjEgJoz/1IiKeKCsLTu67+LpMdbCGmFePiIkUZkREPFH8q/B2W/htidmViJhOl5lERDzNts9g1f85np8/ZW4tIm5APTMiIp4kaSMsfMLxvM3TEDXA3HpE3IDCjIiIm/vl4Gn6z1jHr79uh/n9ITMV6veAzqPNLk3ELegyk4iIm1uwOZltvydx3clX4cIxqNwI+rwLPr5mlybiFlwaZgzDwDCMfF+LiEjBHDx1jlMp6Vgs8HXCIR72XUKlC7+TXroiezrOJOScDxFWs6sUcQ8WQ2mjyNjtdsLCwrDZbISGhppdjoh4kBrPLXI+twA+ZPK834cszIxmm1ELgP0TeppUnUjRK8x3qMbMiIi4oan9ovDzsQBgAJn48nLGILYZtfDzsTC1X5Sp9Ym4E4UZERE31LtJVX647Twv+72PHxk59i0cEk3vJlVNqkzE/SjMiIi4oz8TiFj+JIP8ljHI73sALBaTaxJxUwozIiLuxpYMH/bDN+McGyyN2FrpLsbdeSONqoZRIdhKueAAsysUcSsuuZtp2rRpPPnkk/j66jZBEZFrknoGPuoHZ/6ECg246YGvWBBUFovFwoCW1UnLzMLqp79rRS7lkp6ZoUOHctNNN/H999+74nAiIiVTZgZ8GguHt0FQBRjwCdbg67D8dX3JYrEoyIjkwSVh5q233uLo0aN0796d3r178/vvv7visCIiJcuSEbBnGfgFQv+PoWyk2RWJeASXhJlHH32U3bt3M2TIEBYvXkzDhg15/vnnSUlJccXhRURKhvq3gjUU7noPIpqZXY2Ix3D5pHk7duzg6aefZsWKFVSpUoUJEyYwaNAgV57CY2jSPBEptHMnofR1ZlchYjpTJ81r2LAhP/zwA59++ikBAQHExsbSunVrNm7c6OpTiYh4vgPr4cTei68VZEQKrchuze7bty+7du1i9OjR/PLLL7Ru3ZoHH3yQw4cPF9UpRUQ8y9Ff4cO74b0ujuciclVcHmYyMzPZsmUL77zzDo8//jgff/wxqampZGVlMWfOHOrXr8+0adNcfVoREc9iPwRz74ILNihXF8rWMLsiEY/lknlm5s+fz/r169mwYQNbt27lwoULztWyy5cvT48ePWjTpg01atRgypQpDB06lK+++ooFCxYQFhbmihJERDzHBRvMuxvsBx1Bpv9H4B9odlUiHsslA4B9fHyc/73hhhto06YNbdq0oXXr1tStWzdX+//+978MGzaMgQMH8v7771/r6d2WBgCLSC4ZaTDvLti3EoIqwuDv1SsjkofCfIe6pGdm1KhRtGnThlatWhESEnLF9k8++SSbN2/m66+/dsXpRUQ8Q1YWfDnEEWT8g+C+TxVkRFzAZWGmsOrVq8fJkyddcXoREc+QngKn9oGPH9zzAYRHmV2RiFdwSZi5GoMGDaJSpUpmnV5EpPhZQ+D+ryBpPdTuaHY1Il7D5ZPmyUUaMyMiAJz8Ha6rZXYVIh7F1EnzRETkEnuXw39bwopXQf92FCkSCjMiIkUl+WeYPxCy0uHEHoUZkSKiMCMiUhSO7XZMipeeArU6QO+3wEd/5YoUhRL3mzVp0iQsFgsWi4V169bl2cZutzNs2DAiIyOxWq1ERkYybNgw7HZ7MVcrIh7Jlgxz+8D5kxDeFPrNBT+r2VWJeK0SFWZ+/fVXRo4cSVBQUL5tUlJSiImJ4bXXXqN+/foMHTqUG264gddee42YmBhSUlKKsWIR8TjnTjqCjC3JMbvvfZ867mISkSJTYsJMZmYmDzzwADfddBN33nlnvu0mTZrE1q1bGTFiBEuXLmXChAksWbKEkSNHsnXrViZNmlSMVYuIx9mzDI7tgpBwGLQAgsqbXZGI1ysxYWbixIkkJCTw/vvv4+vrm2cbwzCYOXMmwcHBjBw5Mse+uLg4ypYty3vvvYfuZheRfDW+B3q/7QgyZaqbXY1IiVAiwsz27dsZM2YML774Ig0bNsy3XWJiIocOHSI6OjrXpahSpUrRvn17kpOT2bNnT1GXLCKeJCsTUs9cfB3VHypeb149IiWM14eZjIwMYmNjuf7663nuuecu2zYxMREgz8UxL92e3e7vUlNTsdvtOR4i4uUMA74ZCrN6wNljZlcjUiJ5fZh59dVXnZeX/P39L9vWZrMBEBYWluf+7BkIs9v93fjx4wkLC3M+qlWrdg2Vi4hHWDYaNs+BI9sd88qISLHz6jCTkJDAK6+8wvDhw2natGmRny8uLg6bzeZ8JCUlFfk5RcREP06GNVMdz2+fBvW7m1qOSEll2kKTxeGBBx6gdu3ajB49ukDts3tk8ut5yb5slF/PjdVqxWrVXBIiJcL6GfDDWMfzLi9D0/vNrUekBPPqMJOQkAA4Bu/mpXXr1gB88cUX9O7d+4pjYq40pkZESoitH8KSfzmetx8B0U+bW49ICefVYebhhx/Oc/uqVatITEykV69eVKhQgRo1agCOkBIeHs6aNWtISUnJcUfThQsXWLVqFeHh4dSpU6c4yhcRd5R+3rFoJECrJ6Dj8+bWIyLeHWZmzpyZ5/bY2FgSExOJi4ujVatWzu0Wi4XBgwczduxYxo4dy8SJE537xo8fz6lTp3jqqaewWCxFXruIuCn/QIj9BrbMhY4vgP4+EDGdV4eZqzFixAi++uorJk2axJYtW2jWrBkJCQksWbKEqKgoRowYYXaJImKGC3Yo5bijkbI1oNOLppYjIhd59d1MVyMoKIj4+HiGDh3Krl27mDx5Mtu3b2fo0KHEx8dfdl0nEfFSB9bBtMawa7HZlYhIHiyG5uYvMna7nbCwMGw2m3OOGhHxMMk/w5w7IO0M1O0GAz7WpSWRYlCY71D1zIiI5OfwdvhfH0eQiWwLd89WkBFxQwozIiJ5OforfNALLpyGiJYwYD4ElDa7KhHJg8KMiMjfHdsNc3rBuRNQJQru+xSsIWZXJSL5UJgREfm7zXMg5ShUbgSDvoDAMmZXJCKXoVuzRUT+rsvLUCoMmj8Mpa8zuxoRuQL1zIiIAJw5DJkZjuc+PhAzAoLKmVuTiBSIwoyIlFi/HDxN/xnr+PXXX2BmZ/ji0YuBRkQ8hi4ziUiJtWBzMkn7dlHl+HhIOwx+VsfdS0HlzS5NRApBYUZESpSDp85xKiUdiwU2bd3K/ICXKZN2nNSwWvze9UNC0koToYm+RTyKwoyIlChtJ64AIMJyjPkBLxNhOc7vWVW498izHJ21B9jD/gk9zS1SRApFY2ZEpESZ2i+KWj5HnUFmb1YV7k17kaOUxc/HwtR+UWaXKCKFpJ4ZESlRejepyk3pFamwyOYMMscoC8DCIdHcWDXM5ApFpLAUZkSkxEmp2pbY9BHsMapyjDJYLKAld0U8ly4ziUjJcOw3xzIFQLngAPaUbkqVqpGMu/NGGlUNo0KwlXLBASYXKSJXw2IY+vdIUSnM8uUiUoQOb4MPeoOPHzy4GMrVJjUjkwBfHywWC4ZhkJaZhdXP1+xKReQvhfkOVc+MiHi35M0w+zY4dxxCKkGpMgBY/XyxWCwAWCwWBRkRD6YxMyLivQ6sh3l3QaodIlrAfZ9p0UgRL6QwIyLead+P8GE/SE+ByGgY8DFYQ8yuSkSKgMKMiHifP9Y6emQyLkCtDnDvRxBQ2uyqRKSIKMyIiPepdANUaAAhleHuOeBfyuyKRKQIKcyIiPcpFQb3L4SAYPD1N7saESliuptJRLzDhnfhp+kXXweWVZARKSHUMyMins0wYNV/YMUrjtcRLaB6K3NrEpFipTAjIp4rKwuWvgjr3nC8jvk3VLvZ3JpEpNgpzIiIZ8rMgK+fhq3zHK+7T4BWj5tbk4iYQmFGRDxP+gX4/GHY9Q1YfOGONyCqv9lViYhJFGZExPPs+d4RZHytcPcsaNDT7IpExEQKMyLiea6/HTqPhqrNoGZ7s6sREZMpzIiIZzi5zzF/TOnrHK/bDjW3HhFxG5pnRkTc358J8F5X+PAeSEsxuxoRcTMKMyLi3vaugFk9IeWoY+Bv2jmzKxIRN6PLTCLivn75BBY+AVnpUKMd3DvPcalJROQS6pkREfdjGLDmdVjwD0eQadgHBn6uICMieVKYERH3s/o1+P4lx/NWQ6Dve+BnNbcmEXFbCjMi4n5uuANKl4eur0D3V8FHf1WJSP40ZkZE3ENmBvj+9VdSudrw1M8QWMbUkkTEM+ifOyJivhN74a3WkLjs4jYFGREpIIUZETHXH2thZmc4vhu+HwlZmWZXJCIeRpeZRMQ82z6DhY9DZhqEN4H+H4OPr9lViYiHUZgRkeJnGLDq/2DFOMfrBrdBn3choLS5dYmIR1KYEZHilZkBXz0JCR85Xrd+ErqMVY+MiFw1hRkRKV4+vuAbABZf6PF/0OJhsysSEQ+nMCMixctigZ6ToclAqNbS7GpExAvobiYRKXqJy+DTWMclJgBffwUZEXEZhRkRcblfDp6m/4x1/JJ0Cta+CR/eDTu+gI3vml2aiHghXWYSEZdbsDmZn38/TMbC6XDiG8fGqIHQXONjRMT1FGZExCUOnjrHqZR0LBZYs3UnHwZMoumJ3RgWH/5s+SJZNz9GhF+A2WWKiBdSmBERl2g7cQUAN1j2MztgMlV9TmA3SvNk2lOsWtkAVsazf0JPk6sUEW+kMTMi4hJT+0Xh52MhEx/KcJa9WVXonTaWVVk34edjYWq/KLNLFBEvpZ4ZEXGJ3k2qUqdiMLdNN3gobQS/GtWxEwTAwiHR3Fg1zOQKRcRbqWdGRK7NuZMw7x44sM65aQPXYycIi8XEukSkxFDPjIhcvT8T4OOBcPoAHN9Nuft/pEKwlSplStGvRTU+3pjEn6cvUC5YA39FpOhYDMMwzC7CW9ntdsLCwrDZbISGhppdjohrbf0IvvknZFyAsjXg3g+hUkNSMzIJ8PXBYrFgGAZpmVlY/bTukogUTmG+Q9UzIyKFk5EG38XBxpmO13W7QZ93ILAsQI7gYrFYFGREpMgpzIhIwV2ww9y+cHADYIEOcdD+X+Cj4XciYh6FGREpOGsIhIZDqTDo8y7U62Z2RSIiCjMicgVZWY5xMQGlHSte3/FfSDkO19U0uzIREUBhRkQuJ+U4fPEoBATB3XMcYcYa4niIiLgJhRkRydsfa+Gzh+DMIfALhGO/QcUGZlclIpKLwoyI5JSVBWumwvJXwMiE8vXg7tkKMiLithRmROSi7MtKe5Y5XjfuBz2ngDXY3LpERC5DYUZEHAwDPuwHyZvArxT0+D9oMgitSSAi7s6rJ4dITk5m6tSpdO3alerVqxMQEEDlypXp27cv69evz/Nn7HY7w4YNIzIyEqvVSmRkJMOGDcNutxdz9SLFzGKBri9DxYbwj+XQ9H4FGRHxCF69nMFzzz3HxIkTqV27NjExMVSsWJHExEQWLlyIYRh89NFH3HPPPc72KSkptG3blq1bt9KlSxeaNm1KQkIC3377LVFRUaxevZqgoKACn1/LGYjbO30AjuyE+t0vbsvKBB/N2isi5tJyBn9p2bIlq1atol27djm2//jjj9xyyy08/vjj3HHHHVitVgAmTZrE1q1bGTFiBBMnTnS2HzVqFGPHjmXSpEmMGTOmWN+DSJHZ9hl8Mwyy0uGReKhQ37FdQUZEPIxX98xcTrdu3Vi6dCkbN26kefPmGIZBREQEdrudw4cP5+iBuXDhAuHh4ZQuXZqkpCQsBex6V8+MuKULdlj8L/hlvuN1REvo+65jsUgRETdRmO9Qrx4zczn+/v4A+Pk5OqcSExM5dOgQ0dHRuS4llSpVivbt25OcnMyePXvyPWZqaip2uz3HQ8StJG2At9s6gozFB2KegweXKMiIiEcrkWHmwIEDLFu2jMqVK9OoUSPAEWYA6tatm+fPZG/PbpeX8ePHExYW5nxUq1bNxZWLXIP4CfB+Nzj9B5Sp7ggxHePA16uvNotICVDiwkx6ejqDBg0iNTWVSZMm4evrGB9gs9kACAsLy/Pnsru4stvlJS4uDpvN5nwkJSW5uHqRa2BkOR6N+8Fjq6F6K7MrEhFxiRL1T7KsrCweeughVq1axT/+8Q8GDRrk0uNbrVbnYGIR02VlwfmTEFTe8br9vyCiBdTtYm5dIiIuVmJ6ZgzD4B//+Adz585l4MCBvP322zn2Z/fI5Nfzkj3+Jb+eGxG3cvoA/O8O+F9vyEhzbPP1V5AREa9UInpmsrKyGDx4MLNmzaJ///7Mnj0bH5+cOe5KY2KuNKZGxC0YBmz+AL57AdLOgH9pOPwLRDQ3uzIRkSLj9bdmXxpk+vXrx7x585zjZC5VkFuzAwMDOXjwoG7NFvdkS4avn4E93zteV2sFvd+EcrXNrUtE5Cro1uy/ZGVl8fDDDzNr1izuvvtu5s6dm2eQAbBYLAwePJizZ88yduzYHPvGjx/PqVOnGDx4cIGDjEixMQz4eQ682coRZHyt0OVleHCxgoyIlAhe3TMzevRoxowZQ3BwMM8884xzTplL9e7dm6ioKCD3cgbNmjUjISGBJUuWaDkDcV9ZWTC7Jxz4Cao2hzvegIoNzK5KROSaaDmDv+zfvx+As2fPMm7cuDzb1KhRwxlmgoKCiI+PZ8yYMXz22WfEx8dTuXJlhg4dyqhRowoVZERc7ZeDpxm/eBdxPRrQODwUMtPAvxT4+MAd/4Vdi6D1EC1HICIljlf3zJhNPTPiSqO/2sHsn/YzvAk8eXYahDeBWyde+QdFRDyQemZEvMTBU+c4lZKOxQJLtv7B074LeOTXhUAGmYd3cuSmpwgPjzC7TBERUynMiLixthNXANDCsov/+b9HPf9kAH7IbMKLFx7iz9cT2D9BYUZESjaFGRE39sadNUn55nnu8XWEmuNGKGPS7+frrNb4+fgw9e6bTK5QRMR8CjMibqznDeXI/OFnSIMPMzoyMaM/NoIBWDgkmhurakZqERGFGRF3c+oPKBvpeB5SieT2kxi26BA/0wADsFgcU8uIiIiDV0+aJ+JRUs84liF4vQn8tsS52b9Rb/4IuolGVcMYd+eNNKoaRoVgK+WCA0wsVkTEfahnRsRshgHbP4elL8GZQ45te1dA/VsBqBIWyOrnOhLg64PFYmFAy+qkZWZh9dN8MiIioDAjYq4/f4ElI+DAWsfrsjWgx39yrW59aXCxWCwKMiIil1CYETHLqv/AinFgZDlWt243DFo/5ZjVV0RECkxhRsQslRs5gkzDPtD1ZQjTfDEiIldDYUakOBiGY1Bvqh1uutexrV43eGy1I9SIiMhVU5gRKWqHtsLSF2H/j2ANgzpdIKicY5+CjIjINVOYESkqpw/ADy/Dtk8cr32t0OJh8NMt1SIirqQwI+Jq50/Bj1Ng/TuQmerY1ugeuOUlKFPd3NpERLyQwoyIq6Uch7VvgJEJNdo5BveGNzG7KhERr6UwI3KtMtIc88TUinG8Ll8XOr0IlRpC3a6O9QdERKTIKMyIXK3MDPjlY1g5AWwH4fGfoOL1jn3thplbm4hICaIwI1JYWZmw4wuIHw8n9ji2BVeC00kXw4yIiBQbhRmRgsoOMSsnwfHfHNsCr4O2Q6HFYAgobW59IiIllMKMSEGln3eso3TuBJQKcyw90OoxsIaYXZmISImmMCOSn4w0+PUrx3IDPj5gDYYOcXD+NNz8iCPQiIiI6RRmpMT75eBpxi/eRVyPBjSOKANp52DzHPhpOtiTHYtANujhaNzyH6bWKiIiuSnMSIm3YHMya38/wbcbdtB4z4+Oye7On3TsDK4MGefNLVBERC5LYUZKpIOnznEqJR2LBb7bup/RfrO595d4IA2AjNDq+LUfClH3gZ/V1FpFROTyFGakRGo7cYXzuQWDZgG7KUUa27Jq8E7G7Sw52pK9zXuZWKGIiBSUwoyULJnpsPNLNkbMoMuhRzidFYiBhVfSB+FjyWJt1g34+fgwud9NZlcqIiIFpDAjJcOZI/DzLNg0C84epgKwpF1XWq90THK33rgeDEfThUOiubGq7lQSEfEUCjPivQwDktbDxpmwYyFkpTu2B1eC5g9xOuJOWLkLi8XRNPu/IiLiWRRmxHulHINZPRyrVwNEtISbH4Xre4FfAGVs56kQvI8qZUrRr0U1Pt6YxJ+nL1AuOMDcukVEpFAshqF/ixYVu91OWFgYNpuN0NBQs8vxboYBBzfCHz9B239e3L7gUfDxg5aDIbxJrh9LzcgkwNcHi8WCYRikZWZh9fMtvrpFRCRPhfkOVc+MeLazx+CX+bD5fxfXS7qhF1xXy/H8zrcd14/ycWlwsVgsCjIiIh5IYUY8T0Yq7P4Wtn4Ee76HrAzHdr9AaHhnzraXCTIiIuIdFGbE8/z6NXz+8MXX4U2h6SC4sa/WSxIRKYEUZsS9HdkJ2z6FMtWh+YOObfV7QPl6UP9WuGkAVGxgbo0iImIqhRlxP0d/ddxKveOLi+NgKjSAZrGOy0YBpWHIBl1CEhERQGFG3Mma12HrPDi26+I2H3+o2xUa3XVxMhhQkBERESeFGSkyvxw8zfjFu4jr0YDGEWVy7sxMd9xKXb31xWByZLsjyPj4Q51b4IbejktJgX/7WRERkUsozEiRWbA5mbW/n2DB5mRHmDl3EvYsc9yJtGcZXLDBoz9ClcaOH2gxGGp1VIAREZFCUZgRlzp46hynUtKxWODrhENEWI5SZcsXnDu4h8BjCViMrIuNS5eD039cDDPVWjoeIiIihaAwI65jGNw/aR5p+HHQqIgFaOVzjEeNT+Goo8mvWdW4PuYeqNcdqjYDH01SJyIi10ZhRq6eYcCJPbB/tWMZgf2rWW49xOzM7oxOvx8D2JRVn4WZbViTdSNrjcYMv7sT1zepanblIiLiRRRmpPDSL8CCwXBgPaQczbnP10qv+mUYnfBXU/z4Z/qTAHzzVFturKpJ7URExLUUZiRvWVmOXpdDmyF5s+NyUPfxjn3+peBQgiPI+JWCiBYQ2cbxqHYzh46mQcJqLJaLd1NrOVMRESkqCjNy0fYFcGAdHN7meKSdubgvsCx0e/XibdS3TnRsq9oU/Kw5DlMuGCoEW6lSphT9WlTj441J/Hn6AuWCA4rxzYiISElhMQz9m7moFGb58oK67NwtV5KW4uhtOZ4Ix3fDmT+h1/SL++f0gn0rL772C4QqNzkCS3hTxyKOvgXLv6kZmQT4+mCxWDAMg7TMLK1ILSIiBVaY71D1zHiYXHO3XMow4NwJCCp/cdu6t+C3JXBiL9gP5j5gl5cvzunS8E6o3OivR2PH+kcFDC9/d2lwsVgsCjIiIlJkFGY8wN/nbmlq2U3Qlu85llkKv5QjBKYeo9S5P8F2EDIuwHMHLq4efXx3zt6WwOugfF3Ho+INOU+UvZCjiIiIB1GY8QBtJ65wPrcA//RbzSBjGSTk8wNnDl8MM437QURLuK4mlKsLQeWKvF4REZHipDDjAab2i2L4pwlkZBkYwJasOpTNPMtRowzHKEvnljfRrNGNEBYBoeE5B+RWb+V4iIiIeCkNAC5CrhwAvD3Zxm3TV+farrlbRETEGxXmO9SnmGoSF8m+Mzr7vyIiIiWdLjN5iHLBAZq7RUREJA+6zFSEXD3PjOZuERGRkkLzzHgpzd0iIiKSm8bMiIiIiEdTmBERERGPpjAjIiIiHk1hRkRERDyawoyIiIh4NIUZERER8WgKMyIiIuLRFGbysHHjRnr06EHZsmUJCgqiZcuWfPjhh2aXJSIiInnQpHl/Ex8fT7du3QgICODee+8lLCyMBQsWcN9997F//36ef/55s0sUERGRS2g5g0tkZGTQoEEDDh48yNq1a2nSpAkAZ86coXXr1vz222/s3LmTunXrFuh4rl7OQEREpKTQqtlXafny5ezdu5cBAwY4gwxASEgIL730EhkZGcyaNcvECkVEROTvFGYuER8fD0DXrl1z7cvetnLlyuIsSURERK5AY2YukZiYCJDnZaSyZctSvnx5Z5u8pKamkpqa6nxtt9tdX6SIiIjkoJ6ZS9hsNgDCwsLy3B8aGupsk5fx48cTFhbmfFSrVq1I6hQREZGL1DPjQnFxcQwbNsz52mazUb16dfXQiIiIFFL2d2dB7lNSmLlEdo9Mfr0v2SOr82O1WrFarTnaA+qhERERuUpnzpy57HcvKMzkkD1WJjExkWbNmuXYd+rUKY4fP06bNm0KfLzw8HCSkpIICQnBYrG4pEa73U61atVISkrS7d4uos/U9fSZupY+T9fTZ+paRfF5GobBmTNnCA8Pv2JbhZlLxMTEMH78eJYuXcq9996bY9/SpUudbQrKx8eHiIgIl9aYLTQ0VL+ALqbP1PX0mbqWPk/X02fqWq7+PK/UI5NNA4Avccstt1CrVi0+/PBDtm7d6tx+5swZXn75Zfz8/IiNjTWtPhEREclNPTOX8PPzY+bMmXTr1o127drRv39/QkNDWbBgAfv27eOVV16hXr16ZpcpIiIil1CY+ZuOHTuyevVqRo0axSeffEJaWhoNGzbk5Zdf5r777jO7PKxWK6NGjcox0FiujT5T19Nn6lr6PF1Pn6lrmf15am0mERER8WgaMyMiIiIeTWFGREREPJrCjIiIiHg0hRkRERHxaAozHmTjxo306NGDsmXLEhQURMuWLfnwww/NLsvjJCcnM3XqVLp27Ur16tUJCAigcuXK9O3bl/Xr15tdnleYNGkSFosFi8XCunXrzC7Ho33xxRd06dKFcuXKERgYSM2aNenfvz9JSUlml+ZxDMNgwYIFdOzYkSpVqlC6dGnq16/Po48+yu+//252eW5r7ty5PProozRv3hyr1YrFYmH27Nn5trfb7QwbNozIyEisViuRkZEMGzasaNcpNMQjrFixwggICDCCg4ONwYMHG88++6xRs2ZNAzDGjRtndnke5d///rcBGLVr1zYeeugh47nnnjP69u1r+Pr6Gj4+PsbHH39sdokebefOnYbVajWCgoIMwFi7dq3ZJXmkrKws45FHHnH+WX3iiSeMf//738agQYOM6tWrGz/++KPZJXqcYcOGGYBRpUoV47HHHjNGjBhhdOvWzbBYLEZISIixbds2s0t0S5GRkQZglC9f3vl81qxZebY9e/asERUVZQBGly5djH//+99G9+7dDcCIiooyzp49WyQ1Ksx4gPT0dKN27dqG1Wo1Nm/e7Nxut9uNhg0bGn5+fsbu3btNrNCzfP7558aqVatybV+1apXh7+9vXHfddcaFCxdMqMzzZWRkGC1atDBatmxpDBw4UGHmGkybNs0AjCFDhhgZGRm59qenp5tQlef6888/DR8fH6NGjRqGzWbLse+1114zAOPBBx80qTr39v333xv79+83DMMwxo8ff9kwM3LkSAMwRowYkef2kSNHFkmNuszkAZYvX87evXsZMGAATZo0cW4PCQnhpZdeIiMjg1mzZplYoWfp06cP7dq1y7W9Xbt2dOzYkZMnT7Jt2zYTKvN8EydOJCEhgffffx9fX1+zy/FY58+fZ8yYMdSqVYupU6fm+Vn6+WnO08LYv38/WVlZREdH51o7qGfPngAcPXrUjNLcXufOnYmMjLxiO8MwmDlzJsHBwYwcOTLHvri4OMqWLct7772HUQTT2ynMeID4+HgAunbtmmtf9raVK1cWZ0ley9/fH9AXxdXYvn07Y8aM4cUXX6Rhw4Zml+PRvv/+e06ePEnv3r3JzMxkwYIFTJgwgbfffps9e/aYXZ5Hqlu3LgEBAaxZs4YzZ87k2Ld48WIAOnXqZEZpXiMxMZFDhw4RHR1NUFBQjn2lSpWiffv2JCcnF8mfYf2N7QESExMBxy/j35UtW5by5cs728jVO3DgAMuWLaNy5co0atTI7HI8SkZGBrGxsVx//fU899xzZpfj8TZt2gQ4QvVNN93Eb7/95tzn4+PD0KFD+c9//mNWeR6pXLlyjBs3jn/9619cf/319OrVi5CQELZt28ayZct45JFHeOqpp8wu06Nd7rvq0u2JiYn5trlaCjMewGazAfkvhR4aGsrBgweLsySvk56ezqBBg0hNTWXSpEm6RFJIr776KgkJCaxfv97ZuyVXL/tyx+TJk2natCkbNmzg+uuvZ8uWLTzyyCNMnjyZ2rVr8/jjj5tcqWcZPnw44eHhPProo7z11lvO7W3atGHgwIH6s3uNCvJddWk7V9JlJinxsrKyeOihh1i1ahX/+Mc/GDRokNkleZSEhAReeeUVhg8fTtOmTc0uxytkZWUBEBAQwMKFC2nRogXBwcG0a9eOzz77DB8fHyZPnmxylZ7nlVdeITY2lri4OJKSkjh79iyrV68mIyODjh07smDBArNLlKukMOMBslNufmnWbrfnm4Tl8gzD4B//+Adz585l4MCBvP3222aX5HEeeOABateuzejRo80uxWtk/z43b96c8PDwHPsaNmxIrVq12Lt3L6dPnzahOs+0fPlyXnrpJZ588kmef/55IiIiCAoKIjo6mm+++YbAwECGDh1qdpkerSDfVZe2cyWFGQ9w6XXGvzt16hTHjx93+fXHkiArK4uHH36Y999/n/79+zN79mx8fPQrUVgJCQns2rWLUqVKOSfKs1gszJkzB4DWrVtjsVhYuHChuYV6kPr16wNQpkyZPPdnbz9//nwxVeT5Fi1aBEDHjh1z7atQoQKNGjXiwIEDHD9+vLhL8xqX+666dHtRfF9pzIwHiImJYfz48SxdupR77703x76lS5c620jBZWVlMXjwYGbNmkW/fv343//+p3EyV+nhhx/Oc/uqVatITEykV69eVKhQgRo1ahRvYR4s+wv3119/zbUvPT2dPXv2EBQURIUKFYq7NI+VlpYGwLFjx/Lcn73darUWW03epm7duoSHh7NmzRpSUlJy3NF04cIFVq1aRXh4OHXq1HH9yYtk9hpxqfT0dKNWrVqG1Wo1tmzZ4tx+6aR5v/32m3kFepjMzEwjNjbWAIy7775bk48VkQceeECT5l2Drl27GoDx7rvv5tg+duxYAzAGDhxoUmWe6aOPPjIAo2HDhsbp06dz7Js9e7YBGM2aNTOpOs/hrpPmWQyjCGavEZdbsWIF3bp1w2q10r9/f0JDQ1mwYAH79u3jlVde4YUXXjC7RI8xevRoxowZQ3BwMM8880yec8r07t2bqKio4i/Oi8TGxjJnzhzWrl1Lq1atzC7H4+zdu5c2bdpw9OhRevbsSYMGDdiyZQvLly8nMjKSdevWUblyZbPL9BiZmZl07tyZ+Ph4KlSoQK9evShbtiwJCQl8//33WK1Wli1bRtu2bc0u1e3MnDmT1atXA7Bt2zY2b95MdHS0s4eld+/e9O7dG4CUlBTatm3L1q1b6dKlC82aNSMhIYElS5YQFRXF6tWrc81B4xJFEpGkSKxfv97o3r27ERYWZgQGBhrNmzc35s6da3ZZHie7x+Byj/z+1SEFp56Za3fgwAEjNjbWqFy5suHv729Uq1bNGDJkiHHkyBGzS/NIFy5cMCZOnGg0bdrUKF26tOHn52dUrVrVGDBggNZluowr/Z05atSoHO1Pnz5tDB061KhWrZrzz+3QoUNz9Yi5knpmRERExKPp1g0RERHxaAozIiIi4tEUZkRERMSjKcyIiIiIR1OYEREREY+mMCMiIiIeTWFGREREPJrCjIiIiHg0hRkRERHxaAozIiIi4tEUZkRERMSjKcyIiIiIR1OYEREREY+mMCMiJUrr1q2xWCxs3Lgxx/ZTp07RsGFDSpUqxcqVK02qTkSuhsKMiJQoEyZMAGDkyJHObRcuXKBXr17s2rWLefPmERMTY1Z5InIVFGZEpESJiYnh1ltv5dtvv+Wnn34iKyuL++67j9WrV/Pf//6Xvn37ml2iiBSSxTAMw+wiRESKU0JCAk2aNKFTp040aNCAN954g5EjRzJmzBizSxORq6AwIyIl0sCBA5k3bx4AjzzyCO+8847JFYnI1dJlJhEpkcqXLw9AWFgY06dPN7kaEbkWCjMiUuJMmzaNadOmUalSJWw2G3PnzjW7JBG5BrrMJCIlyvz58xkwYAC33HILc+bMoUGDBpQpU4bdu3dTqlQps8sTkaugnhkRKTGWLVvGAw88QFRUFAsWLCA8PJxnnnmGpKQk3njjDbPLE5GrpJ4ZESkRNm/eTIcOHahQoQI//fQTlSpVAsBms1GzZk18fHz4/fffCQ0NNblSESks9cyIiNfbu3cvPXr0oFSpUnz33XfOIAOOAcDDhw/nxIkT/N///Z+JVYrI1VLPjIiIiHg09cyIiIiIR1OYEREREY+mMCMiIiIeTWFGREREPJrCjIiIiHg0hRkRERHxaAozIiIi4tEUZkRERMSjKcyIiIiIR1OYEREREY+mMCMiIiIeTWFGREREPNr/AwBfl7K9P9GgAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Customize the plot\n", "\n", "plt.rcParams.update({'font.size': 14}) # Increase font size (for entire notebook)\n", "\n", "plt.figure(figsize = (6,6)) # Change figure size and aspect ratio\n", "\n", "plt.plot(x,y, '*', label='Discrete') # Add labels\n", "plt.plot(x_fine, y_fine,ls='--', label='Quasi-continuous')\n", "\n", "plt.xlabel('$x$') # Use LaTeX notation\n", "plt.ylabel('$y = x^2 + x + 5$')\n", "\n", "plt.legend(loc='upper left') # Add legend" ] }, { "cell_type": "markdown", "id": "e6cf5f8e-68ef-45c3-b694-89abd1b484c6", "metadata": {}, "source": [ "### Scatter plots" ] }, { "cell_type": "code", "execution_count": 86, "id": "41448e21-f516-4dae-b178-faffeb76387f", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:19.075481Z", "start_time": "2022-03-08T14:59:19.063481Z" } }, "outputs": [], "source": [ "# Generate array of random numbers with normal distribution for x values:\n", "x_rand = np.random.normal(loc=3, scale=1.0, size=2000)\n", "# The same for y values:\n", "y_rand = np.random.normal(loc=3, scale=1.0, size=2000)" ] }, { "cell_type": "code", "execution_count": 87, "id": "db3b2e50-d322-405c-b7d4-c277268c0611", "metadata": {}, "outputs": [], "source": [ "# define the dictionaries for plotting options:\n", "random_dict = {\"color\": 'gray', \"label\": 'Random values'}\n", "mean_dict = {\"s\":200, \"color\":'blue', \"marker\":'*', \"label\": 'Average'}" ] }, { "cell_type": "code", "execution_count": 88, "id": "c71c756b-c9b0-466d-8ee9-3609a7b4dbb3", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:19.308480Z", "start_time": "2022-03-08T14:59:19.077479Z" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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mJiI7du347777sPhw4fx4osvuo5funQp1q9fjyuuuAL33HMPkpKS0NLSgo8//hglJSWYPHmy4mMkCELDcERQ2tvbOQBce3t70OMcDgd3+PBhzuFwhGQchw8f5lasWBHw3+HDh0NyXVZOnDjBAeBKSkp8nvvVr37FAeBuuOEGn+eOHz/u89hXX33FjRo1ihs/frzH4x9//DEHgAPA/eUvf/F4bsmSJRwA7t1333U91t7ezpnNZi4lJYVrbm52Pd7b28tde+21HADusssu8zjPvffeywHgnnjiCY/Hq6qqOADc+PHjuYGBAdfjS5cudT1++vRp1+P19fUcAG7w4MHcNddcw124cMH13F//+lcOAPfDH/7Q571743Q6uTFjxnBDhgzhenp6PJ7bv38/B4C7++67PR4Xc0/5z23p0qUej1922WU+94Zn9uzZnPfU8b//+78cAO6+++7j+vr6XI/39PRwpaWlHABu//79HMdx3Pnz5zmdTsfNmDGD6+/v9zhPf38/d+7cOb/XdSfUvzeCIJSBdQ0lN00E4HQ6UVVVFfSYqqoqTbhsvvjiC6xYsQIrVqzA//t//w9FRUX4xS9+gREjRuCFF17wOd6fZeDSSy/FokWLcPToUXz55Zc+z1977bW47bbbPB679957AQD79u1zPVZZWQm73Y57770XEyZMcD2ekJCAZ5991ue8vb29ePfddzF06FD8/Oc/93iupKQEJSUlOHr0KHbv3u3z2p/97GcYPny46+/8/HxkZWXh/PnzePbZZ5GSkuJ6btGiRUhISMChQ4d8zuONTqfDnXfeiXPnzuHDDz/0eG7dunUA4AoY5pFyT+Xy3//930hJScF///d/e1jAEhMTXff63XffBXDxPXEch6SkJMTFxXmcJy4uDoMHD1Z8fARBaBty00QALS0tHq4Zf9jtdrS0tKheN+PYsWN4+umnPR4bMWIEamtrPQQBz/Hjx7Fy5Up89NFHOHXqFHp6ejye/+qrr3DZZZd5PDZt2jSf86SnpwMAzp8/73qMX+z9uTdmzZrl4zY6cuQIHA4HioqKYDQafV5TVFSEbdu24bPPPsM111zj8dyVV17pc/yll16K48ePY+rUqR6Px8XFYcSIETh16pTPa/yxZMkSPPfcc1i3bp3LHTMwMIB3330XI0eOxPXXX+9xvJR7Koeuri40NDRg1KhR+M1vfuPzPN9Z98iRIwD+7VqsqqrCtGnTUFZWhsLCQuTn5/u4zQiCiA1IjEQAHR0dih4XSkpKSlxWnDNnzmDt2rV4/PHHccstt2Dv3r0YNGiQ69gvvvgCeXl5sNvtuO6661BaWgqz2Qy9Xo+amhrs2LHDZyEFgNTUVJ/HeGHh3sW1vb0dwEUx5E1cXByGDh3q8Rgv+C655BK/723kyJEe53XHbDYHHFOg5/hFWoicnBxceeWV+PDDD3H+/HkMHjwY27dvxzfffINHH33Uw7og9Z7K4dy5c+A4DqdOnfIRou50dna6/r+iogK//vWv8e677+JnP/sZAMBkMuHee+/Fr3/9a79ikCCI6IXESARgMpkUPS5cDB8+HI899hja29vxzDPP4Oc//zleffVV1/OvvPIKzp07h3Xr1uGuu+7yeO2DDz4oOw2YFy2nT5/2eW5gYADffvstRo8e7XqMFw3ffPON3/Pxj/sTF6FmyZIlePTRR1FRUYH777/f5aJZsmSJx3FK3VO9Xo/e3l6/z3mLMf5+TJ8+nbm4XUpKCp599lk8++yzOHHiBD7++GP84Q9/wKpVq+BwOPDHP/6R6TwEQUQHFDMSAWRkZAgugGazGRkZGWEakTh++tOfYtSoUfjd737nkX577NgxAMBNN93kcbzT6cSuXbtkX3fKlCkA4Dcttq6uDv39/R6PTZw4EcnJydi3bx+6urp8XsMv5N5ul3Bwxx13IC4uDuvWrUNnZycqKyuRk5PjMxal7umQIUNw+vRpn3vU2dmJo0ePejxmMplgsVhgtVo93GSsjB07Fvfeey927NiBQYMG4f333xd9DoIgIhsSIxGAXq/HvHnzgh4zb9486PXa/DgNBgMef/xx9PX14Ve/+pXrcT5u4ZNPPvE4/rnnnkNjY6Ps6958880wm814/fXX8c9//tP1eF9fn0+AKnAx2PKOO+7A2bNnsXLlSo/n/v73v2Pr1q24/PLLcfXVV8sem1j42JCdO3di1apV6Ozs9LGKAMrd0xkzZqCvrw9vv/226zGO4/DEE094uFt4fvjDH6KrqwsPPPCA3+dPnDjhEqJnzpzB3r17fY45d+4cenp6YDAYmMdJEER0QG6aCMFisWDx4sURW2fke9/7Hp577jm8+eab+OlPf4px48bhwQcfxJo1a7Bw4ULcdtttGDp0KOrr63Hw4EHccMMNPtkjYklNTcVvf/tbLFu2DFdddRVuv/12pKam4oMPPoDBYMCll17q85rnnnsOO3bswDPPPIPdu3cjPz/fVWfEaDRizZo1qom+JUuWYNu2bVixYgX0er2PGwaAYvf0P//zP7FmzRrcf//92L59O4YPH47a2lqcP38eU6ZM8ckE+v73v4/6+nqsXbsWu3btwvXXX49Ro0bhm2++wZEjR7Bnzx688847yMzMxKlTp5Cfn4+cnBxMmzYNo0ePxrfffov33nsPfX19+K//+i9F7hdBEBFEOPKMIxmt1BnhGRgY4E6cOMF9/vnn3IkTJzxqXqhJsDojPKtXr+YAcEuWLHE99vHHH3NXX301ZzKZuMGDB3MLFizgDhw4wD311FMcAO7jjz/2OBYA99RTTwW8vne9DI7juE2bNnHTp0/nkpKSuBEjRnD3338/19bWFrCWxpkzZ7gf/vCH3GWXXcYlJCRww4YN48rKyriGhgafY/k6IydOnPB5zl89Dp5gdTwC0dnZyQ0aNIgDwF133XUBjxNzT4Pdt3/84x9cfn4+l5SUxA0dOpRbsmQJ9/XXXwd9X3/961+566+/nhsyZAiXkJDAjR49misqKuJeeukl7syZMxzHcdy5c+e4FStWcNdeey136aWXcomJidyoUaO4efPmcdu2bWO6F1RnhCAiA9Y1VMdxHKeKCooQ7HY7UlNT0d7eHjRuo7u7GydOnHCV/CYIInTQ740gIgPWNZTcNAQRw3Ach97eXgwMDCAuLg6JiYl++84QBEGEEhIjBBGjOBwO2O12j9oscXFxMJvNFERKEERYITFCEDGIw+Hw27l4YGDA9TgJEoIgwoU2c0EJgggZHMcxtRegcDKCIMIFiRGCiDH4GJFgDAwMBKzAShAEoTQkRggixhASImKPIwiCkAuJEYKIMdwb6ylxHEEQhFxIjBBEjJGYmCgoNPg0X4IgiHBAYoQgYgydTsfUeJHqjRAEES4otZcgYhA+bZfqjBAEoQVIjBBEjGIwGJCcnEwVWAmCUB0SIwQRw+h0OiQlJak9DIIgYhyKGYlA/vlPYOTIi/8lCIIgiEiHxEgE8s47wDffAO++q/ZICIIgCEI+JEYikL/+1fO/WuS73/0udDodRo4cif7+frWHQxAEQWgYEiMRRnMzcOTIxf+3WrXpqrHb7diwYQN0Oh2++eYbfPjhh2oPiSAIgtAwJEYijA0bAL5elV5/8W+t8e6776Krqws//vGPodPp8Oc//1ntIREEQRAahsRIhPHXvwJO58X/dzq16ar585//jMTERDzxxBO4+uqrsWXLFvzrX/8CAHz55ZfQ6/WYM2eO39d2d3cjNTUVl19+ucfjvb29ePnllzFt2jSkpKTAZDKhsLAQ77//vs85li1bBp1Oh+PHj+OVV15BTk4OkpKSsGzZMgDAV199haeeegozZ87EiBEjkJSUhMzMTDz00EM4ffq033HZbDbcdtttSEtLw6BBgzB79mzs3LkTK1asgE6nQ01Njc9rdu7cidLSUgwbNgxJSUkYP348fv7zn6Orq0vE3VQGjuPQ09ODrq4u9PT0UEdegiA0RVSn9m7atAm/+93vcPDgQXR1dWHkyJGYOXMmnn/+eYwZM0bt4fmluxs4eBDwt1a0tQGff+752KFDwObNQFqa7/E6HTBtGpCcHJqx+qOhoQH79u3DrbfeirS0NHz3u9/FJ598grVr1+InP/kJLrvsMhQWFqKmpganTp3C6NGjPV7/3nvvwW6345FHHnE91tPTg3nz5qGmpgZXXnkl7rvvPvT19eHDDz/EzTffjNWrV+M///M/fcayfPly1NfX44YbbsCNN96ISy65BMBFkfDSSy9hzpw5yM/PR0JCAj799FP8/ve/x7Zt23Dw4EGkpqa6znPq1CkUFBTgX//6FxYsWIApU6agubkZxcXFuO666/zehz/84Q946KGHMGTIEJSWlmL48OHYt28fnn32WXz88cf4+OOPw1Zu3eFwUHEzgiC0DReFOJ1O7nvf+x4HgBs3bhz30EMPcY8//ji3ZMkSLiMjg6utrWU+V3t7OweAa29vD3qcw+HgDh8+zDkcDllj/+1vOe6iFPH/T68P/rf3v9/+VtZwRFNeXs4B4DZu3MhxHMedP3+eS05O5saPH+865k9/+hMHgHv++ed9Xn/jjTdyALijR4+6HvvpT3/KAeBWrFjBOZ1O1+N2u52bMWMGl5iYyJ06dcr1+NKlSzkAXHp6Ovfll1/6XOObb77hOjo6fB5fu3YtB4B75plnPB6/++67OQDcCy+84PH4mjVrOAAcAO7jjz92Pd7U1MTFx8dzV155Jfftt996vGblypUcAO7FF1/0uX4o6Orq4k6dOhXwX1dXV1jGoTRK/d4ihYGBAe7EiRPc559/zp04cYIbGBhQe0gEwQTrGhqVYmTVqlUcAO7hhx/m+vv7fZ7v6+tjPle4xYjDwXH/+Z8XhYROF1xoBPrHv2758ovnCxc9PT3c0KFDuSFDhnA9PT2ux2+77TYOALdjxw6O4y4KlKSkJO6KK67weP2ZM2e4hIQEbubMma7HBgYGuCFDhnCXX365hxDhef/99zkA3OrVq12P8WJk1apVosbvdDo5s9nMFRUVuR7r7u7mkpKSuEsuucTjPfHHT5w40UeM/PCHP+QA+BW9AwMD3PDhw7np06eLGpsUnE4n9/XXXwcVI19//bXf+6p1YkmMHD58mHv55Ze5FStWuP69/PLL3OHDh9UeGkEIwrqGRp2bxuFw4Omnn0ZWVhZeffVVv91J4+O1+7aTk4HVq4G5c4GlS4ELFwAxmbHx8cCgQcCbbwKlpaEbpz8qKyvx7bff4sEHH/RwQXz3u9/FX//6V7z++uu49tprkZqaitLSUlRUVKChoQGTJ08GAPzlL39BX18flixZ4nptc3Mzzp07h1GjRuHpp5/2ueaZM2cAAEf4FCM38vLyAo5148aN+OMf/4iDBw/i3LlzHi6Mr776yuP6PT09mDFjho9bRafTYdasWT7Xrq+vBwBUVVXh73//u8+1ExIS/I5Xafgy78EYGBhAb28vVWHVKFarFevXr/d53G63Y/369Vi8eDEsFosKIyMIZdHuqiyR7du3o62tDcuWLcPAwADef/99/POf/8TgwYNx/fXX+wRGetPT04Oenh7X33a7PdRD9stNNwGNjcAddwC1teyvKyi4WBTNKxQjLLz++usA4CEmAKCkpAQjR47E3/72N/z2t7+F2WzGkiVLUFFRgbfffhu/+c1vAADr1q1DQkICbrvtNtdr29raAABNTU1oamoKeO3Ozk6fx/gYEW9eeuklPPbYYxg+fDiKi4uRnp7uip149dVX/X7+w4cP93suf9fgx/zss88GHG84EBIiPN3d3SRGNIjT6URVVVXQY6qqqpCdnQ29nnIRiMgm6sTI/v37AVy0fvCBhjx6vR6PPPIIXnzxxYCvX7lypd8duBqMHg18/DHw3HPAz3/uP6iVR6cDnnkGePzxf6f+hpOTJ09i+/btAICrr7464HF/+ctf8L3vfQ/z58/HsGHD8M4772DlypU4duwY9uzZg5tvvhlDhw51Hc+3ul+0aBEqKipEjclfw7f+/n786le/wqhRo/DZZ595iAyO4/D88897HM9fn7fAePPNN9/4PMa/xm63w2QyiRqzkvizCvrD4XDAbDZTgzyN0dLSIrgZstvtaGlpQWZmZngGRRAhIurkNJ+a+dJLL8FsNmPv3r3o6OjAzp07MWHCBLz00kv4/e9/H/D1TzzxBNrb213/Tp48Ga6h+yUuDrj/frZjH3hAHSECAGvWrIHT6cQ111yD++67z+cfby3ha44kJCRg8eLFOHnyJHbs2IF169YBAO6++26P81osFpjNZuzfvx99fX2yx3n27Fm0t7dj5syZPtaO/fv3w+FweDyWnZ2NpKQkHDhwAL29vR7PcRzncsm4k5+fDwB+nwsniYmJTDtmp9Pp894I9eno6FD0OILQMlEnRpz/V4QjMTERlZWVuOqqqzBo0CAUFhaioqICer0eL730UsDXJyUlwWw2e/xTm8pKZY9TGo7jsGbNGuh0Orz55pt47bXXfP69+eabuPLKK7F37140NjYC+Lc7Z926dXj77bcxePBglHoFusTHx+MHP/gBvvzySzz22GN+BUljY2PA+iDejBgxAgaDwZXuzXPu3DksX77c5/ikpCSUlZXh66+/xm9/+1uP5958801YrVaf1zz00EOIj4/H8uXL/YrZ8+fP49NPP2Uarxx0Oh1z6i6rS4cIH6xWNTWtbwShFFEnRvj6EDNmzMCoUaM8nsvJyUFWVhaOHTuG8+fPqzA6afztbxfdMDx8/K17HK5eD/iJcwsL//jHP2Cz2VBUVISxY8cGPO6ee+4B8G/ryMyZMzF+/Hi8+eab+OKLL/Cd73zHb+zC008/jblz5+K3v/0tLBYL7rvvPvzkJz/BkiVLMHXqVEyePBnHjx9nGqter8dDDz0Em82GKVOm4NFHH8X999+P3Nxc6PV6n+8McNF1d8kll+D//b//hxtuuAE/+9nPUFZWhu9///uYN2+e67w8ubm5+N3vfocvvvgC2dnZKCsrw+OPP44f/OAHrviZP/7xj0zjlUsyY5EZVpcOET4yMjIEN0NmsxkZGRlhGhFBhI6oEyPZ2dkAgMGDB/t9nn/c2xyvVdraLsaN8FVX9XrAYgE++ADIzr74NwAMDFw87ty58I+RFxf33ntv0OPuvPNOJCYmYt26dS63wN133+2ydni7aHiSkpKwdetW/PGPf8TIkSNRUVGBV199FTt37sSll16K3//+966MHBZWrlyJZ599FjqdDr/73e+wfft23H777aiurkZCQoLP8WPGjEFdXR2+853vYNeuXXj11Vdx+vRpVFdXuwKivReNBx54AHV1dbj55ptRV1eHV155BRUVFTh79iweeeQR/OhHP2IerxwSExMFhUZcXFzYCrAR7Oj1epfYDcS8efMoeJWICnQcF111oY8dO4bLL78cl19+OY4ePerxXF9fH0aMGIG+vj6cP3+eKcXXbrcjNTUV7e3tQXcp3d3dOHHiBMaOHcu8G2XhjTeAe+65aBnhOKC8/GJAa1LSxWqtP/kJsGrVv59/442LKcFEeLjmmmtQV1eH9vZ2DBo0SO3h+MXhcOBcEJU6ZMiQiKvEGqrfmxaxWq2oqqryCGY1m82YN28epfUSmod1DY26bJpx48ahuLgY1dXVeO2113C/W/Tnb37zG5w/fx533323pmuNuPO3v1387+DBwFtvATfc8O/nkpOBV18Frr8e+O53L1pF/vY3EiOh4F//+hcuvfRSj8fefvtt7Nq1C8XFxZoVIgBcQoNKwkcmFosF2dnZaGlpQUdHB0wmEzIyMsgiQkQVUWcZAS5aRwoKCnD69GnccMMNmDhxIj799FN89NFHuOyyy1BfX4+RI0cynUtty8hllwFZWRdrh3ithR589RVw552AzXbxH6EsQ4cOxZVXXolJkyYhLi4On332GWpqamAymbBr1y5RbiK14DjOVQiNd80IpfNKeU04iCXLCEFEMjFrGQEuWkf279+PJ598ElVVVaiursbIkSPx8MMP48knn8SIESPUHiIzTU1ASopnAKs/Ro26GDPip/ZXTBGqxfPBBx/E5s2bsX//fnR2dmL48OG488478Ytf/AITJ05UYOShR6fTiSpuRg32CIIIF1FpGVEStS0jBDu0eCqH1uNM6PdGEJEB6xpKTkciKuAXT+96GQMDAzh37lzEZE9pAY7jmCp/0j6GIAilIDFCRDy0eCqLmAZ7BEEQShCVMSNqQgte+KHutMrCWo1Vzaqt9DuTh9PppOwcQlOQGFEIvrBUX18fxSeEmUhYPCMJ1mqsalZt5QvlRVrlWC2IAKpbQmgREiMKkZCQgKSkJLS3t8NkMmki/TFWiITFM5Lgq7YGE29qVm3lOA7t7e1ISkryWzFXq2hBBFitVqz30zfCbrdj/fr1WLx4MQkSQhVIjCjIsGHDcOrUKbS2tiI1NRUJCQkkSsIAx3FwOp2uJon+0Ov1cDqd6O7uDuPIIpekpKSgcThGoxE9PT1hHNHFz7mvrw/t7e24cOECRo8eHdbry0ELIsDpdKKqqiroMVVVVcjOziaXDRF2SIwoCJ+2dPbsWZw6dUrl0cQWfX196AxSZCUlJYVarYukr68PDofDQ+Tp9XoYDIag9zrUJCUlYfTo0T5pgoFcIGq7RrQiAlpaWpgCvVtaWpCZmRmycRCEP0iMKIzZbIbZbEZfXx/FKISZY8eOoba2FhcuXHA9NmjQIBQWFmLcuHEqjixycTqd+Ne//oXOzk6kpKTg0ksvVXXXHBcX59c1E8gFkpubi8bGRo/HTSYTpk+fjrS0tLCIE7VFAC/GDh8+zHQ8iXZCDUiMhIiEhISI8mdHAzk5ObBYLKoHCEYbWhdywVwgu3fv9nm8o6MDNTU1rr9DHbfBuriHQgT4E2lCmEwmxcdBEEKQGCGiCr1eTybmGILFBSJEqOM2WBd3pUVAIJEWDLPZjIyMDKZj1XZ/EdEFiRGCICIWFhcIK6GK28jIyIDZbA46TjEigAWpIm3evHlM718LmUFEdEEyliAIZpxOJ2w2GxoaGmCz2YJmMIUDJV0bfNyG0uj1esybNy/oMawigBWxIs1gMDBbhniLi/f5eQuT1WoVPV6CIMsIQRBMhGI3LNfUr7RrI1TBmxaLBYsXLw6bNUHs+4iPj0d2drbgcVrJDCKiDxIjBEEIEoo6GUqIGxYXiBhCGbxpsViQnZ0dsjgLd2EnNvW6o6ODKZtH7cwgInohMUIQRFBCsRtWStzwLhCxgZr+UDpuwx+hCrD2J+x0Op2oHj4s1hQ1M4OI6IbsaAShAbQWi+GOmN0wC6zixvseBLpHvAvEuwia2WxGQUGBz+OBUDpuI1wEiuEQ20yQxSqkVmYQEf2QZYQgVEbrmQlK74almPqF7lEwF8icOXNcj7e1teHAgQMeY9XSvRYLi7BjsZCwWoXUyAwiYgMSIwShIlroWSKE0rthseKG9R4FcoF4P15YWBg19TFYhB3HcZgyZQoOHToU8BhWqxCLWyxSLUyEutA3hiBUQqq7wv314XDt8LvhYIjZDYsRN3LvkT94cTJ58mRkZmZG9MLJKuzGjRsX0JUlVvAGc4tpQTwTkQlZRghCJeRkJoTTtaP0bliMqZ+yNzzxToVOSUlhep3JZEJmZqZi2TyhzgwiYg8SIwShElJjMdRw7ShZJ0OMuGlubmY6Zyxkb/gToCaTCQaDAQ6HI+Dr3K1WSmbzUOsFQklIjBCESkiJxVCz6JSSu2EWcWO1WlFfX890vmjP3ggkQFlEGF/91WazkRWD0CwkRghCJaRkJqjttuB3w7y7oKmpSfLiFkzciOmtovXsDblVZlnuhcFgQHx8vN8sIQBYtWqVZrO1CAIgMUIQqiElFkMLRaeUjFcJZOoX01tFy9kbStwrlnvhcDiwZMkS6PV6D9HT3Nys+WwtggAom4YgVEVsZoLaRafC1SSNVUzl5+drdjFV6l6x3ovOzk6PLCEAimciEUSoIMsIQaiMmFgMNYtOhTNehVVMTZw4UdZ1QoVS98rpdDL3mfG+ZzabjTKRiIiBxAhBaADWzAQ1i06FM14l0it9KnGv/Ll4AuF9L6xWKzZv3sw01ljIRCK0D7lpCCLCUKvoVDjjVXjRFQy1YkVYis1JvVf8ubdt2+bXxROI3Nxc173g3UPB0n3difZMJCIyIMsIQSiI3MwJVtQoOhXueBUla5soBWtAqpR7JcYS4k1jYyPmzJkDQDhOxB0tW5eI2ILECEEoRLgb3oW76BSL64Qv4f7555+jq6sLRqPRteCJFUpOpxMGgwFz5syRfS4lEFNsjtXNlJ6eDpvNhubmZuaaKv5w75osRsxoOROJiC1IjBCEAkRCwzspeFt6iouLUVFREfD4/v5+vPXWWz6PixVlwYSdWq4ZMQGpLLE9ubm5WL16tSRLiD/EuMcMBgNKS0sj8jtJRCckRghCJmpVRQ21SyiQICgoKEBjY6PH44mJiejt7Q0YpyBGlGlR2EkJSA3mZsrNzcXu3bsVHaMY91hZWRmysrIUvT5ByIHECEHIRI2qqKF2CQUTBLt370ZZWRnOnj2LPXv2wOFwoLe3l+m8QqJMzXL3wZAakOovtic9PR2rV69WdHzusR8s7iFK5SW0BjkLCUIm4a6KGurCYyyC4MMPP0RNTQ1zxgaPe2yDP8QIOzmwZMS4Iyd4l4/t4YuRtba2Kuaa4eHdV1rOQiKIYJBlhCBkEs4sk3BYDljLj0slmCgLh7CTYlVSsu6JHCGi0+nAcZzHNb3HrcUsJIIQgsQIQcgknAW6wuESCnURLD7jxl+8S6iFndR4FCWLzXV1dYkb9P9RUlKCGTNmoLW1VTBOSI3UbyHClfZORCYkRghCJuGsihoOy0Eoi2CZzWZ0dnYG7CKbnZ0dMmEn16qklMXBaDSKG/j/XSMvL09UOne4U7+DEe60dyLyIDFCEAoQLtN4OFxCLJYeqeTm5vpNDXa3TIRK2ClhVVLC4uBdOZcFNeM85Fo0tJgdRWgPEiMEoRDhMI2HwyXEYukxGAyi4kbMZjOKi4tRXV0d9LiqqiqUl5eHRNgpZVWSa3EQI/bUth7ItWhoNTuK0B4kRghCQUJtGg+XS0jI0gMg6Bjy8/MxePBgj6qpYiwToRB24S5nHwiWz3DmzJnIzs5WNa5CCYuGGmnvRGRCYoQgIgi+RPrMmTNdJdd5lN5FCwkCsdYLsZYJpYWdWp2A/bk5tJ7xopRFI9xp70TkQmKEICIEfyZzo9GIyZMnY+LEiSHZRQcTBGKtF2pbJsIZaMwj5ObQWsYLj1IWDbU/cyJyUP9bHwIyMzOh0+n8/nvwwQfVHh5BiCZQobOuri5XFVQ1FjHvgl7BxsBbJoIh1jIhtngZb5HwHofZbFY8kJKlOJ2Y+xdOlLJoaOEzJyKDqLWMpKam4kc/+pHP4zNmzAj/YAhCBtESBCjXMuHt7ujs7ER1dbVoN0c4LBJKfmZq1OdISUlhOk7IoqG0NYpShKOXqBUjgwcPxooVK9QeBkH4IHZxiYYgQP499/f3o6ioCAcOHPDYVQstKP4WIX+wBleGOtBYqc9MjcXXarVi69atgsexWjSUio+hFOHoJmrFCEFoESmLS6QHAfp7zyaTCUVFRUhLSxMUZIEWoWCobSlS4jMTWnzLysqQkpKiqMVEzL0WY9GQa42KFusgEZioFSM9PT1Yu3YtTp06hSFDhqCgoABTpkxRe1hEDCN1ZxfJQYCB3nNHRwdqamqwePHioJYBlkXIH2pbiuR+Zizve8OGDYJ9asTAeq+lXkeONSoarINEcKJWjHz99ddYtmyZx2Pz5s3DW2+9hWHDhgV8XU9PD3p6elx/h6IKJaENwumLl7Ozk5uSqlZPECV2syyLUCDcrQ7hvgdyPzOW9+0uRAD57grWe33zzTcjKytL9PnlEOnWQUKYqBQj9957L2bPno2cnBwkJSXh8OHDePrpp7F161bcdNNN2LVrF3Q6nd/Xrly5Ek8//XSYR0yEm3D74uXs7OQEATY1NWHLli0hrUcSCCV2s0r02FEj7kJu4Kac9y3VXcF6zc7OTinDkkUkWwcJNqLSufbkk09i9uzZGDZsGEwmE/Lz8/HBBx/gmmuuQV1dHbZs2RLwtU888QTa29td/06ePBnGkUc/WkjLY0m5VBq5OzspKanbt29HRUWFT5fYUL5P7+uw0N7eHvA5qYsLb3VQ47PmkZNGLGdR5QWeWLS84IciRZjQFlFpGfGHXq/HPffcg08++QS7du3CDTfc4Pe4pKQkJCUlhXl0sYEW0vJYXAebN29WPBBOiYleTBBgU1MTdu/eHfRaoQ748xZBgdi6dSsSExNhsVh83Cnp6ekwmUyiLQV8yXq1gx6lBm5mZGRIet88Ul6nVoVaFtQoWEeEl5gRIwBcsSKskyShHFpJy7PZbII7dofDgdraWsyePVux6yo10bMEATqdzqDWPx7WgD+p8RZGo1HwGOBinNb69etRUFCAxsZGj3tkMBgwMDDAdB7AU9yyfNb+7oHS8SVSAjebm5vR398v+ZpSrBdaX/C1XkKfkEdMiZE9e/YAAEVbhxmtpOVZrVZs3ryZ6dg9e/agsLBQsfEoMdGzLpItLS3MgltoBy3HmjVo0CCmMfD4s+QE6wxsMBhwww03BExvleIa04L1TkoqszsGg0Gy9ULrC76WS+gT8og6MXL48GGMGjUKgwcP9nj8k08+wcsvv4ykpCQsXLhQncHFKFpIyxM7wTscDsXHI2eiF7NIijHRB9tBa8WaFYj4+HhYLBbFeuHIfb+BxKIYS4vUVGZ3HA4HmpubJX82Wl/wQ12wjlCHqBMj69evx/PPP485c+YgMzMTSUlJaGxsRHV1NfR6Pf7whz9QkFOYUTstT+oEH4rxSJnoxS6SrIuw0WgMmg4s15p14cIFpnFIpaOjAzt37kRRUZHf58W4xuS+30BiMTc318f1FEx8ykllZh0rC94LPh94rkVxEmmolWqvdaJOjFx33XWwWq04ePAgduzYge7ublxyySW47bbb8MgjjyAvL0/tIcYcakfpS53gQ9k9lnVnJ2WRZFmEAWDBggUBd+5KWLPCEZu1Y8cO9PX1Ye7cuX6fnzZtGmpqagK+nneNSY0vAYKLRX+up2CWFqUEsJKWRi24rqIFupeBiToxMnv2bEUDDwn5qB2lL2WCD9V4wtGXhiU+paCgADk5OQEnx0mTJjG9n2D3ljWAVS67d+/GqFGjkJOT43pMqJeN9wIg1Xonx63iz3qhpABWQtgo7aqLZauA1t2eahN1YoTQHmpH6UuZ4EMxHjG7In7SPnz4MNO5vRcei8WCsrIyn4JnRqMRCxYscAmRQJNjfX0903WD3VuhuhBK8uGHH7riR4Tig4qKinyCk6Va7+S4VfxZL1itWizIFTZKB57HslVAK0H8WiY23zURduQUgJILS8GkUI9HTPEtq9WKVatWYe3atdi3bx/T+b0XHqvViurq6oBCRIlASZ1Oh/T09IDPs953k8mEgoICWWPh07FZ3tfBgwd9HuPregTDn7VMrvXB+/W8cJeLEpY9MVY5IdQsPqcFlLyX0QpZRoiwoVaUPotlZubMmcjOzg7JeMTsipqbm0WndXovPIEsA11dXaioqIBer4fBYJC9++Y4Dq2trQHjEljuu7uVIjExMWh8hxD8a6XEfrDU9fBnLZNrffD3+kBZVwaDIWiqs9BYvRFymSgVeE5WAfWD+CMBEiNEWFErLU/N+gmsuyKbzSbJWuG+8LBO/HPmzBF9HX8ITZ5i7nthYSEOHDgga0LmawkJYbfbcfz4cZw4cQItLS1Bd6TJycmYOXMm+vv7YbPZPBZtOW6VYNYLb+GekpKCyspKpnOyfJ9ZXCZKBZ5rIbVfbdQO4o8ESIwQMYMSlhkpAXisiytLRoc7/hYe1olfqUwXlsmT9b7r9XrMnz9fVsEvVsvBli1bPLpzB6Onp8fDYuN+31msP4EQsl7wwt3pdGLv3r1M3yOWjrqsgZRKBZ6TVUD9IP5IgMQIEVPIscxIDcBTerdz1VVXYdKkSX4XdDGdVxMTE9Hb2xvwGJ1O59Om3h0xkyfrfQ9kSYmLi2MuC8/izmAVIgB87oH3oh3M+iO2zog3QllB3ly4cMElaru6umA0Gl2fE5/GLcZlwhp4Hkykk1VA/SD+SIDECEEwICctLyMjQ3CBNBgMyMzMRG1treBYJk2aFHBhZ53QP/nkE6brNDU1BXxezuQZbPEKZEnZsWMHdu7cKXju/Px8WbEnrLgv2sGsP9dddx3279+PtrY2pKWlYcaMGYiPF556pZSF37Ztm1+rFy+AWGKF3F0mLG42IZFOVoGLaL3UvtqQGCEIAcIRgMdxnCKTtpKpoYGEiL/JU4z7isXC5M+SMnv2bHz66adBrT9msxmFhYUYMWKEzzWMRqOihdj81XfxVxDNexx1dXWCi4/UbKdA748Xzfn5+Uzncb/HwYQWq0gvLi5GRUVFwOvFilVA66X21YTECEEIIDcAr6WlRdBt0N3djV27dsk25er1euTm5vqt/KkE/mp0iHFfybEw6fV6lJSUBF3UiouL0dLSgv7+ftx8880ALrqkTCYT7HY7Nm3aJOr9ChFMGMl5r0qVhffms88+YzrO28LmT2ixinSn04nq6mq/z0ebVYBFlFNvHf+QGCEIAeQG4LG+vqamBgUFBX5dOgaDAaWlpYKTdlNTU8iECHCxRkdhYaHrb5YFl98J2u12bNu2Lej5hfq/BFvUcnNzUV1d7VcUZWZmwmazMb5Ldvy5xfg+LkIdooO911AFc7LEyrC6TFhFupB4jBYhEstF3ZSAxAhBCCA3AE9MYF4gIcGSJdLU1IQNGzYwX0sK7hYglp3x5s2bsXXrVubFVWz/F56cnBzBPjBOp1MwKFcM/hZtMQGnwaxpagZzsrpMlBBM1dXVQTsvRwpU6l0+kf0NIIgwwFJJNNhuUkwF2GDwJm9/WK1WVFRUKLbQBuPIkSOudFOhRdfhcIhetKT0fxEqX79582bR98dgMAR93nvRDlRlNBjHjx/3+5kq9Z0Rg9jqw21tbbKvGQ1VR8W4q4jAkBghCAFYSnQH200qVeI70MStRGl3MezZswcvvviioMtFKp2dnR4TN4s7QEhksNYf8X5NUVERUwsDqZ9BbW0tVq1a5VMOXanvDAuFhYVYunQpysvLmYWI1WpVLGMp0uuLUKl3ZSA3DUEwIDctz2KxoKioSPYE7m/iDlWwYzCkLO6sbNu2zSPjRM3FKi0tDeXl5YJBiXIb5rmb8vkgyP7+fkydOpU56FQqw4cPFxVQqbT4jfT6IlTUTRlIjBAEI3LT8pQod+5v4hZzvuTkZCQkJGh+YnRfoNVcrEwmE1P2gxL30z3zJJzikuX+umeJdHZ2Mo2PT8WO9voiVNRNGUiMEIQI5KTlyS13HmjiFjvJXXnllThz5kxEdEr94IMPUFxcLFgjRMnAVB4xC6USC41Q5gkrRUVFGDJkCC5cuIDa2lp0d3cHPJblPYqtAsszdOjQmKg6SkXdlCGyvwUEEWHw7h5/cQgFBQVBXxto4hYT7Njd3Y2dO3dqQogkJycLHtPV1YXKykrBYmUzZ84M+rxQMKo/xCyUnZ2dos8vFp1OF/RvPpZl9uzZuOKKK1BQUICbbrop6Dn5uiwNDQ2w2Ww+QZZSgnJ5TCZT0O97tGSYyI0pIy6i48IRfh/B2O12pKamor29PezR7UTokNLwLhzXl1qrQErpcLXJz89n7rIbCJPJhMmTJ/v0f+Exm80oLi7G2bNnmeN1xNSG4GuKVFRUhDSOhqekpAQpKSkwmUxIT09Ha2ur4Hc40HdKqG+O0+nEqlWrJHckLi8v9+gmHe1VR6nOiH9Y11ASIwKQGIk+tD5pSJ24pZrT1cBgMKCsrAxvvfWW7PMEEwGzZs1CU1MT0z3hx5SZmanZ+71w4UJMnjxZ9Ou8v1OdnZ1BXUKLFy+GwWDA2rVrJY0zWqweYokF0SUW1jWUYkaImCISihNJjUvhA2xramqYGu6pCS8g5PbREbJG1NXViTqXXq9nFiJqWKICVXwVswA6nU6mSrhz5swRPT4tiXo1oFLv0iExQsQM4Wh4pzb8ZKh1MQJcjLMQCnAMNx0dHYKLu9PpFCz1HoyEhAT09fW5/uZdSUJZNKwVX70FgRQLjt1uZ24q6O46IksAIRUSI0TMILfhXSwSiiwVHpPJhMzMTL/1W9Sira3NJ07Ce3Gvra2VFR8SHx+P22+/3dXAj1/A9Xq9qMwTFisfAMli79y5c4JuMLPZjLy8PBIghGxIjBAxQ6wUJ5KT2WE2mzFt2jSkpaWhs7MzZFVW+UUYgCtYUom0VjkYDAa/Qa7eTf/kBt3y7iDv2A8xhfVYrHzvv/++LJHw6aefelhw/CGUJUIxFAQrJEaImEGLxYlCMVlLGf/48eNRUFDgkaHBaqYX2j37Y/r06R6ZFoG68WqJqqoqJCUlKZI1E0jwshbWY7HyBasvwoKQEDEYDMjOzg74vNYDxQltQWKEiBm0Vpwo2GQtp9Iry/v05ptvvkFnZydWr14t2l1SVlYGvV6Pjo4OnDlzhileJS0tzfX/apSzdyc5ORmjR4/GsWPHgh5nt9sV68cSTDC6B0EGEqtasN45HI6ALs1ICBQntAWJESJm4IsTaaEipNBk7W1tCGSqt9lssNlsAIDMzExXWqrYwFCp1T/NZrNHKqzNZmMSI+6LsVpCJDExEb29veju7hYUIjwnT56UfV1WwRtMrGqltLg/URQLgeKE8pAYIWIC9+ZjRUVFPj1iWMzHUlIo/R3PMll7uwK8d5RWqxWbN2/2OK62thYGgwGlpaWKNeYTwlu8paenCwa96nQ6pKenA7i44IYqLkWI3t5eVa5bXFwsuAgLidWysjLZadFKwIsisb1rKFCc8IbECBH1+NthmkwmFBUVIS0tjUlY+DuH0WjEggULkJOTw3z8FVdcgdTUVMmLCN9MLZAVw+FwuESLuyskFPgr597a2iqYfcNxHFpbW11jjVYC9dOprq6GXq8PKHxZxGp1dTWKi4tVDfrlLTxSi78dPnwYACiolQBAvWmIKCdQb42Ojg7U1NQgPj5esOJmoHN0dXWhoqIC27dvZz6+vr5eliXAbrdjy5Ytgsdt3boVKSkpkq/DQnd3N9avX+/R54Y1lsFutyvahl5rmM1mzJ8/3+9zvHXDarW6XG3uvWFYU9BTUlL89n0JF7m5uWhubpbcu2bfvn1Yu3YtVq1aFbBXkr/7Q0QnZBkhohaWHebWrVuRlJTkU/NBzDl2796NUaNGIScnh+l4ubBkufCiIBymfHf/P2ssQ1dXl+ouhlDCFzELxubNm7F161Yfd+GkSZOYrtHR0YHJkycjOzs7rP1xeBoaGtDQ0CD7PIGCWqVm41A6cWRCYoSIWlh2mB0dHR79UbwnO9ZMj82bN2NgYEBTi2xnZydyc3Oxe/fugMcYDAbccMMNgtU/g+Hu/2fNWDIajZKupXX4aqodHR2C99OfcLDb7aivr2e6VltbG4CLgdlZWVkoLS0Nq9tL6Ywed1ErNRuH0okjF5KLRNQiZbJ0N6GLOUdPTw82bdoU8mBMMYt4W1tbUCGSk5ODxx57DDk5OYIt0IXg7xNrO/VobDpZVFTksojI/R7odDrBY/bs2YP+/n7X33zRNO97azabUVBQwPzdKSoqgsFgEDdgBeBFLWs2jrfLJpB71Ps3TWgTEiNE1CIn/ZGf7LSSQsmzYMECpjENGjQIBw4cCHqMe5pqoIWMFfcxBVsUi4qK0N/fL/neGgwGFBQUqLJYBsNgMKC3txcVFRWKWMZYSvA7HA688sorHousxWJBeXk5li5diltvvRUlJSWYM2cOxo8fj/LyckFBYjabUVhYiLKyMtnvQQrHjx9HTU0NczYOj1QBQ2gHctMQUYuU4l88/GSXkZERMCsinLibmoV6mADAjBkzBNN6vdMr+eqftbW1qK+vZ67g6a9uhncl0ba2Nhw4cMBjTImJiUzn50lKSsINN9yAnJwcXHfddXjxxRfR09Mj6hyhwuFwBLVChYquri4ft4Ver4fD4cA//vEPH3fF1KlTg46TT9XOzMwU/O3wYlJJd42YBo/u16W+U5EPWUaIqIXFZRCMjo4O6PV6LFiwQMFRiaewsBDl5eWuxYa3PPizDhgMBlFpvd4LSXNzM2pqakSVEg9UKI5f1OLj41FTU+NzLbF1Pnp6elBRUQGr1epqLBcuMjIycPXVV2vOIsPjvusP5q7YvXs3CgoK/FqtvAWN0G9n/vz5ATOGwoG7ZS1W+k5FM2QZIaIai8WCsrIybNiwQXT3WX6yy8nJwVdffaXKzheA39Rj3vIQqAIr/5gQ7um/YjOBWDMblM4uUrJHDAszZ85ESUkJbDYbdu3aFZZrAuJ6/rhb8oTud2NjI5YvX+7qQRQo44S1cZ8aXZe9rXGh6jtFmTnhg8QIEfWkpKSIFiLek93cuXMxatQobNmyRRGXjclkwrRp07B3717BBedvf/sbZs6cicLCQo+JkM+iyMrK8nkNq4uqsrIS8+fPR3Z2Nvbu3cu0oFxzzTUYN24c08Qcir4zdrsdn332maLnDAbfDK65uTls1wSAK664QlSHYF6QsLgrWltbkZGR4VpoeSETSPQGW5Ddjzl8+DD27dsn7o1KwNsaF4q+U5SZE15IjBBRjxTTbHFxsc8EnJOTA4vF4prwt23bJkmYTJ06FceOHcOOHTuYju/u7kZNTQ327NnjKvXuD+9dHEuFzo6ODqxfv97Vp4WFESNGMPvdjxw5wnScWJSob8ECv4A5nU58/vnnYbkmz8SJE3HZZZfhvffeY4qN6erqYsrCAS5+Lps2bWJaaN0b9wXC/ZhQipFgY1Sy7xQ1+gs/JEaIqEeMadZsNiMnJ8fHAuI+CfKTbkJCgui6DgaDQfKuni+f7q+Mvb9dnJj4BjHxGyaTicl87XQ6wyYaQgUfN7F3796wBjHrdDp0dnYiJycHvb29qKysFHyN0Whk/q77s7gosdDKCRoPhsViQV5eXlBrHKtbSQhq9KcOJEaIqIdlgjQYDCgrK8MXX3yBuro6n+fdG5SlpKS4FuGysjJZBcOk4J6RYjabAxY2C0VMhclkwokTJ7B+/XrBrsItLS2qZyHJYdasWQCAVatWhb2QHcdxqKiogF6vR2pqKtNr+HstFGsi1MhQzkIrpWM0C1arFZMnTxYcE4tbSQjKzFEHHSfWmR5j2O12pKamor29PSoLNcUKgcyuPIsXLw7agI7HeyI3Go2YP38+Bg0a5Jr8Ojs7fQSK2WzGtGnTQt5FN9QIuXPcd9UNDQ3YuHFjuIYWlZjNZixfvhyrV68OqyBaunSprIXWn6VOSAQJYTabUV5eHnJrBOv3duHChZg8eXJIxxINsK6hZBkhYgIhE252djZeeuklwfN4T6ZdXV3YsGEDCgoKMHfuXI/ree/OmpqalHtDYYbfbQu5c95//31XwGdnZ2c4hgZAWCRFKnywqRLWhoSEBFx++eVMlUjlpsD6s1B0dnbK6jIcLmtEqDJziOCQGCEiGjGpd8FMuDabTZZLYffu3ejv74fFYnGd03vSjNTJKyEhAXFxcUzHdnd344033kB7e3tYd/K33XYb9Hp92LI5/CEmFVcMfEM8uSm0fX19zCXRg31XWX9z/n4Der3e74bAYrEwZQ6Fo05IKDJzCGFiQow8//zzePzxxwEAdXV1mDlzpsojIpRASupdoMwAJSa5vXv3Yu/evR5jcJ+4DQZDyBasUNLX14e+vj7m493LzIcDPlC3o6MDgwcPZnpNYWEhAHEVPwNhMplcxb9C0aiOFwbutWVC2aE32EIrN9010IagpaWFSYyEQ9ArmZlDdUrYiXoxYrVa8eSTTyIlJSWsZmMitCideqfkJMePoaCgAI2NjZrp4hutOBwOj87LQvA9clpaWhQRI7fccour1ovSBcC8hQFfeTaUgjbQQqvUb87fhiCU1ggpgkCJzByqUyKOqBYjAwMDWLp0KaZMmYIJEyZg3bp1ag+JUIBQpN6FIiVRrYqtRHAmTZqElpYWpKenKxJr4r7J8d75d3R0YPv27ZLP7S4M+EX18OHDssYbiGALZajTXZWuE8IjRxDIycyhOiXiiWox8txzz+HQoUM4ePAgXnjhBbWHQ0jA364mFKl3oUpJjBYi0b0UiPr6etTX18NkMuHyyy+Xvbh7W9X4nb/VakV9fb3g6xMSEhAfHx80VdrfoqoEhYWFGDZsGLq6umA0GmEwGOB0On0W3HCkuypVJ4RHCUHAUvDNG6pTIo2oFSONjY14+umn8fOf/xw5OTlqD4eQQKBdDeukJDYOxGKxoKCggCwaXiQmJmLy5MnYu3ev2kNRlI6ODhw+fBjx8fHo7++XdA5eILvjdDpRW1vLnMZ96623BtyBiz2XWOLi4vx29/Ve/MPViE6JOiGAuoKA6pRIIyrFSH9/P5YtWwaLxYKf/OQnol7b09PjUXqZ/P3qEGxXw9qvQ0pTrMbGRlGvCTdqWCh6e3ujToi4w1pC3R/9/f1obm72sGBs3bqVaVHW6XSYOXMmDAYDmpqaYDKZkJOT4xIhO3bsQH19vagOymIwGAx+RY4/y0E4012lWCO8UVMQUAdhaUSlGPn1r3+NQ4cOYc+ePUhISBD12pUrV+Lpp58O0cgIFlh2NUIFlKQEu4WiqZvS3HDDDdi2bVvUTGRGoxG5ublobGxUrVprX18fLBYLjhw5IrooF1+if+bMmUhOThZlweA4DnV1dR4Vf/mKup9++qnqbjF3y0GkpbuqKQioTok0ok6MHDp0CM888wwee+wxTJs2TfTrn3jiCTz66KOuv+12O8aMGaPkEAkBWESB0KIhJdhNywu8u+n87NmzEVnJNT4+HtOmTcOQIUNgNBpdixe/E1YzXoe1/kYgWGJDWLDb7Yq6CWfNmoWmpiaP31NiYiLGjBmDY8eOCY6FtxyICTDVQjqrmoIg0oSbVog6MbJ06VKMGzcOK1askPT6pKQkJCUlKTsoQhSsomDmzJk4fPiwYqlzUicmb9dJsH4xYsnPz8fEiRM9JvS0tDTZ51WD/v5+7N2712/gYHZ2dlQFyWqFpqYmLF++HJWVla4KwL29vYJChId3W2ZkZDAFmGolnVVNQRCqzKBoJ+p607D6fzdt2oRbbrlF8DjqTRN+bDYb1q5dK3jc0qVLXdk1SuzCnE6nqKZo7qXk/Y1BKAOCf73T6QzaJZgfG3+NY8eO4dChQ5Leoxbw12OE9TMnxJOZmQmbzSbrHIEK+Xl/34X6P4VTkKg9Hq0IM7WJ2d409913n9/Hd+7ciaNHj+Kmm27C8OHDKYpZw4jZ1SgR7MbDsqMpKipCWlqaj/DxNwbvzICUlBQAF+tS8K9vbm5GdXW1hxAxGo0oLi4OeVqnWtjtdthsNuj1eteCFi3vTYvIFSKAb1Cr9/edNXtl/PjxaG1tDYsLR+lUYSnXVyIzKFaIOstIIJYtW4a1a9eKLgdPlhF1UHNXE64dDct7BEJTYlxtvF0yRqNRtQBWgp1AnXNZLVven3M4hIEWYlhimZi1jBDRQbh3Nd4T1vLly0O6g2PdSUbrXsE7NkQrQmTSpEkhq3AaDQRKh2WN8/L+nAMVIFNSQChpPSVCB4kRQrMEMnMCF3diSgmFYJaQyZMnexyr1CTJWgeBCC8nTpzAoEGDcOHCBbWHoln8fS95F6RU3NOIKdYiNokZN41UyE0TfoIt+EpPVGLcQUpc272/iFqt7ongJCQkiOpSLJUJEybg5MmTEZdBVFJS4uHqFlPoLRhLly5FZ2cnKioqAh5TVFSEwsJCcrNEEOSmISKSYAs+4D9+QmrzKTElo5ubm2VfO9oCUaOVcAiRq6++GpdccgkSExM1UfVXjAAzGo2u/xcS82KwWq2CAr2mpgYHDhzA/PnzyUoSZZAYITSDUGMrg8EQ9PVie02wukpsNpvsPhdSJm2z2Qyn00kugyhk165dag/Bg3HjxuHIkSNMx/K7WxYxD7C3MGBtOdDR0YH169eTlSTKoE+RUB2n04njx49j8+bNQY8TmtD44DpWWM3K+/fvZ+5z4Q/WSdub3NxcDAwMiH5dJCMkOINBxQqlc+TIEabWGe6FwljbJyxatEjQxS2lP1BNTQ1effVVNDU1wWazoaGhATabDU6nU/S5CPUhywihCFIDO5V2XYjxW7NWXGWtVmm1WuF0Ol11HTIzM5GZmSm6542SFVwjDTniy73BJSEeFjeNe8l3VktGV1eXYP0eqaGLHR0dPjEmFOwamZAYIWQjNbBTSX8zD4vA4IWT3W5HUlKS4CLW29vLdO29e/d6TNC1tbUwGAyYMmUK0+uvuuoqTJo0Cenp6Vi9ejXTa6KFxMREOJ1O5ntNhI7k5GTo9fqA9UCsVis2b97MHHhrMpmQmZkZMFV/0qRJivX2AaTHkBHqQmKEkIVQnEegCUGq6yIYLL0mpFpipPZNcTgczBPtxIkTXaW7Yy3IlUSILwaDAVdccQUGDx6Mb7/9Fvv37w/Ldbu7uzF37lx0d3cD+LeFj6Xkuzfuv8lAqfotLS2KihEesTFkhLqQGCEkIyYbxXtCEOu6AIQFgVDzKTmWmPz8fFmdcnU6naApurKyEvPnz0d/f7/k6xCRzZQpUzBu3DgfV6fNZhMtRuRUtd2+fbvr/w8dOuTqwSR2A+H9m/RXgIyl/YMUAhVoI7QJSUZCMqzZKP4CO6XUJCgtLcXixYt9guHMZrOgSVaOJcZsNqOwsBD5+fmSXg+w+cT5LIG2tjbJ1yHUgyUAVIjjx48jJyfHZYng4RdsVnQ6nSsdXi68lbO2tlaUYMjLy4PBYBAMLOV7QoUCubVPiPBBlhFCMqw/dH/HsQaPAr7xJ1KaT0mxxPDwu7uJEydiz549ks4hhoMHD8JkMtFEGmEoUZ+ko6PDtZv3DgovLi4OWhDMHY7j0NnZKXs87ogNqG5sbPSIoQoWR2axWFBUVCTL+ugPMfMMoS4kRgjJsP7Q/R3HYpo1GAwoKyvz2SVK6TUhZWH3njxDZU72xm63h2RiJkKP1Ngidzo6OvxWNTWZTJg1axYOHDjAFGOjtIVNbFwPax8ansLCQhw4cEAxEc4SQ0ZoB3LTEJJhMR0HmhBYTLOlpaXIyspSJACNdWIuKSnBwoULsXTpUpSXl3tMmqE0J3uTlpaGgoKCsFyLUA45rjyeY8eOYf369T6LckdHB+rq6phFQVpamuyxhIKqqiq/Lhu9Xo/58+crdh2hGDJCW9AnRUiGZXEONiHwnXmlxICIwel04sCBA4LHmc1m5OXlYfLkyT7WGKExK43RaNREmXCCHZPJhMLCQuZU7kAcOnRI9ljMZjNmzJgh+D1NSkrC1VdfjenTp8u+JivBCgQGmxOKiopw6623oqSkBLfeeiuWLl2KsrKykM8fRHggNw0hC37ykNpALlC6n5I7Gv7cQkybNo3puv7G3NnZiQ8//FCxpmenT5+OufTeSIdf0MeOHauIoJDDvHnzEB8fL1hsrKenR5XS9MF+j2LnBIvFEtL5gwgPJEYI2cgVFFJiQMTA6oMWY9b2N2aLxQKbzYYTJ05g7969smpnnDt3TvJrCXWoqanBrl27VC1HrtPpsGjRItcmgN8siClSFg6E4s3EzAmhnj/EIrUadaxDYoRQBK1NCO5ICbSVMqHo9XpXjMsnn3wia8xa9fcTwQlHx99gcByHlJQUn8e1JESiObBUajVqgsQIEaW4i4mUlBTBVFn3CVLuhCI3G4D399fV1ZGrhhCN+/cvFJWO5RKtgaVSq1ETFyExEmLIZBd+/IkJoW6w/AQpNKEUFRUhLS0t6Gcpt7YBq7+fIPzh/v2TU1/Hm8TERFmuR4PBgNLS0qhckOVUoyYuQmIkhJDJLvwEEhO8mdq7DoT758EyobjX/gj0WWZkZEgqxW0wGJCfn4/s7GwAgYODCSIQBoMBAwMDOH78ODo7O3HmzBnFzl1QUCCr9o2WXEVKI6YatVbd2WpDYiREkMku/LCICZ1Oh7vuugsOh8PHuiF2Fxnos9Tr9bjiiiuYmn+NHj0abW1tcDgccDgcqKmpwcGDB10iJzs7G0lJSbDZbDh27Bi++uor5vERsYfD4cC6desUPScvkq+++mrs2bNHlqiIVuuAnGrUxEVIjIQAMtmpA4uY6OrqwqZNm3DjjTe6OobyLjSp1oeqqiqMHz8era2trnONHz+eSYycOnXK5zFe5MyaNQtNTU1kFSFUISEhAX19fR4iOSsrC01NTZLPKdY6EClubjnVqImLkBgJAWSyUwfWXUdXVxfWr1/v47IxGo2Srmu32/HKK694uGWSk5Mlncuduro62ecgCKl4ZwbZ7XY0NTXJjh1h/Z0q4eYOl5hhaRURzVlESkBiJASQyU4dxO46vM3NUtut+3ttd3e35HPJQa/Xq1bnoqSkxJW51NnZiS1btsi6p4Q2iYuLk/V6lhR6Jdzc4YzZ46tRBws4nzZtmqLXjDZIjIQAMtmpQ7ga2WkZNQtupaSkYPLkya6/BwYGsGnTJtXGQ4QGh8OBoqIiHDx4UPRvjSWFvri4GNXV1UHPI+TmViNmTyjg3DsejPBEe863KEBOAzlCOko2spPqslETnU6n6vW9xXWo+/eoxezZs9UeguqkpaWhvLwcS5cuxcKFC5GTk8P0Ou8Ueu9F2263o6KigtnN7Q/WmL1QCHeLxYLy8nIUFRX5fZ4XQ1arVfFrRzokRkKA3AZyhHT43YlcMTFp0iRXQ65AE4vW4DhOtWubTCY4nU40NDTAZrPB6XSis7NTtfGECqPRiGuvvTbmOyqbTCZX1eX4+HimoFa+1o9ShdgCubnFxOyFioMHDwZ9PlRiKJIhN02IkNtAjpCOxWLB+PHjfYJKxbB//34A//68tF7vg898UIv+/n689dZbrr9NJhP6+/tVG0+oGD16NADEdEdlg8HgsuqKERYOh8NVOFCJ31EgNzdrLJ7dbofNZlM8uJUSGKRBYiSEhKMjLeGf+Ph43HjjjbIrmLr7mMvLy2Gz2VBRUaG5Ak5q90Txvh+sC0JhYSGysrJw4cIFbNiwIRRDU5RTp07BZrMpspgmJyejrKwMGzZs0Mz3KTk5GU6nkzlbRkqF1927d0sZmgfugsgb1li8bdu2eWxWlNooUgKDNGhVDDG8KXPy5MnIzMwkIRJGeOuUd+yCUGl4f/C7P71er5mFw2g0inovBoMBM2bMCOGIxDN8+HBkZmbKztAIF11dXfj0008VOddNN92EcePGobS0VJHzKYFOpxMUIg6Hw+XikLKgykkLZoElZg/wzYBTKp6DEhikQZYRIqoJZJ1qbm4W5Xbhzapa2s1MmzZNdHdg3v2kFb799lscP34cmzdvVnsozMh10XjvwHnRvHnzZtWFLuv1+d+BWgsqL4j8uTlY0myDIbcgJdUckQaJESLq4a1T7vAixWazYe/evWhubhY8D98BWAl0Op3sgFOx2TNqL3T+2Llzp6qBt+Fk/PjxKCgo8HHVOp1OnD59WpOfTyB4EaJmOn2wjUGgmD2WnlFy4zlYxBAlMPhCYoSIGbwLLHV2dqK6upp5IuUzRpRg1qxZsnznZrMZmZmZqK2tVWQ8ahErQgQAjh49iiuvvNJVmK6lpQVHjhzB559/rikhIrRgu+/q5Voh/J172rRpTA35hKwy/qyidrudqfaNXAsoJTCIh8QIERP4K7AkBn4CltOXgz8PPxklJiZK7oKam5uLzMzMmC/yFmls2rQJTqdTlAgON1OmTAnaisB7V69Ud+mSkhLk5eUBgGBBNVY3h7dV1GazMY1FCfcTJTCIg8QIEfUEqsYohuLiYuj1ekmTlHuZdPfJKC0tTfJ4GhsbMWfOHEV3pUTo6evrQ0VFhdrDCEpTUxPKysp8BBMvpHn3pvsC673wtrW1ie7w29bWhpaWFmRkZITMzRHueA5/LmLCPyRGiKhGqQJL1dXV0Ov1yM7OFmWNMJvNyMvL8ztxytl98X5tLQU/EtGB3W5HSkoKysvLXam7XV1dMBqNOH36NLZu3erhxnC39rkvvFdffbWoWj/79u3Dvn37gtb2kevmoHgO7aLjYslpKwG73Y7U1FS0t7dHbXnraMZms2Ht2rWKnW/x4sUAwGyNCNYDo7+/H7/+9a8lx00sXLjQ1Qvm+PHjHkXHCEIOhYWFGD58ONra2nDgwAGmGAp/33U5VsnFixfLcnME69grp4leuDoBRwusayhZRoioRulU3KqqKpSXlwv6yFkmttbWVlkBnEePHsWZM2eQmZmJjIwMmEwmTaUeE5GLlMBofymxFosFM2fORH19vejzbd26FUlJSejs7ERKSgqcTieampqYBICQ2JAazxHOTsCxBllGBCDLSGSjtGUEAJYuXYrMzEyPHRKf8tvZ2ekxsQXbRTU0NGDjxo2KjCkxMRFA8IJSBoPBw5XDkuZIEGLgfxvuhOI3GEwACFljpHbsDdV5ox2yjBAEQlMHgbc+CAWnCe2ilCwYJSRCSktLJac5EgQrhw8fBgAP0R2K36B7mwZ3AcDasVdsUbNQnZf4N3TXiLDjdDphs9k8OryGCpYOymJhERHBWqSvX78eH3/8Mex2u2B3YbGFzfyRkJDgmiTdWxOQpY9Qmn379mHt2rV46aWXXGnwofgN8nh3vw1Vx14tdAKOdsgyQoQVNXyuwQoQFRcXIyUlxeVqqaysDBp3wZL2x7KL2rlzJ9PYFy1ahLNnz0quRwIEriipZvVMpTl7Ng1r1tyDe+5Zg2HD2tQeTszT1dWFiooKnDp1CsXFxYrVIvHG+7sdqiZ11Pwu9JAYIcJGIJ9rIJOrkrAGrM2fP1922p+UTqbeuNd0WLVqlaxzAf7N53q9Hrm5uYp0UVWbhobJ6OwchMbGySgq2qH2cIj/o66uDu3t7Vi0aJHfWiRyRDaP+3c7VE3qqPld6CExQoSFUPpyWSPiWQoQKVHGWeruyGg0oqSkxGV90ev1irWr967hYLFYYLVao0KIAEBTUw4AoLExh8SIxjh8+DBOnDiB0tJSj1okVqvVJ6haCu7f7eLi4pAUNUtPTxdVJp8QD4kRIiyI8bmyViwMlctHbhlnqbujrq4udHV1QafTuSpRKm325a1QfIXNaODs2aE4e3b4//3/cJw9m0auGo3hcDg8rJ9KVEX2xm63o6KiAgUFBUFFttiiZvw8I5R5RsXS5BF1YuT8+fN48sknsW/fPpw4cQLnzp3DsGHDkJ2djYcffhgLFy5UJCiQEIfSPlchl09RUREKCwslTw5yyjhnZGRI3vFt27bN9f8mkwnTp0+XNAYhtmzZEjVpvYcPW6DTOcFxeuh0Tlitk1BY+InawyL8UFVVhfHjxytSFTkQjY2NQcvZi9mosIgmqjOiDFEnRs6ePYvXX38dM2fOxC233IK0tDScPn0amzdvRllZGR544AH87//+r9rDjDmU9LmyuHxqampw4MABzJ8/P2IniY6ODtTU1CAxMTFo6q4UokWIABddNBx3cYPBcTo0NuaQGNEodrs95E0CvcvZS62UyjLPGI1GLF++HPHxUbeUhh3Jd/DWW2/F9773PcybN09TloaxY8fi/PnzPl+Ojo4OzJw5E3/6059QXl6OnJwclUYYmyjZoIo1QLSjoyPkgbH+aGlpUbRPjNJCJNLo64vDv/51KQDfecbhMOCbb0a6PaLDN9+MRHPzBBgM/j4DDpde+i8kJAyIGsPo0aNx6tQpUa8h/LNv376QX4N3+cop2c4yz3R1daG1tZWa4SmAZDHy3nvv4f3338fo0aNx77334t5779VE8E5cXJzfx00mE0pKSnD48GF88cUXJEbCjJINqsTGUYS7GBGl9ynLwYPTsXXr/IDP8y4a97/fffeOgMfPn78V+fl7ma5tNBqxYMECbNmyhX3AMYTZbMaIESPwxRdfqD0UD7Zt2+Zh/ZPiSqF03vAieXZuampCeXk5uru78ctf/hJZWVmYP38+Nm7ciP7+fiXHqAjd3d346KOPoNPpMGnSJLWHE5PwmSrexbbMZrMo64XYAFGWYkRKFmKj9D5lmTbtAPLy9vzfX77dK9yFiL+/3V+Xl7cH06YdYL52SUkJUlJSIt6tZTQaUVBQoHihu3nz5uHqq69W9JwABIsBCuH9efGxZFarlfkclM4bXiRbRiwWC15++WU899xzqKysxJ///Gds374d1dXVGDZsGJYtW4b77rsPEyZMUHK8zJw/fx6vvvoqnE4nTp8+jS1btuDkyZN46qmnMH78+ICv6+npQU9Pj+vvaCgIpSXkZqoA0gJEg+1elM7KkRPASviSkDCABQuqkJV1HJWVt6C3NxFOp38LqD90ugEkJfXi1lsrkZ39T1HXPnfunKbc0FJITEzE8uXLkZycjDlz5qCqqkq2q0Sn07lqhzidTsWL5y1YsCAksSVirKRKupYJYWTbrRMSEvCd73wHVVVVOHHiBH7xi1/AYDDgxRdfhMViQVFREd5++22PBT4cnD9/Hk8//TR+9atf4Y9//CO+/vprvPDCC3jqqaeCvm7lypVITU11/RszZkyYRhw7eJclF+s+aW5uFr3QB9q9CJVtZ91JuVtWWlpakJeXJ2p8hDATJ/4TDz30e6Snt8KfhcQ/HDIyTuKhh34vWogAwIEDB/Dtt9+Kfp2W6O3txfPPP4/t27dDr9ejrU1+2jPHca7mkEqWe+etpDk5OYLnNBgMHn+zWFPElGxneV+UzqscinftHRgYQGVlJcrLy/HVV19dvIhOh7S0NDz++ON49NFHw/rhDQwM4OTJk/jLX/6Cp556CjfccAPWr18fMPrZn2VkzJgx1LVXIzidTqxatUrUjslsNqO8vNzne8dyrkCvdcefZcVkMqGnpyfmg09DgdOpwyefXI2PPvoP+Atq/Tcc/uM/PsI11+yCXi99mgtFNpNazJo1CwcPHlRkc7hw4UJMnjzZ9be/34EYrrrqKp/FPdBva/r06RgyZAi6urpgNBpdFgyWxo/e4xZCjRYW0UTYu/Z+8cUXeO211/Dmm2/im2++QWJiIu68804sXboUn376Kf7nf/4Hjz/+OL755hu88MILSl1WkLi4OGRmZuInP/kJ4uLi8F//9V/405/+hB/84Ad+j09KSkJSUlLYxkeIQ0qp9UC7FyUKsQWqQ0BBbcHR6XSQug/S6zlMm3bw/8RIcKZPPyhLiADRlc1UV1en2LncrY1OpxMGgwFz5szBF198gYaGBtHnS09P9/md+ishf+DAAY8y8rwwYN0sio3xUMK1TAgj62729PRg3bp1KCoqQnZ2Np5//nmkpqbihRdewKlTp7Bu3TrMnTsX//Vf/4V//vOfuPrqq/Hmm28qNXbRFBcXA4Ai/RAIdRCzyAsFxsqNlmepQ2AwGCjAzQ9yDbJHjkxU9DhCHO6xElarFatWrcLatWuxadMmSUKEP6c/eLdufHw8ampqfH6PvEu1s7NTUJBIjfGQ61omhJFsGVm+fDnefvtttLe3IzExEbfffju+973vYfbs2X6PT0pKQklJCXbt2iV5sHLh3UZUoCZyYV3Yi4uLcckll6CzsxM2m83vTkZutDyLZcXhcODaa6/F2LFjcfjw4bDUWIgFDh+eBJ2OcxU70+sH4HTGuf4LADodh6amSZg+/aCaQ41K+FiKHTt2KLK5ExIJLMK/uroaxcXFqKioCHgMxXhoF8mr8v/8z/9gwoQJ+NnPfoZly5Zh6NChgq8pKirCk08+KfWSTHz22WcYO3YsUlNTPR5va2vDT3/6UwAXO7MSkQlLhLvBYEBdXZ3HDsqfj1dutDyrZWXnzp0YOXIkJk2aRGJEAbq6knHixFhXCq9O58SwYWdx/fX/wPbtc3D27HBwnB4cp8eJE2PhcCTDYOhWedTSmDJlChISEtDR0YHm5mZFzhkfH89cfsHbncb/jgDg1VdfVcwdKSQSWF2qKSkpshtdEuogWYx89NFHKCoqEvWaq6++OiQ56e688cYbeO2113DdddfhsssuQ0pKCr788kt8+OGHuHDhAhYtWoQ777wzpGOIBsR0ww0nLMXT/GXa8KZcd7eN3EJsYtwvVVVVWL58ueIpkLFIc3P2/wkRDoAOeXl7MXfu3xEfP4CxY4/j73+/Hnv2zATAgeP0aG7OxtSph1QetXji4uJw6JDy4540aRI+//zzgM8XFRUhLS0NJpMJ6enpaG1t9ZgHmpubFWtyZzAYXN18gyHGpTp58mSK8YhAJIsRsUIkXJSVlaG9vR319fXYuXMnurq6kJaWhmuuuQbf/e53cfvtt0d83YBQo/Xocb54mvcY+VS/YGm/7nUG+KC7/Px8NDQ0iK7YOGrUKOYx2+12tLa2CoofQpjDhy8WLUxO7sbChZswYcJR13MJCQOYP38bsrKOY9OmW9HdbUBT06SIFCMDA+JK1rMybtw4TJw4kfk3npmZ6Upd//jjjxUJgk1MTERBQQFzM0uxLlU5jS4JdYi64IlrrrkG11xzjdrDCBmhtlgIdcMNd5+XQPDFlty7z7LUHuGzYxwOh89kbDQaccUVVyA7O1vwvlqtVmzevFnUmPldWyAzcmdnZ8gWoGji9OkRyMw8gUWLNsJkuuD3mOzso3jood9hw4aFOH16RJhHqG3MZjMyMzOZrQf8d13JIn7JycmiumpTAbLoJ+rESDQTaosFS5BYuPu8BMJqtQYNVAtGc3Mz6uvrfR7v6upCfX09kxCRYt3gi0T5SxW02WzYsWOH6HPGIg899DskJvZByMBpNl/AsmVvorc3ITwDiwDcF2wW64HU77oQQinz3kh1qWrV3Uz4QmIkQgiHxUKJuhvhgEU0BSOYvxwILrjkXLuyshLz58+HxWLxWAicTie5bkSQlNTHfKxOJ+74aEdMNonT6cTWrVtDNhaxwa+B3LOBNmRadzcTnpAYiQDCZbGIlC6VUgqf8RiNRsGmZ8EEl5xrd3R0+BWOvNsoVBgMBtx6663YuHEjursjM6uEkE9OTg6ys7OZj+ctCqFCSv0d1gJkkeJuJv4NiZEIIFwWi0jpUilngrzsssuY+s0EuoYSk7O3cAy1uHM4HKisrCQhEuM0NTXh2LFjmDlzpitbhl/I/bkzQvm9NBqNkuM7hNxLUjZv5M5RHxIjEUC4LBaREiQmRQwlJiYiLi6OufFdoGsoIcS8hWM4xJ2QNYiIDbq7u31Kqefm5qKxsdHHnTFt2jTR509OTnbVRQnGVVddJfrcPLxwsNvtHr1peAEhdvNG7hxtQGIkAgiXxUJu3Q2piN2VsIgmb8T0FwkmuKRc2x/uk7VS5yQIsdjtduzevdvv41Iqq06bNg3p6emCMVA7duzAp59+KnrBD9aMjxcQrAXdOjo6yJ2jIcgOFQHwi1UwlLJY8EFi3tcT6vMiFfe+Fhs3bsTatWuxatWqoBYMvV7v6jMUCgIJLl40TZo0SfY1vIWjlF0oQWgNXtj4m0O84Rd8VmslLxwCiXb+fG1tbUznS0lJEXTnfPDBB8zihpAHWUYigHBbLMLVpVLqrsRqtaK6ulrRsQDBTbP+dmT+SmUXFxejurqa2dUlt+06QWiNqqoqlJeXIzs7GzabDRUVFcyFCAMhJovtwIEDMJlMQV1FvFAS+t11dXXhlVdewY033kgWkhBDYiRCEJvWJpdQVzCUmiEUqroHhYWFKCoq8jshNjU1+a1pwguR/Px8TJw40SXY9Hp90DHm5uZCr9eH7L0QhJq4x2Po9XrBTDGh4Hun04m9e/cyC/aOjg4UFRUFdTPNmzcPnZ2dTOfr6uoil00YIDESQYTLYhEOpGQIya0vEozz58/DZrP5tAdvamrChg0bgr7WarWiuLjY9TqLxYKCggK/vnjgoil71KhRIbHuEIQW4K0ScoPvpVoO09LSBDdvNptN1Dm1UvAxWiExEmFES88F1knKbrfDZrOho6MDnZ2dIXNnNDQ0oKGhwaNxF2uVV3+iqbGxMehrPvjgA0q1JTSPwWCQVAOHj4liDar3F+chx3JoMpkES96LDRzXQsHHaIbECKEKrJPUtm3bwpqW6nA4sH79epSVlYmyXPDiyul0or6+XnCCIyFCRAKlpaUALopn1t+hwWBwxUSxLvi8S8W9W7BUK6jJZILT6URDQ0NQ6zFLLJ43ahd8jGZIjBCqwDpJSREiLFVWhfjwww9F7QhNJlNIGooRhBrodDosWrTIFSMxMDAg6K7kcW/2KGbBd4/xkPMb7u/vx1tvveX6O1hcHR+Lxyq21C74GM2Q8yuK4Nt8NzQ0wGazwel0qj2kgPCTlNKYzWY88sgjWLp0KW699VYYjUZJ5xEjKPiOu+vXrychQqhCQkICRo0apdj5Fi1ahJycHAAX3SWsQgS4WNOntrbW9bfFYkFRUZGo60sRIgaDAYDvb1cohdhiseCRRx4RnCu0UPAxmiHLSJQQiVUEA2UIydkVzZs3D/Hx8S6/bkJCQsgzVoqLi7Ft27aQXoMnLi7OY+dJxDYJCQnQ6XTo7e3FV199xfQag8GAK6+8Ep9++qnPwu0eMwVc3OBs3rxZ9Lj27NmDwsJCl3skLS1N9DlYuOqqq5Ceno5BgwYJxncFC0CNj4/HjTfeGPaCj8S/ITESBURyFUF/GUJ2ux2bNm0SdZ5AwiuQ4FGKa6+9FikpKWHzJbvXNSFik6uuugpjxoxBW1ubpCqpeXl52LFjh9/nvMWJzWaTZO1zOBwewZ4pKSmizyEE/5vX6/XYsWOH7BTicJdPIDwhMRLhhKujbyjxzhBiTbkrKSlBSkqKYIozL3j27t2ruAWD4zi0t7cres5gaNn1RoSPnJwcrFq1SvTrTCYTDh48GPQY9/lCbPqrO6EW6LwQcTqd2LNnjyJjiqbyCZEGiZEIJ1wdfcMJa8O+vLw85klCr9cjLy8PdXV1ilpIamtrkZSUpNj5CIKFmpoaSd/j3t5e9PT0BD1GqfnCPdiTtcCYP7zdtt6WipaWFmbrDUsAarSUT4g0SIxEOOHq6BtOQlX+XkoqHwtCkztBKMm+ffskv5b1u8rPF5mZmR7BqKwYjUaPYE+pWShmsxnLly9Ha2trQEsF69zmnnJMaA+yPUU44eroG25C1bCPr45KEFrDaDQiLi5O7WEA+Pd8kZmZ6cpSEcOCBQs8BANLs09/uAekT5482adCsvtYhcjPzyd3i4Yhy0iEw+rSiMQdAe+/tdlsLt91ZmamLBMqS3VUglCDvLw8SQGpSuM+X+j1epSWloqyJmZnZ7vSgnnEWiXFBI2yzIEGgwGFhYVM1ybUgcRIhBPujr7hprm52SO6vba2VlZ0O0uMDUGEE/77rJVW9d7zBW+l3Lp1K5NLpLm5GVar1W9mW0FBAerq6jyywnQ6HWbOnIkJEyZIChplmQNLS0sjdg6MFejTiQJC5dJQGz5l2Vs88CnLO3bsEJ1dEurYGQpmjT6mTZsWsnNfddVVKC8vh8ViCbsr1bvIV7D5wmKx4Ec/+hFzMcEPPvjAR1xZrVbs3r3bJz2d4zjU1dXB4XAEdMUIEa1zYCxBlpEoIdpS0lhSlmtqanDgwAHMnz+febIJ5YRvNpvx8MMPY9WqVWHtp0OEDoPBgMOHD4fs/G1tbZIbt3kzceJEHDlyhOlYlsBQb/gsE5vNJvj97urqwiuvvIIbb7wRFoslLCUIxMyBTqczaubKaIHESBQRTSlprO6Ujo4OrF+/HkVFRR4VHwMhd8IPxrx58/DVV1+FRYjw9RWI0BLq8v5ffvkl+vv7ER8fLyvby2Qy4Tvf+Y6PWzMQubm5HpWKWXE6nTh+/DjTsV1dXa6iiwaDISwlCFjmwEisVh0LkBQkNIlYd0pNTQ1effXVgP0neELRE8dgMKCoqAjZ2dkhdQNZLBYUFhZi9uzZJERCTEJCgqQsErH09/fjlVdecX1vA7kbhLjyyiuh1+thsVhQXl6OpUuXYvz48QGP3717t+BvxRur1YpVq1aJTvUVU/3Y/fcTil5bQq5fsfeEUA6yjBCaRIo7hbeSLF68OKi5VqkS8YmJiejt7YXD4UBNTQ0OHjwY0viCU6dOYeHChVi9enXIrkFcpK+vD319fWG5Fm9BGDduHC6//HLMmDED2dnZqKmpYV743eMw9Ho9MjIyBFsqiHGLBGo5wYLdbmcuesb/7kNhvYiGatXRDIkRQpPIcads3rzZJ/LfeyLz9i+fOXNG9I6vt7fX42+73Y6amhqXSFEau92O/fv3UzZQlHLs2DEcO3YM1dXVmDVrFsaPHy9JjADyKzO7x1SkpKRg69atzO/DHzt37hQ8hk8pDlWvrWisVh1NkBghNIkc/7k/P7+/iczdv2yz2SRVmvRHKAtXyekVEq0kJyeju7tb7WEoBsdxrqwT1g7WBw4cwKhRo1zBonv37mW6lj+3oj+rhFxYPh/efRoq60U0VquOJsgWRWgW3p2iZAZMVVWVX98za4VIoZRG4KIY8i76pBTNzc0hOW8kM2bMGLWHEBLq6+tRUlLCdKzD4cD69euxfft2ptgpHu/fVqCYilBiMplcmwQx1gtvhGJMorVadbRAlhFC0/A7vYqKCkXOF8gMy2KJKSoqwpAhQwR98cDFKpQWiwVbtmyhNN8Qc/ToUeZjQ+VCCwUcx6G1tVXUa3bv3s18rHf/GJaYilBwyy23ICsrC4B06wVLjEk0V6uOBsgyQmgap9OJ6upqRc8ZaMITKpw0e/Zs5iwHk8mEnJwc/PjHP8bSpUuRl5cHnU4X9DXhyN6IdSJFiPB8++23ITv36NGjPVwdcqoTGwwGH4sC6/f5yJEjLkuGFOsFa4YMSyZdJFerjnTIMkJomlCUbw824QkVTkpPT4dOp/MJGHRHp9MhPT0dwL/jUjIzMxEXF4e6urqArystLQUgLhUyGomLi8PAwIDaw9AECQkJITv30aNHsWPHDld9HjmxEqWlpT6/G6fTibfeekvwtfv27cO+fftgNptRXFwsynohNkMmUCYd1RlRHxIjhKYRM0GaTCb09/cHLVTFYoYNVjiptbU1qBAB/m1edz+H1WoNKkQKCgpcE6GYtM7CwkIMHz4cKSkpqKysjIrgu2gRIgkJCbLTg5ubmwXFrxzcqxhLjZUwGAyuxd79O+90OkVlxNntdlRUVKCgoCCou8ndeiElQybaqlVHC3T3CU3DOkGWlJTgRz/6kcu6EAi5ZlgpPm2W3VtjY6Mr4E6v1zNn5GRlZWHy5MnIyspiDnYkIotQCREevj7PiRMnJLkKHQ6H34BSqQUGGxsbUVZWxtRnRmqMCS+cpPbCIZSHLCOEpmENOsvLywuLGVaKT1vs7s1qtTK3kh8YGIDT6YRer0dKSgrTa4jwEK6iaUrBUgskEMHisIqKipi/z8DF30JKSgrKy8sFrReUIRM9kBghNA1Llktubq5Py/NQmWEzMjJgMpmC7si8XUFidm9iMxrWrVunuRb0RHCiMSYm2GKflpYm+nwdHR1MfWYoQyZ6INsUoXksFgsKCgoCPu+vz0aozLDNzc2Ci/60adPQ1NSE48eP4/jx4zhz5gzTuVNSUiQF7PJZA6HMvCCUI9qEiNBiL8UqwfoaypCJHsgyQmgep9OJxsbGoMeEo6eEUH+OxMRExMXFiTJJu1NZWSmrWNqOHTuYjktOTobT6Yy4NFdW4uPjyUoURoQWe7GtHcRaMihDJjogMUJoHtaYi5qaGmRlZXm4ZNx7bMhx17C4T+Qu7h0dHaivr5d1DhaiqXS6Nzk5OUhJSWEuh07IIz8/X3CxF9vaQYolgzJkIh8SI4TmYY25qK2tRW1trWtHBPjW7JC6W7LZbDFd+0PrXHLJJejq6kJTU5PaQ4kpJk6c6PG3HPEv15LBu2b5MTQ1NZEoiSBIjBCaR6zPmY+hCPacmM6fVqsVmzdvFjUGIrx88803ag8h5jAYDB7ulEAl2YuLiwWrKBuNRixfvhzx8dKWJF6AHDlyBA0NDR4tGMhdExmQXCQ0D2sTOzEEapjnDR8nEqyQGqEc0Zz1IHWh1SoOh8PVuDFYSfaKigpBq2JXV5foPjw8VqsVq1atwtq1a7Fnzx6fXlDeZeEJbRJ1YuTUqVN49dVXUVxcjIyMDCQmJmLkyJFYtGgR9uzZo/bwCAlILZ4UjECdP91Rq3FYrJKQkCD4mUQyWguqTUxMlH2Oqqoq9Pf3K/I7kVI9WEyXYdYNCKEOUSdGVq9ejUceeQTHjx/H3Llz8eMf/xjXXHMN3nvvPRQUFDAHURHaIlATOzkITX6h6IsDQLBhXqwSaUXCIp2EhARkZmb69L9JTExkrsRqt9uxf/9+RX4nYt2xYjcLLBsQQj2iy24IIC8vDzt37kRhYaHH47W1tZgzZw5+8IMf4Oabb0ZSUpJKIySk4h4xf/z4cabeLcEQmvzE7NRmzZoVtPeMOxMmTHCZtwlCLTo7O9HZ2en622AwID8/3zV3svZHamtrkz0WKYXJpNbkIbRJ1FlGFi5c6CNEgIsNxa677jq0tbWhoaFBhZERSsBHzBcVFcmykrBMfmJ2ahMmTBC03JjNZpSVleFf//oX83kJIlw4HA7U1NSgubkZer0eWVlZTK+TUmHVm5ycHNEZL1LcOt7xJIR2iDrLSDB4c2SwQLKenh709PS4/iYlrU3E1i7whqWWQUZGBgwGA1PwakdHByZPnuxR64DvFdPZ2elKMQyV60eIhIQETJ06FU1NTZqakKlAmfbgCwiyllqfMWMG6urqZH2v6+rqMGbMGFEZL1IquxqNRtGvIcJD1FlGAtHS0oK///3vGDlyJCZPnhzwuJUrVyI1NdX1b8yYMWEcJcGK0+mEwWDAzJkzfSYYvrunP0uFv86fTqcTNpsNDQ0NsNlsHt1z8/PzmcbDT4zuZeizsrJcXXX5kvRSdnNK0NfXh3379mHq1KmqXD8QFFCoPfjYCtZS6/Hx8cjNzZV9XbEBplKy7JTOyiOUIyYsI319fViyZAl6enrw/PPPB23P/sQTT+DRRx91/W2320mQaAx/9QyMRiMmT56MiRMnehQ5EqrKGKg2Al+XoLCwEHv27AlqHQnk8vFXAErt7qGfffYZ8vLy8Nlnn2miHDyJEW3Ci2aWUuss7RpYcO9czYJY6yg1zNM2US9GnE4n7r33XuzcuRMPPPAAlixZEvT4pKQkCm7VMIH6w3R1dWHPnj247LLLPMRGsM6fgc7lXRittLQ06ITnz+UTrACUmD4dLLC6koCL94kvlU4uEiIQ7qJZqNS6kq7HUFoOqWGetonqT4bjODzwwANYt24d7r77bvzhD39Qe0iEDFhS+VhNvWLOFSit2GAwoKioCNnZ2R6PCxWAUsKkrQS8EFGi3gQRPfizIATrgq2kgBBjOWRN7fXnmiW0R9SKEafTifvuuw+vv/467rjjDrzxxhukiiMc1oZ5LLUExJ7LYrGgvLwcRUVFrhoMfPbBqlWrXNUdWSbIxsZGlJWVKeaycTgcKCoqkhycl5SUhCVLlmDhwoVYsmQJc40JIjrJzc0VNVeyfo+F6uuIdaOwWmRuvvlmEiIRQFSuzk6nE/fffz/WrFmD2267DW+99VbQOBEiMmDdgbEcJ+Vczc3NqKmp8XGJ8G6dpqYm7N27l0nkpKSk4Ec/+hFycnKYxiFEWloa5s+fL+m1HR0d0Ov1mDx5MvR6fVSXvveXEh7JGRZGoxFXXXWVT+EyOezevVtU6XSWQFKz2YyFCxcGPUbIjeIdaM7qGnKvpUJol6iLGeEtIm+88Qa+853vYN26dSREogTWHRjLcWLPxWLx2LBhAziOYzovL3JOnjzJdLwQKSkpeO+99yS/nh+PWtk+4SA5ORmFhYUoLCz0iH9IT0/H6tWrVU/j1+l0zN8fnq6uLuzbtw85OTmKdizm03tZLCQsgaR8sGtcXJykTtqBgtZZUDpoXE5nYiIwUSdGfvnLX+KNN97AoEGDMGHCBDzzzDM+x9xyyy2aS3EkhGGte8Bi6hV7LhaTsJiFxGQyKRb4x7tV5JyLn7DVzvYBLsawxMfHK14PZcyYMa5FwzuoWU7NGjlMnToVWVlZ6OzsxLZt2ySf5+TJk0hOTkZ3d7ci4xKb2cKSdcMfJ5Th5k2woHUhlM6gEcq+I6QTdWLEZrMBAC5cuIBnn33W7zGZmZkkRiIQ1h2Ykrs5/lxKWgz4CVKpnSzHcbhw4YLs8QBwpR+raSG56aabMDAwgE2bNil63lOnTsHpdPr9flgsFsyaNQv19fWirRNSMZlMKC0thV6vx+effy7rXHa7HUVFRaipqVFmcBD/nWcVGv4y3HgXDD9/Z2Zmuo6R04RPyQwa1uw7QhpRJ0beeOMNvPHGG2oPgwgRrDswpc+lpMWAnyCVOmd3d7csMeIesNjc3OxRgVgN+Mq1StPV1YWamhpkZWV5WLw6OjrQ3NwcVBzm5+cjMTFRdj8kd6ZPnw69Xg+r1SrLKsKTlpbm9/ssJvXbHSnfz2Cp9IGwWq3YvHmzxxhra2tdvXJYLH5Go9HDUqK0tYI1+47VtUX4EnVihIh+pJh65Z6Lxa3DQlFRkWuCVOqcAGQFne7evRvp6ekAoImu1h0dHcjJyQmJhaa2tta10AHs981qteLmm29WVIx0d3cH3G1LwWQyITMz0+f7nJ6ejpdfflnUd0SKe0NKLEWw989nq7FQUlICs9kcsjgOMdl3YsUYcRESI0REImUHJudccnvh8Lg3FVPqnIBw2qQQW7dulT0GpTCZTNDr9Zg+fbqibgd3xIo3fiFSsmBdfX09Dh06pMi53MWD9/fZZrOJfr9i3RtSYimcTqdi3zuz2RxSEaBkJh/hH7InEQQjgYqfiREC3qbvQOfkO/yymMoHDRqE5ORk5jH4o6OjQxMTqdFohN1uh81mw5AhQ9QejgednZ2CvVrEolQadXFxMVpaWnz6KwHiFkiDwSA69iFYkb/169cHTBPmrShyCUeZdyUz+Qj/kGWEIETgz63T2dmJiooKwde6T5reJu3ly5ejtbXVx8ys1+sFLScDAwPYvn27Iu9Pbbq6ulyBq1qr/8G7QQoKCrB79261hwPg4j2aOnUqqqurA1olxCyQCQkJPhWFgyEnlkIp8evPiqN0+q2SmXyEf0iMEIRIArl13n///aDN5/hJM5hJO1hH6UBEWpGygoICNDY2Cro7lE7tlYPRaER6ejqOHz+OgwcPqj0cABdToOfNm4eNGzf6POee4ZGdnc3sXvKOexBa1OXEUogRSUVFRTh48CCTGygU6bdKZvIR/iExQhAysVqtqK6uDihE3CdCMemBrL03WEhMTNREl968vDzMnTsXc+bMcS1k27Zt05Tw8MeUKVM0URjNnd7eXr9CxB3eKiEmNom3WLAs6nJiKVjTyE0mU8Bida2trWhoaHAJpebm5pCl3yqZyUf4QmKEIGQglA1RVFSEwsJC6PV60SZtJbuhamXHlpqaCuDieDIyMrB3714mIeKduhlOsrOzUVdXp8q15YpI9/5KrOcymUzMollOLIVer8f8+fMFRdL8+fN9itVZrVYfcWgymQS7UMtNv1Uyk4/whO4gQUiERVwcPHjQVdCppqZGVHM+JQNKu7u7MXv2bNXjMHiXktVqxapVq5jra5SUlKCkpCSUQ/PBaDRi0aJF+Ne//hXW6/JMnTpVEWsWby1gOZfZbEZ6ejpzR2vWvjSBYil4a4O/5oyBgmkDBcx2dHQIuixZG2kGI1gHY0I6ZBkhCImw+stfeeUVUbt6XoQoHZm/d+9e1eNLdDqdpNoaZrMZubm5qKurU8RalJSU5NMU0Gw2Y9q0aUhLS3PteJW0Trkj1IfGZDJh7Nix+Oyzz2RfS0x113nz5qG1tVVUHIjcWAre2uCvAqu/wFS5rkstZI0RvpAYIQiJsE5qYt0LvAjJyMiQXD3TH2oLEeDie9q8ebOo1/A7ayXrsixYsAC5ubmC5vbm5mbZ1/JHUlJS0D4y8+fP92stEAure8toNCIvLw/9/f04fvw407n5778SsRR6vR5ZWVnIysoKepwS4pDSb7UJiRGCkEgoJjV3k3Zzc7MmBIRSGAwG6PV60YuJ+8460MInlrNnz6KlpSWov99qtaK+vl7yNYLBCxFvsem+gDudTtlF1iZPnow9e/YIHud0OkUXmHP//ocrlkKuVYPSb7ULiRGCkIiS5dx5+IXX6XSKtiBondLSUnR2djIfH2hnzS98e/fuldzThS8LH+gaSmYyBSM+Ph5LlixBZ2enzwIu1xI0e/ZsZGZmMokRsd1+/S3qSlZFDoTcDQCl32oX+lSImIUPLPVXtZIFfrFQArPZ7BGsJ6WEt1wMBgNmz54tu5qrN/Hx8aKzL0pKSlBeXh7QxK/X6xVpqBeoSmioYkW86ejogF6vDxgMyVuCxAYeJyYm4tprr2UKMJWCWos6y/sxGAw+3zPv3xehPcgyQsQkShVGCuQ2YPXVFxYWurrIuk/ufCCfVOLj4wXTHL1xOBzYsWMHcnJygnawFct1113n0RxQKA7GbDYjLy8v4GLHF+I6c+aMYmP0TvmU4g5ITEzE1KlTcejQIVGdj4WuZbFYMH78eLzwwgvM2TU33XST670oFWfD497sMdywWIvy8/Nx9dVX+61oTGgXEiNEzCGm8BgL/vzl6enpgkWyzGYzioqKQjJJJiQkiBYjPC0tLYoFzup0OuTl5bn+ZomDyc3NDRrHITdexB/eVUKluAN6e3uxd+9e0a9juVZ8fDwKCgqY4jpycnKQk5Pj+juQYJb6Gbs3e1QDobihmpoaHDx4UHJFY0IdSCoSMQVr4TEpLhv32gPx8fGCLhyLxYKWlha/12L1vXub73mBI0dIdHR0ID8/X/Lr3Zk1axbi4y/ueVi7tDY2Nvq9J4HqSyjFkSNHXP8fKveGN979ioK5DQsLCwUzbJKTk7Fw4UKfxy0WC8rLy7F06VIsXLgQS5cuRVlZmaQxayEbhX8/RUVFfp8XatJHaA+yjBAxhZxeGmIJtIPja0zs2bMHe/bs8eseyszMFNy5GgwGPPLIIz7maCVcLGlpaSgrK8OGDRuC1sPQ6XQYP348jh496nGcTqfDrFmzMHfuXNdjrF1a/d3/cASU7tmzB5dddhksFouiacTBYOlXxH8v9Ho9SktLg45p2rRpfq1K/nrM8NcQI+60lo0i1CdIbsVVInyQGCFiCjm9NHgCNQ/z97i7C6e5uRn19fU+i7s/9xDLwlNaWor4+HhZDcgCwXeoBRC0I/GiRYuQk5OD/v5+7N+/H21tbUhLS8OMGTNcFhEeMXEY3seGK6DUffFSKo3YH0ajEQsWLBDdr8hisQTtGrx7926kp6d7CFt/Qoe/vljBpaVslHBuLIjQQ2KEiCnk9NIAAge+5ubm+nSidd/ZZmRkYNOmTUGv6b2L4xfDrVu3eizOJpMJ8+fPDxjXIjfl2H33m5OTA71ej82bN/tYafi6IcDFmIaZM2cGPa8YkeSdKROuBnV2ux02mw16vd4lKpcvX47W1lYcP34ctbW1ilynq6sL1dXVAOD6byDcvxdOpxONjY3MxwcSOl1dXaioqEBBQUFQ6x2Pd/0TMfVExB7PihIbC0I7kBghYgqWhdrbj89PpG1tbX4DCO12u9+dqvvO1mAwSNrFSSkmJdfF4L77dTqdOH36tF93kcPh8Ni5Cy06rF1aAaCystIluKxWq+R6IlKoqKjwW4hs+PDhil7HbrcHtTq5H8d/L8RYAzIyMgRdW7t370ZZWRnKy8v9dsT1/izFZqEplbXmD7kbC0JbkBghYgqWhTqYH18KVVVVmDNnDtOx/hZqKcWkhEp08+MKtkhYrVYfq4w/+IDf6upqwZgHli6twMX7sH79+qAuiVDhLbx4URkoWDIc8J+BGGsAq2try5YtsFgsPt8x77/FZqEpnbXmjdiNBaFtSIwQMQdLLw0pzdwCYbfbmfvTKLmLE7KqBHtOzPsPtMMPFPNQVlbGZBEAgLq6OqbjwsGBAweYLTtK09bWBkCcNUBM7yShuArWLDR3d5KY46UgZmNBaB8SI0RMEmyhDkXmhtFoVGwXJ8YHH8yqEug5pd+/96Jz9uxZ5tcGy+QJNx0dHSgqKmKq9cF3AO7s7MS+fftkX7umpgYjRoxAdnY28/eopaWF+fxCwkVssGi4gkuVaNJHaAMSI0TMEmgxDkXmBj85yt3FKeGDFxIzSr9/90XH6XSGrPmcHFgLgKWlpfld/EwmE6ZPn460tDSPe7pjxw7FxsiLOtbvUUZGBnMlYCGLi9hg0XAGl4arSR8RWkiMEIQXSpvh+Z2qXq+XtYtTwgfPImZC4Ybgz9nS0iK6KVuoKCkpQUpKCkwmE5xOJ9566y3B1/ApzyyLn9PpxIEDBxQbLy/qWK0Ber0eCxYsEHSJsVjkxAaLhju4NBxN+ojQQmKEILxQOvre3eLhvovjY0mMRiMMBgOcTmfQfixyffCsYiYU2Qf8ObWSZmk0Gj1qoTidTlFuNJbFj7XImxj48/HfI5vN5upjlJmZ6TOmnJwcfPXVV0GDgFkscmKDRSm4lBALiRGC8EJunQ538vPzfawVer0eDocD//jHP5gtJHJ98GLEDOv7N5vNKC4u9smi8Xccv+hoJc2yq6sLL7/8MvLz81FYWBiSYMhQCC/3+9fc3OxhHamtrfX7HZo7dy5GjRqFLVu2eLhshCxy3u684uLioFYW9/sj5X6Gqh4JERmQGCEIL1gm0oSEBPT19Qmea+LEiT6PSXG3yPXB22w2UWJG6P0XFRW5FnG9Xs+86IipNRIM76JcUnA4HKipqcGePXtQWlrqqm5aV1fnt7S92GBIpYWXu6hrampizmACLlpILBaLoCWFJ5A7r6CgAA0NDR6fXyBRIya4NJT1SIjIgMQIoTpa3RH5C2pMTExEb28vkxDxZ4aW6m6R44O3Wq3YvHkz0+vd3QCsC4mYY8XUGgnGzJkzFUv75Yu3BappwnGc3zLrQihpYQP+LeqampqwYcOGoMdu3rzZ5zvEakkJJpZ3796N5ORkj8eDiUKW4NJQ1yMhIgMSI4SqaHFHFKzGRm9vL/N5/Jn1pbpbMjIyBDM+/IkfsfVS3MWMmCyF7OxsJCUluXbd/HGdnZ2w2Wwer+PFi78S86w0NTWhrKwMH374oawOxe4IiZuqqiqMHz8era2tHvE+gwYNAgB0dnZ63COlmu25W2asVitTjRaHw4Ha2lrMnj0bAPuCzyKWvQOQ+QJ1gURDsPiacNQjISIDEiOEamhxR6REjQ2j0Ygbb7zR79iluluam5sFF11/Pngx78VgMPiIGZZAzaamJp94hGC9TYB/C50TJ05g/fr1okQecPE7kpKSgrKyMqYsGBaE3D52ux2vvPKKYKqs+3sNZDViTSXmx7V7926MGjVKsI+NO3v27EFhYSEAMC/4ctK6pYgGanZH8JAYIVRBqzsiJWpslJSUBBRRUtwtLPfKYDAgOzvb47FwdLrdvn17QNeGO4E6E48bNw433XQTc0VWdzo6OpCTk6OoK0QIlpod3u81kIXJ220ihLfgE8LhcLia/rEs+CzF3ITOIVY0ULM7gofECKEKWt0RKTHpmc1mn8f4uJj29nYkJSWhp6cn6Dk6Oztd/89yr9wXHn7BE7tAOxwOUfe7qalJdN8Yb4FptVpF7fbd4UukT5s2TfZCGgr49wrAr6vLXaSwdAQWI0R4KioqcMUVVzAdq0RHYrG/n1DVI9FqHBoRGBIjhCpodUckNwMiUNyG2IZ71dXVsFgsLnHBgne3WaPRyHw9HtZrOZ1ObNmyRfT53QWm3P4/fCaMUjEjSmO321FbW4uDBw8GjIni3WCh+p47HA7s2bMnJOf2h9jfTyjqkWgxDo0QhqQiERKcTidsNhsaGhpgs9ngdDo9ntdq+29+cpSKd9wGv+CKtVLwizbAfg+8F2UpO2nWa7W0tEg6P3BR8CjV/yaQEElMTJR9biWoqanx+ex5N47VanU9xnrfpb4vnU4n6XVikFLEjA/yDYaY+i6Bfm/+7jmhLcgyQigOy85EqxUaWTIgCgoK0NjYKLjzkrvg8rtlpVNEAyHmfsvZyZtMppDHs8TFxYXs3Erh7rJi/YzFBvryKNFwUCjoVmqHXKWa3Wk1Do1gg8QIoSisGTJabv/NMjnOmTNH0Cctd8Hld8tKpYgKIeZ+S7VY8YKnqalJ0utZcTgcKCoq8usiycnJUaxGiRzcXVbh+IxnzpyJw4cPi/pOFhYWYvjw4UGDbpVwgSjR7E6rcWgEGyRGCMUQuzPRcvtvocmRJeVVjvXA20qhRIpoMAoKCgTvt3tQIN9gTux75AVPONxvaWlpKC8v9/gM09PTsXr16pBfmxX3+xfoM1aK7OxszJ07lzlgFgCysrI8vueh7JArt9mdVuPQCDZIjBCKIWVnouX233InRzkLbm5urs898HevWLvNCtHY2Ig5c+YEbbLnTwixItVNx3Gc5MXDZDL5fIYsZfHlYjabmTN8zpw541EUji88JiXVWWhM/DUyMzORkZGBQ4cOSXKTarVDrlbj0Ag2SIwQiiF1Z6LVyU0ucmI9AokD73vF0m2WhWDm60CuN94i422dMRqNmD9/PgYNGhRQYLK66QBIcl0EWkhDsStOTk5GWVkZurq6XO8VgI+LyB+1tbUeZdmzs7MlpzoHw9sFp2U3qVS0GodGsBE53zRC89DOxBOWTIFAuGfTyL3GhAkTmK7pb6Fmcb3Fx8dj7ty5uOqqq1BSUoJHHnkEubm5yMzMxOTJk10xEd7wjem8Mz3cy5/zrguxGU7Tpk3ze81QfPduuukmjBs3zuO9iv3s+Ziq2tpaRS03ZrM5YCXjQPc22Gu0jNKZOUR4IcsIoRi0M/FFThwA6y5eKPbGYDDgn//8p+B5/C3ULK63jo4ObN++3fV3XV0dU8yP1WoNWL21rq4OOp0Oc+fO9XBPNTU1Yf/+/YLvZciQIT6POZ1OOJ1OwTgbo9EIvV6PCxcuCF4nGFI+eyVqgngHnQZbfLXsJpWCluPQiOCQGCEUIxpNv0rgPuHb7Xa0trZi3759gq8Ts4sPtqiwuHKUdGv4a77mPS4Agp2E+X4sOTk5LvfU119/zTQG7xooYgrP3XjjjQDY3UPB0kXdGwieP38eDQ0NQc+lRDCyd9CpENHmJo02gRUrRKUYWbduHWpra3HgwAE0NDSgt7cXa9aswbJly9QeWtRDOxP/uE/4ubm5aG5uVtyCFGhRkSMS5bg1qqqq4HQ6UV1d7fNduPLKK5kW3vfee8+VCg6wV5V1P4610qv3d3Tx4sX44IMPBIu7BYq3kVJ5F5CXIRVrlsdARJvAigWiUoz8/Oc/x5dffolhw4bh0ksvxZdffqn2kGIK2pkERw0LklSRKCcI1263+80Ksdvt2LFjB9M5+vr6YLPZkJWV5RovC/xxrE0Gy8rKfGJbLBYL+vr6sGnTJsHreVuQ5JS6z8/Pl9xrJxYtj0R0EJVi5LXXXsP48eNx2WWX4Te/+Q2eeOIJtYcUc8TKzkRqQy41LEhSRGK4Cq4Fw12MiI1LYm0yyAed+jsXC2K7LAfCbDajsLAQI0aMEGVVMRgMKC0tVfR7w7d0sNlsAIDMzMyAwcgEIZeoFCPXX3+92kMgYgC5DbnUsCBJEYmhLsYlBrFWJbmFsKQEZcupvMuP3f270dzcjPr6+oCvycnJwcKFCxX93litVmzevNnDXVRbWxsS0UMQQJSKETn09PR4tHdXe/IltAlr2XshtGBBYrHueAunlJQUVFZWhqWapff9EWNVkptuLsWlJuWe+Bs7/93gi5R5v1+j0YgFCxYgJydH9PWCEczF5HA4RH2/CYIVEiNerFy5Ek8//bTawyA0TKgbckl1/UhBjHXHWzjNnz8/5O4bg8HgV6yxWpWUSDcX61JjFUAlJSVISUlBSkoKAKCzs9OjGquU9ysXp9OJrVu3Ch63devWsDacC+dvglAHEiNePPHEE3j00Uddf9vtdowZM0bFERFaI5QNueS6fsReS451J9AibTQakZubi8bGxqCZKCxN60pLSwMuOixWJaWChcWIAVYBlJeXh+bmZrz33nuSxKAcAi3u/GNCdHR0hK3hXDh/E4R6kBjxIikpCUlJSWoPg9AwoWrIpZTrhwWlrDvesQ2ff/45urq6sHfvXsEx8IvJ6NGjsWXLFg/houRio1SwMKsYYBVAzc3NQT/vsrIyxV0wQPDFvb+/n/k84XDRhfM3QagLiRGCEEkoyt6H2vXjjZLWHb1eD4fDETTI0h1vEZCTkwOLxRJSM3y4g4WFBFB2djZWrVoV9BwbNmwAAEUFidDiXlRUxHyuULd1CPdvglAXEiMEIZJQlL0PpevHH0pad1gWDaPRiJKSEo/use6EI5A33MHCwQQQS/dgjuNQUVHhyq6RC8vndODAAZhMJsHP3b2SbqgI92+CUBeSkwQhklA05AqV6ycQSlp3WBaNrq4umM3mmKtTwQsg74aBYj5HvpKtXFj7DE2fPl3wXPPnzw/55xju3wShLrEzKxCEgijd8ZRVHJw5cwY2m0324sRbd4Lhbt3hC2A1NDT4XJ8WDfGIcXGwdnAWgvX+p6WlYfHixTAYDD7PGQyGsMVpUBfw2CIq3TSvvfYaPvnkEwBwNaZ67bXXXCWWb7nlFtxyyy0qjY6IFpSMQ2Atu15bW4va2lrZAZ5iskyEshnCsWhEW2qn2DL7Sgg5MZ9TZmYmsrOzVa3ASl3AY4uoFCOffPIJ1q5d6/HYrl27sGvXLgAXf1QkRgglUCoOQWzZdSWyCViyTFiyGbKzs0O6aERjaqfYz1uJ3b/YxV2v1yMrK8tVij/cUBfw2ELHcRyn9iC0jN1uR2pqKtrb25n7VBCEVMR2ejWbzSgvL5c1IQeyOjidTqxatUpw8SovLw+YpsojVTQJNZyL9NTOpqYmbNiwAcGmYSU+Y55IvJ/RKEZjCdY1NCotIwQRqbi7fo4fP47a2tqgxyuRTRDIuiMmmyEUjf9iIbWTT9v1192YR8ndvxoNGuVCXcBjAxIjBKExeHGgVGCo1HgLsddXetHQamqn0vErOTk50Ov1YRMIkbi4a6GHExFaSIwQhEZRIjBUjolbyvWVXDTUFmP+CJXLINwCgRZ3QmuQGCEIjSI3m0BOKW2n0wmn0wmDweDRRt7f9dPT02Gz2RRfRNUWY/7OFcrS5CQQiFiGxAhBaBQ52QRy4i3EBNHm5uZi9erVIXEvpKenQ6fTBQ3u1Ol0SE9P9/uckuKB5X5u3boVSUlJ6OzsjAjXB0FoCfqlEISGkVpcTUy8hTv8Ai70WrPZjIKCAuzevdvnWH6xt1qtQc8hRGtra1AhAlwsmd7a2urzOKsYYy0ex1q99K233sLGjRuxdu1arFq1SvY9IIhYgSwjBKFxpMQTSIm3YFnADQYDysrKkJGRgdWrVwc9Vm6mi5yYEaWDX6UUHaPOsgTBDokRgogAxMYTSIm3YFnAHQ4H9Ho9WltbQ57pIidmROkS9XKKjkV6+jFBhAP6dRBEFCK29wwgbgEPRz8aKe+BR+kS9SxjCYRSvWUIIpohMUIQUYiUzsJiFvBw9KOR0x1ZjpCROpZgUJNAgggOiRGCiFLEBr+KWcCVXuwDITWAV46QETsWFqizLEEEh3rTCEC9aYhIR0zRLzG9S8LZ50Rq4bJQFClzOp2w2WyoqKgIWoPF/XpK9ZYhiEiDetMQRAwjdfEW07sknH1OpBYEC0VlU71eD71ezyREAOosSxAskBghiChDrjVAzAIeCX1OQlHZlDUGJD8/n9J6CYIBEiMEEUUoVXVUzAIei2XMWWNAJk6cGOKREER0oJ3tC0EQslC66igRmHAF8BJErEBihCCiBKkl4AnxhCJbhyBiGfqlEESUEI5CZJEOnwnT0NAAm80my0okNe041Cj5HgkiXFDMCEFECeEoRBbJhCLNV2sBvKF4jwQRDsgyQhBRAsUxBCZQN2IlOgzzAbyTJ09GZmamqkIkVO+RIEINiRGCiBIojsE/sRDYGwvvkYhuYmtWIogoR6txDGoSC4G9WnqPFLNCSIFiRggiytBaHIPaxEJgr1beI8WsEFIhMUIQUUgsFiILRCwE9mrhPSpVcI+ITWJzq0QQRMwQC4G9ar9Hilkh5EJihCCIqCYWAnvVfo9ailkhIpPI/fURBEEwolRgr5aDM9UMXhYbs6Ll+0ioA8WMEAQRE8gN7I2E4Ey1gpfFxKxEwn0kwo+O4zhO7UFoGbvdjtTUVLS3twv6ZAlCCzidTsqkUZhAwZk8sR6c6XQ6sWrVqqCuGrPZjOLiYlRUVAQ8JtbvYzTCuoaSZYQgogjadSoPa3BmdnZ2zIo+PmYlmGArLi5GdXV10PPE+n2MZegTJ4gogcqBhwYKzmRDKGYlJSWF7iMRELKMEEQUoPXdeyS7jrRSUCwSCBaz0tDQwHQOuo+xCYkRgogCxOzew10MLdJdR0oUFItkMSaWQAX3tFCYjdAuJEYIIgrQ6u49Gqpy8gXFhIIzAxUUi3QxphRy7yMR3USnNCeIGEOLu85oqcopp6AYxfH8G7ULsxHahj51gogC1C4H7o9oCvyUUlAsWsSYklBXaSIQ5KYhiCiAJbUy3LtOrbqOpCK2oJiW43jUhLpKE/4gMUIQUQK/69RKfIIWXUdyEdMNOdrEmJJQV2nCGxIjBBFFaGnXGU0Bi1KyYaJRjBFEqCAxQhBRhpZ2ndOmTUNNTU3A5yMhYLGpqQlbtmxBV1eX6zEWa1M0iTGCCDXangUIgog4nE4nduzYgRdffDGgEImUgMXt27ejoqLCQ4gAbNkwlD1CEOyQZYQgCMWwWq3YvHkzHA5HwGOKiopQWFio+UW4qakJu3fvDnqMUFVbrcXxEIRWiVoxsm/fPjz11FOoq6tDb28vcnJy8KMf/Qh33nmn2kMjiKhEqLMtz8GDB1FYWBiGEUnH6XRiy5YtgsexZMNoKY6HILRKVIqRmpoalJSUIDExEbfffjtSU1OxceNG3HXXXbDZbPjpT3+q9hAJIqpgqanBEwnprC0tLT6umUCwZMNoKY6HILRI1Enz/v5+3H///dDpdNi5cyf+9Kc/4cUXX8ShQ4eQk5ODp556CkePHlV7mAQRVbDU1HBH6+msYsZH2TAEIZ+oEyMfffQRjh07hjvvvBNXXnml63GTyYRf/OIX6O/vx5o1a1QcIUFEH2LFhdYXcNbxGY1GyoYhCAWIOjcNH71fXFzs8xz/2I4dO8I5JIKIesSIi0hIZ2VJywWABQsWMMd+xFLnXoIQS9SJEd4FM378eJ/nhgwZgmHDhgV10/T09KCnp8f1txjTM0HEKqyLNxAZ6aws5fULCgqQk5PDdD7q3EsQwdH2jCCB9vZ2AEBqaqrf581ms+sYf6xcuRKpqamuf2PGjAnJOAkimmCpqWEwGCKitghPoKZuRqMRZWVlmDt3LtN5qHMvQQgTdZYRuTzxxBN49NFHXX/b7XYSJATBQKCaGgaDAfn5+RFRW8QbuWm5rJ17g9UqIYhYIOrECG8RCWT9sNvtAa0mAJCUlISkpKSQjI0gop1orKkhJy2XOvcSBBtRJ0b4WJGjR49i+vTpHs+dO3cOZ8+eRUFBgRpDI4iYgGpq/Bvq3EsQbETudiUAs2fPBgBUV1f7PMc/xh9DEAQRSqhzL0GwEXViZM6cOcjKysI777yDzz77zPV4R0cHfvWrXyE+Ph7Lli1TbXwEQcQOfJZRMCIh1ZkgQk3UiZH4+Hi89tprcDqdKCwsxPe+9z089thjmDJlCpqamrBixQpMmDBB7WESBBEDUOdegmBDx3Ecp/YgQsHevXv9Nsq76667RJ2HD3htb28X3OEQBEH4g+qMELEK6xoatWJEKUiMEAShBFSBlYhFWNfQqMumIQiC0CKUZUQQgSFZThAEQRCEqpAYIQiCIAhCVUiMEARBEAShKiRGCIIgCIJQFRIjBEEQBEGoCokRgiAIgiBUhcQIQRAEQRCqQmKEIAiCIAhVITFCEARBEISqkBghCIIgCEJVSIwQBEEQBKEqJEYIgiAIglAVEiMEQRAEQagKiRGCIAiCIFSFxAhBEARBEKpCYoQgCIIgCFUhMUIQBEEQhKqQGCEIgiAIQlVIjBAEQRAEoSokRgiCIAiCUBUSIwRBEARBqAqJEYIgCIIgVIXECEEQBEEQqkJihCAIgiAIVSExQhAEQRCEqpAYIQiCIAhCVUiMEARBEAShKiRGCIIgCIJQFRIjBEEQBEGoCokRgiAIgiBUhcQIQRAEQRCqQmKEIAiCIAhVITFCEARBEISqkBghCIIgCEJVSIwQBEEQBKEqJEYIgiAIglAVEiMEQRAEQahKvNoDIAiCIAgxOJ1OtLS0oKOjAyaTCRkZGdDraW8dyZAYIQiCICIGq9WKqqoq2O1212Nmsxnz5s2DxWJRcWSEHEhKEgRBEBGB1WrF+vXrPYQIANjtdqxfvx5Wq1WlkRFyITFCEARBaB6n04mqqqqgx1RVVcHpdIZpRISSkBghCIIgNE9LS4uPRcQbu92OlpaWMI2IUJKoEyM7d+7EY489huuuuw6pqanQ6XRYtmyZ2sMiCIIgZNDR0aHocYS2iLoA1tdffx1r166F0WhERkaGoJImCIIgtI/JZFL0OEJbRJ1l5D//8z/R2NgIu92ONWvWqD0cgiAIQgEyMjJgNpuDHmM2m5GRkRGmERFKEnViZMaMGcjJyUFcXJzaQyEIgiAUQq/XY968eUGPmTdvHtUbiVDoUyMIgiAiAovFgsWLF/tYSMxmMxYvXkx1RiKYqIsZkUtPTw96enpcf7e3twMAxZ4QBEFogNGjR+Oee+7ByZMnceHCBQwaNAhjxoyBXq+neVqD8J8Jx3FBjyMx4sXKlSvx9NNP+zw+ZswYFUZDEARBEJFPR0cHUlNTAz6vSTEybNgwfPvtt8zHf/zxxygqKlLk2k888QQeffRR199OpxNtbW0YOnQodDqdItfQIna7HWPGjMHJkycFg8QI7UOfZ/RBn2l0ESufJ8dx6OjowKhRo4Iep0kxcscdd4jKFR85cqRi105KSkJSUpLHY4MHD1bs/FrHbDZH9Q8j1qDPM/qgzzS6iIXPM5hFhEeTYmT16tVqD4EgCIIgiDBB2TQEQRAEQagKiRECwEX31FNPPeXjoiIiE/o8ow/6TKML+jw90XFC+TYRxieffILXXnsNAHDmzBls2bIF48aNwzXXXAMAmDhxIn7yk5+oOUSCIAiCINyIOjHyxhtv4J577gn4/OzZs1FTUxO+AREEQRAEEZSoEyMEQRAEQUQWFDNCEARBEISqkBghCIIgCEJVSIzEOPv27cOCBQswZMgQpKSkIC8vD++8847awyJEcurUKbz66qsoLi5GRkYGEhMTMXLkSCxatAh79uxRe3iEAjz//PPQ6XTQ6XSor69XeziEDDZt2oS5c+di6NChMBgMGDt2LO644w6cPHlS7aGphiaLnhHhoaamBiUlJUhMTMTtt9+O1NRUbNy4EXfddRdsNht++tOfqj1EgpHVq1fjueeew7hx4zB37lyMGDECR48eRWVlJSorK/Huu+9i8eLFag+TkIjVasWTTz6JlJQUdHZ2qj0cQiIcx+HBBx/E//7v/2LcuHG4/fbbYTKZ8NVXX2HHjh348ssvY7YPGgWwxij9/f2YOHEiWltbUVdXhyuvvBLAxWZGs2bNQnNzMw4fPozx48erPFKChY0bN2L48OEoLCz0eLy2thZz5sxxTXhU0yDyGBgYwKxZs6DT6TBhwgSsW7cOdXV1mDlzptpDI0Ty29/+FuXl5Xj44YexatUqxMXFeTzf39+P+PjYtBGQmyZG+eijj3Ds2DHceeedLiECACaTCb/4xS/Q39+PNWvWqDhCQgwLFy70ESIAUFhYiOuuuw5tbW1oaGhQYWSEXJ577jkcOnQIr7/+us/iRUQODocDTz/9NLKysvDqq6/6/SxjVYgA5KaJWfhaK8XFxT7P8Y/t2LEjnEMiQkRCQgKA2J7oIpXGxkY8/fTT+PnPf46cnBy1h0PIYPv27Whra8OyZcswMDCA999/H//85z8xePBgXH/99bj88svVHqKq0OwUoxw9ehQA/LphhgwZgmHDhrmOISKXlpYW/P3vf8fIkSMxefJktYdDiKC/vx/Lli2DxWKhqtFRwP79+wFc3BRMmTIFzc3Nruf0ej0eeeQRvPjii2oNT3XITROjtLe3Awjc2tlsNruOISKTvr4+LFmyBD09PXj++efJxB9h/PrXv3a5Z3jrFhG5nD59GgDw0ksvwWw2Y+/evejo6MDOnTsxYcIEvPTSS/j973+v8ijVg8QIQUQhTqcT9957L3bu3IkHHngAS5YsUXtIhAgOHTqEZ555Bo899himTZum9nAIBXA6nQCAxMREVFZW4qqrrsKgQYNQWFiIiooK6PV6vPTSSyqPUj1IjMQovEUkkPXDbrcHtJoQ2objODzwwANYt24d7r77bvzhD39Qe0iESJYuXYpx48ZhxYoVag+FUAh+Pp0xYwZGjRrl8VxOTg6ysrJw7NgxnD9/XoXRqQ+JkRiFjxXxFxdy7tw5nD17ltJ6IxCn04n77rsPr7/+Ou644w688cYb0OvpZx5pHDp0CEeOHEFycrKr0JlOp8PatWsBwJXqW1lZqe5ACWays7MBAIMHD/b7PP+4w+EI04i0BQWwxiizZ8/GypUrUV1djdtvv93juerqatcxROTgdDpx//33Y82aNbjtttvw1ltvUZxIhHLffff5fXznzp04evQobrrpJgwfPhyZmZnhHRghmeuuuw7AxQJ23vT19eGLL75ASkoKhg8fHu6haQOOiEn6+vq4rKwsLikpifv0009dj9vtdi4nJ4eLj4/nmpub1RsgIYqBgQFu2bJlHADuO9/5DtfX16f2kIgQsHTpUg4AV1dXp/ZQCAkUFxdzALg//elPHo//8pe/5ABwd999t0ojUx+yjMQo8fHxeO2111BSUoLCwkLccccdMJvN2LhxI06cOIFnnnkGEyZMUHuYBCO//OUv8cYbb2DQoEGYMGECnnnmGZ9jbrnlFkydOjX8gyMIAgDwu9/9DgUFBXjggQdQWVmJiRMn4tNPP8VHH32Eyy67DC+88ILaQ1QNEiMxzHXXXYdPPvkETz31FNavX4/e3l7k5OTgV7/6Fe666y61h0eIwGazAQAuXLiAZ5991u8xmZmZJEYIQkXGjRuH/fv348knn0RVVRWqq6sxcuRIPPzww3jyyScxYsQItYeoGtSbhiAIgiAIVaEwe4IgCIIgVIXECEEQBEEQqkJihCAIgiAIVSExQhAEQRCEqpAYIQiCIAhCVUiMEARBEAShKiRGCIIgCIJQFRIjBEEQBEGoCokRgiAIgiBUhcQIQRAEQRCqQmKEIAiCIAhVITFCEARBEISqkBghCIIgCEJVSIwQBBExcByH4uJi6HQ6bNiwweM5p9OJ//iP/4BOp0NlZaU6AyQIQhI6juM4tQdBEATBytdff40rrrgC/f39OHToEMaMGQMA+M1vfoMnnngC3//+9/GHP/xB5VESBCEGEiMEQUQcH3zwAUpLS1FYWIiamhocPHgQBQUFuPzyy3HgwAEYDAa1h0gQhAhIjBAEEZEsX74c//3f/43HH38cGzduxJdffok9e/Zg6tSpag+NIAiRkBghCCIi6e7uRl5eHhoaGgAAL7/8Mh555BGVR0UQhBQogJUgiIgkOTkZ8+fPBwAYjUbce++9Ko+IIAipkBghCCIiqaurw8svv4yhQ4eiq6sLDz/8sNpDIghCIiRGCIKIOOx2O+666y4kJCRg586duPnmm/H2229j3bp1ag+NIAgJUMwIQRARx1133YV33nkHv//97/Hggw/i22+/xRVXXIGOjg589tlnyMrKUnuIBEGIgCwjBEFEFG+99Rbeeecd3HTTTXjwwQcBAEOHDsXatWtx4cIF3HXXXejv71d5lARBiIHECEEQEcPx48fx8MMP49JLL8Wf//xnj+euv/56/PjHP0Z9fT1WrFihzgAJgpAEuWkIgiAIglAVsowQBEEQBKEqJEYIgiAIglAVEiMEQRAEQagKiRGCIAiCIFSFxAhBEARBEKpCYoQgCIIgCFUhMUIQBEEQhKqQGCEIgiAIQlVIjBAEQRAEoSokRgiCIAiCUBUSIwRBEARBqAqJEYIgCIIgVOX/A4/vSkrpHIoeAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot as scatter\n", "\n", "plt.figure(figsize=(6,6))\n", "plt.scatter(x_rand, y_rand, **random_dict) # all values as orange points\n", "\n", "# The mean (x,y) as a blue star:\n", "plt.scatter(np.mean(x_rand), np.mean(y_rand), **mean_dict) \n", "plt.xlabel('x')\n", "plt.ylabel('y')\n", "plt.xlim([-1 , 7])\n", "plt.ylim([-1 , 7])\n", "plt.legend(loc='upper left')" ] }, { "cell_type": "markdown", "id": "4259d533-3376-45a3-b1c6-262870c41acd", "metadata": {}, "source": [ "### Histogram" ] }, { "cell_type": "code", "execution_count": 89, "id": "f5ff429a-6541-4885-a962-b9bfe7224750", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:20.433070Z", "start_time": "2022-03-08T14:59:19.311482Z" } }, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'occurences')" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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hIRaqgSovjo/JSRJc+bM0YQJExQfH6+8vDwVFBRo+/btKikp0ZAhQ7R+/XqvXSs+Pl52u9115OXlee21AQBA5ep8YNmyZYuefvppTZ8+XU888YTatWungIAADRo0SO+++66aNm2qmJgYSf8eWalqBKVseqeqERhJslqtCgwMLHcAAICaVecDy3vvvSdJGjJkSIW2Nm3aqHfv3jp69Kh++OGHcmtUKnOpNS4AAMA36nxg+eWXXyRJ33//faXtZeetVqvCw8MVEhKirKysChvEFRUVKTMzUyEhIerSpUvNFg0AAC5LnQ8sgwYNkiTNnz+/wlTPihUrdPDgQfXr108tWrSQxWJRdHS0CgoKlJSUVK5vcnKyTp8+rejoaFksllqrHwAAXFqdv0vo7rvv1t///ndlZGQoPDxcI0eOVFBQkHJycvThhx/KarVqwYIFrv5xcXFKT09XSkqK9u7dq379+iknJ0cbN25U3759FRcX57s3AwAAKlXnR1iuuOIKvf/++5o3b57at2+vN954QwsWLNBXX32l++67T3v27NHNN9/s6h8QEKCMjAzFxMRo//79Sk1N1b59+xQTE6OMjIwKG8oBAADfszjZh94jDodDNptNdrudO4YAN7BHinnYhwW15XK+Q+v8CAsAAKj/CCwAAMB4dX7RLQBzMd0DwFsYYQEAAMYjsAAAAOMRWAAAgPEILAAAwHgEFgAAYDwCCwAAMJ7bgaWgoEBHjx5VSUlJufP/+Mc/NG7cOE2ePFnZ2dme1gcAAOD+Pix//vOftWLFCv3rX/+Sn9+Fl1m8eLGmT5+ust3+16xZoz179qhbt27eqRYAADRIbo+wbNu2TcOGDSv3sMDk5GRdffXVyszM1Nq1a3X+/Hn97W9/80qhAACg4XJ7hCU/P1/Dhg1z/fzFF1/o2LFjSklJcT0d+c0339TWrVs9rxIAADRobgeWn3/+Wf7+/q6ft2/fLovFoqioKNe5sLAwpaene1YhAMAo1XnkAk98hre5PSXUrl07ff75566f33vvPQUFBal3796ucz/++KOaN2/uWYUAAKDBc3uE5fe//71eeOEFPf7442rSpInef/99PfDAA7JYLK4++/fvV4cOHbxSKAAAaLjcDizx8fF65513lJqaKkkKDg4uN0x49OhRZWVl6b//+789rxIAADRobgeW4OBgffnll/roo48k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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plotting the same data in a different way using the same plot style\n", "plt.figure(figsize = (6,6))\n", "plt.hist(x_rand, bins=50, **random_dict)\n", "plt.xlabel('x')\n", "plt.ylabel('occurences')" ] }, { "cell_type": "markdown", "id": "f433ccaf-30c1-43e1-82b6-46408e7b6f7c", "metadata": {}, "source": [ ">**when we change the dictionary, all we need to do is rerun the code**" ] }, { "cell_type": "markdown", "id": "820c8b8e-d2c1-4572-bc47-4ca71334ed55", "metadata": {}, "source": [ "### Contour plots" ] }, { "cell_type": "code", "execution_count": 90, "id": "60598ab5-a8b5-4ccf-b341-f7164c0b2725", "metadata": { "ExecuteTime": { "end_time": "2022-03-08T14:59:20.915056Z", "start_time": "2022-03-08T14:59:20.436023Z" } }, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, '$y$')" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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d5PAAQA0CScfw1feeOMN/fKXv1RcXJyys7O1b98+n78GgQOYHFMc32CK4ztEDlrrs88+0/3336+qqirNnTtXPXr00DXXXKNVq1bp5MmTPnkNAgeAYxA5vkPkoDX69eunxYsX68CBA/qf//kfjR49WuvWrdNNN92kiy66SP/93/+tL7/8slWvQeDAbzgPx3eY4vgOkeM7bFmhtc477zzddNNNeuutt7R792499NBDatu2rf7whz+oX79+GjFihF588UVVVzf/70BbBc7rr7+uMWPG6MILL1Tbtm3VvXt3TZo0SaWlpUYvDWg1Isd3iBzfInLgC7GxsXrooYe0aNEide3aVR6PRxs3btRtt92mbt266Q9/+INqamqa/P1C/LjWgPF4PLr77ru1bNky9ezZUxMnTlRkZKQOHjyod999V3v37lVsbKzRywRgIpF7PaqICzJ6Gbbh2heq6ouPG70MWNTOnTuVm5ur559/Xl9//bVCQ0N1yy23aMqUKdq6dauefPJJ/fd//7e+/vprPfroo036nrYInMcff1zLli3T9OnT9dhjjyk4ONjreV+dsITmC92xX8f7djN6GbYRvata5T1dRi/DNogc3yJy0BzV1dV69dVXlZubq/fee08ej0d9+vTRzJkzlZKSovbt20uSxowZo/vvv19jxozR888/75zAOXbsmObMmaMePXpo6dKl9eJGkkJCLP9jAnWIHN8icnyrdruK0MHZ3HfffXrxxRdVXl6u0NBQTZw4UVOnTlVSUlKDx7tcLo0bN06FhYVNfg3L/+Zft26dvvvuO6WkpOjUqVNas2aNvvzyS11wwQUaPXq0evXqddavr66u9jp5ye12+3vJAEyGyPE9pjk4myeffFK9e/fWrFmzlJKSogsvvPCcXzNixAhlZmY2+TUsHzhbtmyRdHpKM2jQIH3xxRd1z7Vp00ZpaWn6wx/+0OjXz58/X3PmzPH7Op2MbSrfY4rje0SO7xE5aMyGDRs0YsSIZn3NsGHDNGzYsCYfb/mrqA4dOiRJWrRokaKiolRUVKSKigpt3LhRvXv31qJFi/TUU081+vUZGRkqLy+v++CKK1gFV1X5HldX+R6XkuPHdu3a5RU3u3bt8svrWD5wai8ZCw0N1erVq3XppZcqIiJCw4cP18qVK9WmTRstWrSo0a93uVyKiory+gDgXESOfxA5kKTS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MQAA2A2/Bxtm+cD5+c9/rh49euill17Stm3b6h6vqKjQ73//e4WEhCglJaXJ38/lcikrK4u9zv/Dn0d9/Jl448/DG38e3vjz8D9f/x60C8vfyViS3nnnHY0bN04ul0uTJk1SVFSUVq1apd27d2vevHmaNWuW0UsEAMBv+D1Yny0CR5KKioqUlZWlDz74QMePH9eAAQP0X//1X/r1r39t9NIAAPA7fg96s03gAAAA1LL8OTgAAAA/RuAAAADbIXD+z0cffaRrr71W7dq1U3h4uC677DK99NJLRi8r4A4cOKClS5dq7Nixuvjii+tuRz5hwgR9+OGHRi/PFHJychQUFKSgoCBt3rzZ6OUY6vXXX9eYMWN04YUXqm3bturevbsmTZqk0tJSo5cWUB6PR6tWrdLIkSPVtWtXnX/++erTp4+mTZumf//730Yvz29WrFihadOmaciQIXK5XAoKClJeXl6jx7vdbs2YMUNxcXFyuVyKi4vTjBkz6r3nEuALnIOj0+/EOm7cOIWGhmrixImKjo6uO/v84Ycf1oMPPmj0EgPmgQce0MKFC9WzZ08lJSWpU6dOKikp0erVq+XxePTyyy/rV7/6ldHLNMznn3+un/70pwoJCVFlZaU++OADXX755UYvK+A8Ho/uvvtuLVu2TD179tS4ceMUGRmpgwcP6t1339WLL76oK6+80uhlBsxvf/tbLV68WF27dtV1112nqKgoFRcX6+2331ZERITef/99/cd//IfRy/S5+Ph47d27Vx06dFB4eLj27t2r5cuXN3hJcmVlpa688kpt27ZNY8aM0SWXXKLi4mK99dZbSkxM1KZNmxQeHh74HwL25XG4EydOeHr27OlxuVyejz/+uO5xt9vtGTBggCckJMTz5ZdfGrjCwHrttdc8GzdurPf4xo0bPeedd56nffv2nqqqKgNWZryTJ096Lr30Us9ll13mmTx5skeS54MPPjB6WYZ47LHHPJI806dP95w8ebLe8ydOnDBgVcb4f//v/3natGnjiY+P95SXl3s9t2TJEo8kz+23327Q6vxr3bp1nj179ng8Ho9n/vz5Hkme5cuXN3hsZmamR5InPT29wcczMzP9vVw4jOO3qDZs2KBdu3bplltu0U9/+tO6xyMjI/XQQw/p5MmTWr58uYErDKwbbrhBw4cPr/f48OHDNXLkSH333Xfavn27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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x_contour = np.arange(0, 11, 0.1)\n", "y_contour = np.arange(0, 11, 0.1)\n", "# Create 2D meshgrid of x and y values:\n", "X,Y = np.meshgrid(x_contour, y_contour)\n", "z = X * Y\n", "\n", "plt.figure(figsize = (6,6))\n", "\n", "plt.contourf(X, Y, z) ##\n", "cbar = plt.colorbar() ##\n", "cbar.set_label('z = x*y') ##\n", "\n", "plt.xlabel('$x$')\n", "plt.ylabel('$y$')" ] }, { "cell_type": "markdown", "id": "0e49155c-e32a-4889-a5e8-ac34abd89125", "metadata": {}, "source": [ "### Pie charts" ] }, { "cell_type": "code", "execution_count": 91, "id": "33954a21-eb5b-48c5-abbc-5280f0ef8afb", "metadata": {}, "outputs": [ { "data": { "image/png": "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4gpzy5Yt/sdcLpd5//33m4BZuXJl8+jRo7mOPft97du3r3ngwAH/Y+vXrzerVatmAubDDz+c5zXmV3YKKqdERkREmE6n01ywYIH/sbS0NHPChAkmYMbGxpq7du3KdWxOobLb7WZiYqL5ww8/+B9LT083TdM0v/rqK38pfvjhh3MVtnnz5vl/cfnHP/6R69wHDx70f76MHTvWPH36tP+xzz//3IyPj/eX5vyKsd1uNytVqpTrlxGXy+X/mC9dutRcvnx5nl9y9uzZYw4ZMsQEzEmTJuV5z3Jed0RERJ7P8++//96sUKGCCZjDhw834+LizIULF/ofP3z4sP+XpxtuuCHPuYvza+xCxTgiIsJMTEw0v//++1x5u3Tp4v9F41w5xb9SpUrmihUr/NtPnjxpjhw50v8xUjGWUKJiLCKmaRZdMa5evbp56tSpPI937NjRf7X0u+++y/P4fffdZwLm1VdfnWv7d9995//hun///oC57rzzThMwb7311gu8yj/kXO06+0rrheS89iZNmuQpzaZpmjNmzDABs1q1aqbL5fJvf/fdd/1X2gK9N6ZpmldddZUJmDNnzsy1Ped9rVKlinn8+PE8x82aNcv/S8O5iqoYAwGvMns8HrNJkyYmYE6ePDnXYzmFCjDXrFkT8PyXX365CZiDBg0K+PjUqVMDvp85527RokXAq/MvvfRSvp/PZ7+md95550JvQUBpaWlmRESEGRcXl+f5c7Ll93n+17/+1f/8Tz31VJ7HP/74Y//V83MV19eYaV64GAPmypUr8xy3bt06/3Oe/bV06tQp/18V3n333TzHuVwus0GDBirGEnI0xlhEitSoUaOIi4vLs719+/YAtG7dmk6dOuV5vEOHDgBs37491/b33nsPgKuuuoqaNWsGfM5rr70WgK+++qrAOevWrQvAm2++WeBjctx1113YbHm/fd5xxx04HA4OHz6ca9xlzmsYM2ZMwPcGLvwaRo8eTcWKFfNsz1l+L78xykUhIiKCO+64I892m83GXXfdBcDixYsDHtu8eXM6d+6cZ3taWhorVqwA4L777gt47D333IPdbufw4cN8//33/u2ffvopAGPHjsVut+c5bsyYMURHR5/3NcXHx/vf8/ykpqby0ksvMW7cOPr160fPnj3p0aMHffv2xWazcfr0abZu3Rrw2Pw+z3O+DgD+9Kc/5Xk85+vgxIkTHD9+POC5i/prrCBatWpFz549Az5nVFQUpmnmOu/XX3/N6dOnqVChAtdcc02e4yIjI7nxxhuDziFS3LRcm4gUqUaNGgXcnrM28oUeP3dS04YNGwBYvnw5PXr0CHhsZmYm4JswVVBTpkzhlltu4c4772T27Nn07duXzp0706tXLxo0aHDeY1u0aBFwe/ny5alduza7du1i06ZNdO3aNddreOedd1i6dGnAY8+e9BVI48aNA26vXr06kPd9K0q1a9emfPnyAR+79NJLAdi6dSsejydPUW3evHnA47Zt2+afqNiyZcuA+1SqVIlatWqxZ88eNm/eTLdu3QDYsmUL4CuAgTidTho3bpzvJDbwvZ8OR/4/AleuXMmIESM4fPhwvvsA+U5mu9DneZUqVQK+p2evIX769GkqVaoU9LmD/RoriPw+/wzDoFq1auzduzfXeXM+Rpdeemm+73N+Hz8RK6kYi0iRio2NDbg9ZyWLCz3u9Xpzbc+Zwb97927/Kgv5ycjIKHDOiRMnUqFCBWbPns13333Hv//9b/79738D0KlTJ5566il69eoV8NicMprfY7t27eLUqVN5XsOWLVv8hSE/6enpAbfn977lXLk2z1lBoyhd6PXmPP/p06fzlL38cue8Pw6Hg8qVK+d7/ho1arBnz55c72dOAStXrly+x53vsfPlAt+V4uHDh3PkyBGuuOIK7r//flq1akXFihWJiIgAfH9x2Lt3L9nZ2UGdv6BfB5D3a6Gozp3fec/nfO9Xzufg2ectio+RiBU0lEJEQlrOn4yfeeYZTN+8iPP+C8bw4cP59ttvOX78OIsXL2bKlCkkJiaydu1a+vXrl+8Vx0OHDuV7zpzHzv6hn/MaPvroowvmD8XbNxfk9RqGke8wkUBy3h+3233eZfoOHjyYa3/44/08uyyf63yPXcjixYs5cuQIderU4eOPP+bKK6+kWrVq/lJsmma+wxzEp7g/RiLFRcVYREJazp/Zc25ZXRzKly/PgAEDePLJJ/n999/p3LkzLpeLV199NeD+GzduDLj95MmT/qEQzZo1828vidcQSKD1pgtj3759pKamBnws57245JJLAo73zU+jRo38f2L/9ddfA+5z4sQJ9u/fD+R+P3NuS54zROVcmZmZ/P777wXOcq6dO3cC0LFjx4BjlX/++WfS0tIKff6yIOdjtHHj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cdSti71ePWyxsVanEpEQoGIsIlJKmNnZePbvx71nD569e3Hv2weZmVbHspwRF4e9WjXsder4inDt2roiLCIBqRiLiJRSpmniPXIEz8GDeI8dw3vsGJ5jx3wT+rKzrY5X5Iy4OGxVq2KvWtX332rVsFetiuF0Wh1NRMKEirGISBljmiZmauofRflMWfYePYo3JQVC+ceCYWDExmKrUsVXgM+UX1u1athUgEXkIqkYi4iIn+nx4D1xAm9KCmZ6OmZaGmZ6Ot4z/zXT0jAzMzFdLkyXC7KyLv5JIyJ8ZTc2FiMuDiMmBltcHEZs7B/bcx5zOjEM4+KfU0QkABVjEREpNNM04UxJNnOGZ9hsvvJ6nn+GYYDN5ts3IsLaFyEicoaKsYiIiIgIYLM6gIiIiIhIKFAxFhERERFBxVhEREREBFAxFhEREREBVIxFRERERAAVYxERERERQMVYRERERARQMRYRERERAVSMRUREREQAFWMREREREUDFWEREREQEUDEWEREREQFUjEVEREREABVjERERERFAxVhEREREBFAxFhEREREBVIxFRERERAAVYxERERERQMVYRERERARQMRYRERERAVSMRUREREQAFWMREREREUDFWEREREQEUDEWEREREQFUjEVEREREAPj/Zx4v1QDKNAoAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sizes = [20, 80]\n", "labels = ['Actual Programming', 'Debugging']\n", "colors = ['gold', 'lightcoral']\n", "explode = (0.1, 0) # explode 1st slice\n", "\n", "plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', startangle=140)\n", "plt.axis('equal')\n", "plt.title('Time spent programming')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "77fdcb09-8879-4118-bafb-b1dee3b3d324", "metadata": {}, "source": [ "### Summary\n", "\n", "Matplotlib is a powerful plotting library that can produce professional looking plots.\n", "\n", "In the advanced courses we will look at\n", "+ inset Plots\n", "+ interactive plots & widgets\n", "+ creating videos from a series of plots\n", "+ advanced plotting options\n", "+ making plots publication ready\n", "\n", "If you are interested:\n", "+ [Python Basics](https://training-scientists.com/python-basics-course/)\n", "+ [Python for Scientists & Engineers](https://training-scientists.com/python-for-scientists-and-engineers/)\n", "+ [Python for Biologists](https://training-scientists.com/python-for-biologists/)" ] }, { "cell_type": "markdown", "id": "ec45c232-23b7-40a0-8f25-d447bd2f754a", "metadata": {}, "source": [ "> Ask Claude 🤖💬: `What are the key components of a matplotlib figure and what does each do?`\n", "\n", "> Ask ChatGPT 🤖💬: `Create a matplotlib plot with multiple y axes`" ] }, { "cell_type": "markdown", "id": "c30f1684-769c-411f-b1ea-a12b448294db", "metadata": {}, "source": [ "## FAQ ❓ & Common issues I see beginners struggle with" ] }, { "cell_type": "markdown", "id": "bac2d43a-bdfb-402a-ba0c-861fa0f7c009", "metadata": {}, "source": [ "### Whenever I look at your code it makes sense, when I try it I get errors 💻❓\n", "Learning programming is like learning anything else. Think of learning a new language or a music instrument.\n", "\n", "It is one thing to watch someone else play the piano and think \"He plays well\". It is another thing entirely to be able to play yourself.\n", "\n", "A few tips:\n", "\n", "+ keep the code cells small. It is easier to find a bug in a cell with 3 lines of code than to find the needle in the haystack\n", "+ work your way forward with as small increments as possible. Write a line of code, execute. Write another line, execute etc.\n", "+ learn how to read error messages (the important stuff is always in the last line)\n", "+ use AI tools. Copy/paste buggy code to ChatGPT/Claude or use Anaconda Cloud. With basic errors they can usually help" ] }, { "cell_type": "markdown", "id": "d8be4309-afd8-4280-a2e0-6f24c1aeec8b", "metadata": {}, "source": [ "### How to think like a programmer? 🤔\n", "\n", "Tricky question. In this video I showed you the tools you need to get started. Imagine you're a handyman and just learned how to use a screwdriver, hammer, saw etc. 🛠️\n", "Instead of trying to build an entire house now, start small. Build a birds house. Then build a dogs house. Then a garage. And THEN try to build a house.\n", "\n", "A few tips 🧩 :\n", "+ programmers usually have a \"divide and conquer\" approach to solving problems. Break the project you have into as many small parts as possible and then solve them one by one. You climb a mountain one step at a time. Don't try to jump to the top in one go. AI tools might help you get there faster and be your Sherpa but they might also lead you on the wrong path.\n", "Divide and Conquer example:\n", " + File IO 💾\n", " + What format is the data in that in want to read in?\n", " + How do I read that type of data in?\n", " + In what kind of data structure do I want to store the data in Python?\n", " + Read in the data\n", " + Was the data read in correctly? (Compare the array in Python with the data in the file)\n", " + Data analysis 🔍\n", " + Here it might make sense to work backwards and start with the question: how do I want the end result to look like?\n", " + decide for the method of data processing: interpolation, fitting, filtering etc.\n", " + process the data\n", " + check if the result makes sense\n", " + Visualization 📊\n", " + decide for the type of plot (histogram, contour plot etc.) that best represents your result and the point you are trying to make with it\n", " + plot the end result of the data analysis\n", " + make the plot publication ready\n", "+ Learn from other people. Like watching DIY home improvement videos you can learn from how other people solve problems. I will create some videos like this in the future, so subscribe ;)" ] }, { "cell_type": "markdown", "id": "6c9c4dbb-8bfb-473e-b670-834bea1b5659", "metadata": {}, "source": [ "### Naming Variables: ❌❌❌ Avoid Keywords and Built-in Functions 💀💀💀\n", "Basically, if the name turns green, it is a reserved name" ] }, { "cell_type": "code", "execution_count": 92, "id": "f3f638ce-2a3a-4915-8378-a154e78cf8b6", "metadata": {}, "outputs": [], "source": [ "# Absolutely do not do this:\n", "#for = 3" ] }, { "cell_type": "markdown", "id": "a1547d37-f606-4c8e-9a40-8886c15121a8", "metadata": {}, "source": [ "### Python Keywords and Built-in Functions Reference 🐍\n", "\n", "**Keywords** 🔑\n", "\n", "| Keywords | Keywords | Keywords | Keywords | Keywords | Keywords | Keywords |\n", "|----------|----------|----------|----------|----------|----------|----------|\n", "| `False` | `None` | `True` | `and` | `as` | `assert` | `async` |\n", "| `await` | `break` | `class` | `continue`| `def` | `del` | `elif` |\n", "| `else` | `except` | `finally`| `for` | `from` | `global` | `if` |\n", "| `import` | `in` | `is` | `lambda` | `nonlocal`| `not` | `or` |\n", "| `pass` | `raise` | `return` | `try` | `while` | `with` | `yield` |\n", "\n", "**Common Built-in Functions** 🧰\n", "\n", "| Functions | Functions | Functions | Functions | Functions | Functions | Functions | Functions | Functions | Functions |\n", "|-------------|--------------|---------------|--------------|--------------|---------------|--------------|--------------|--------------|--------------|\n", "| `abs()` | `all()` | `any()` | `ascii()` | `bin()` | `bool()` | `bytearray()`| `bytes()` | `callable()` | `chr()` |\n", "| `classmethod()`| `compile()`| `complex()` | `delattr()` | `dict()` | `dir()` | `divmod()` | `enumerate()`| `eval()` | `exec()` |\n", "| `filter()` | `float()` | `format()` | `frozenset()`| `getattr()` | `globals()` | `hasattr()` | `hash()` | `help()` | `hex()` |\n", "| `id()` | `input()` | `int()` | `isinstance()`| `issubclass()`| `iter()` | `len()` | `list()` | `locals()` | `map()` |\n", "| `max()` | `memoryview()`| `min()` | `next()` | `object()` | `oct()` | `open()` | `ord()` | `pow()` | `print()` |\n", "| `property()`| `range()` | `repr()` | `reversed()` | `round()` | `set()` | `setattr()` | `slice()` | `sorted()` | `staticmethod()`|\n", "| `str()` | `sum()` | `super()` | `tuple()` | `type()` | `vars()` | `zip()` | `__import__()`| | |\n", "\n", "**Note:** \n", "- Keywords are reserved and cannot be used as identifiers.\n", "- Built-in functions are predefined but can be overwritten (not recommended).\n", "- `True`, `False`, and `None` are constants but treated as keywords.\n", "- This list is based on Python 3.x and may vary slightly in different versions." ] }, { "cell_type": "markdown", "id": "8d4fdadd-34b1-4120-82a2-55b1a1b5b2b6", "metadata": {}, "source": [ "### What's the difference between `=` and `==` in Python?\n", "\n", "- `=` is the assignment operator. It's used to assign a value to a variable.\n", " Example: `x = 5` assigns the value 5 to the variable x.\n", "- `==` is the equality comparison operator. It's used to check if two values are equal.\n", " Example: `if x == 5:` checks if the value of x is equal to 5.\n", "\n", "### Which one of the AI tools should I be using?\n", "- If you don't want to spend any money I would use all 3 and take advantage of the free usage per day limits\n", "- **Anaconda Cloud** is great for in-place debugging\n", "- **Claude** is great with its Artifacts and versions\n", "- **ChatGPT** just released ChatGPT o1 which takes more time to \"think\" which probably just overtook Claude 3.5 Sonnet\n", "\n", "### How do I choose between using a list, tuple, or dictionary?\n", "\n", "- Use a **list** when you have a collection of related items that may change (mutable) and order matters.\n", " Example: `todo_list = ['Study', 'Exercise', 'Cook']`\n", "- Use a **tuple** for collections of items that shouldn't change (immutable) and order matters.\n", " Example: `coordinates = (4, 5)`\n", "- Use a **dictionary** when you want to store key-value pairs for quick lookup.\n", " Example: `person = {'name': 'Alice', 'age': 30, 'city': 'New York'}`\n", "\n", "### What are some common Python libraries for data analysis and when should I use them?\n", "\n", "**Answer:**\n", "- **NumPy**: For numerical computing and working with arrays. Use when you need to perform mathematical operations on large datasets efficiently.\n", "- **Pandas**: For data manipulation and analysis. Great for working with structured data in tables or time series.\n", "- **Matplotlib**: For creating static, animated, and interactive visualizations. Use when you need to create basic plots and charts.\n", "- **SciPy**: For scientific and technical computing. Use for more advanced statistical functions, optimization, and signal processing.\n", "- We cover all of them in the advanced courses\n", " + [Python Basics](https://training-scientists.com/python-basics-course/)\n", " + [Python for Scientists & Engineers](https://training-scientists.com/python-for-scientists-and-engineers/)\n", " + [Python for Biologists](https://training-scientists.com/python-for-biologists/)\n", "\n", "### How can I collaborate on Python projects with others using version control?\n", "\n", "Use Git as your version control system and GitHub, GitLab, or Bitbucket as your remote repository host. We set this up in the advanced courses, try it out and use it together with practical examples." ] }, { "cell_type": "markdown", "id": "0b5ec1ba-eb48-4370-b881-0872ebda2873", "metadata": {}, "source": [ "### How can I improve my skills further?\n", "\n", "1. The exercises for this course are available on https://training-scientists.com. To get a 50% discount, leave a like and a comment under the video and contact me on LinkedIn.\n", "2. Go ahead and play around with this notebook. If anything is unclear, delete it and see what happens. Break things and understand what they are good for. If you are afraid of breaking things, just create a copy of the notebook.\n", "4. Try solving small problems (that ideally are relevant to you) and start coding. Use AI tools to help you but always understand what you are copy pasting.\n", "5. Consider signing up for one of my advanced courses with lots of hands-on exercises, live Zoom sessions to discuss exercises, ask questions and discuss topics beyond the course\n", "\n", "> \"Ask ChatGPT: Can you suggest some small Python projects for beginners to practice their skills?\"" ] }, { "cell_type": "markdown", "id": "dfb424f5-00f5-46a8-b182-b39b96816dca", "metadata": {}, "source": [ "## Glossary 📚\n", "\n", "| Term | Definition |\n", "|------|------------|\n", "| Variable | A named storage location in computer memory that holds data. |\n", "| Data Type | A classification of data which tells the compiler or interpreter how the programmer intends to use the data. |\n", "| Function | A block of organized, reusable code that performs a specific task. |\n", "| List | An ordered, mutable collection of elements in Python. |\n", "| Tuple | An ordered, immutable collection of elements in Python. |\n", "| Dictionary | An unordered collection of key-value pairs in Python. |\n", "| Loop | A programming construct that repeats a group of commands. |\n", "| Conditional Statement | A programming language construct that performs different computations or actions depending on whether a boolean condition evaluates to true or false. |\n", "| Scope | The region of a program where a variable is recognized and can be used. |\n", "| Indentation | The spaces at the beginning of a code line used to determine the grouping of statements in Python. |\n", "| String | A sequence of characters in Python, typically used to represent text. |\n", "| Boolean | A data type that has one of two possible values: True or False. |\n", "| Index | A number representing the position of an element in a sequence (like a list or string). |\n", "| Slice | A portion of a sequence, specified by a range of indices. |\n", "| Iteration | The process of repeatedly executing a set of statements. |" ] }, { "cell_type": "markdown", "id": "72312e32-1eed-418f-8394-d7cc75a65320", "metadata": {}, "source": [ "## Best Practices Summary 🌟\n", "\n", "Throughout this course, we've covered several best practices for Python programming. Here's a summary of key points to remember:\n", "\n", "1. **Code Readability**\n", " - Use descriptive variable and function names\n", " - Follow PEP 8 guidelines for code style (covered in more detail in the advanced courses)\n", " - Keep lines of code between 79-99 characters long\n", " - Use comments to explain 'why', not 'what'\n", "\n", "2. **Function Design**\n", " - Keep functions small and focused on a single task\n", " - Use parameters instead of relying on global variables\n", " - Return values rather than modifying global state\n", "\n", "3. **Variable Scope**\n", " - Keep variable scope as small as possible\n", " - Avoid using global variables within functions\n", "\n", "5. **Data Structures**\n", " - Choose the appropriate data structure (list, tuple, dictionary) for your needs\n", " - Use NumPy arrays for numerical computations when performance is crucial\n", "\n", "7. **Virtual Environments**\n", " - Use virtual environments to manage dependencies for different projects\n", " - Keep your base Python installation clean\n", "\n", "Remember, writing clean, readable, and maintainable code is a skill that develops with practice. Keep these best practices in mind as you continue your Python journey!" ] }, { "cell_type": "markdown", "id": "16ae3083-08cc-498a-ad43-103a07861475", "metadata": {}, "source": [ "> \"Ask ChatGPT: Can you explain the concept of DRY (Don't Repeat Yourself) in programming and give an example in Python?\"" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.3" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": true, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "186.667px" }, "toc_section_display": true, "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "position": { "height": "144.183px", "left": "927px", "right": "20px", "top": "120px", "width": "350px" }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 5 }