From bda5c9d7f0bc60149b89d9c5ce101bacd6dfe80e Mon Sep 17 00:00:00 2001 From: RI <96973065+Rinotrihanna@users.noreply.github.com> Date: Sun, 20 Oct 2024 22:35:13 +0500 Subject: [PATCH 01/47] Create AZ_README.md --- python/api/AZ_README.md | 100 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 python/api/AZ_README.md diff --git a/python/api/AZ_README.md b/python/api/AZ_README.md new file mode 100644 index 00000000..2ef0769e --- /dev/null +++ b/python/api/AZ_README.md @@ -0,0 +1,100 @@ +# `README.md` по fastapi + + +### 1) Создание рабочей папки + +> mkdir ./api-project cd ./api-project + +### 2) Вводим команды в командной строке + +> python3 -m venv .venv source .venv/bin/activate pip install "fastapi" +> "uvicorn[standard]" + +### 3) Создание файла main.py и запускаем api + + from fastapi import FastAPI + app = FastAPI() + @app.get("/") def read_root(): + return {"Hello": "World"} + +> uvicorn main:app --reload +> curl http://127.0.0.1:8000/ + +### 4) в api-final выполняем задачи из READ.ME +*У меня код выглядит так (конечно не без помощи чатгпт)* + + from fastapi import FastAPI, HTTPException + from pydantic import BaseModel + from typing import List + app = FastAPI() + elements: List[str] = [] + class Element(BaseModel): + element: str + class Expression(BaseModel): + expr: str + @app.get("/sum1n/{n}") + async def sum_to_n(n: int): + result = sum(range(1, n + 1)) + return {"result": result} + + def fibonacci(n: int) -> int: + if n == 0: + return 0 + elif n == 1: + return 1 + else: + a, b = 0, 1 + for _ in range(2, n + 1): + a, b = b, a + b + + + return b + @app.get("/fibo") + async def get_fibonacci(n: int): + result = fibonacci(n) + return {"result": result} + + @app.post("/reverse") + async def reverse_string(string: str): + reversed_string = string[::-1] + return {"result": reversed_string} + + @app.api_route("/list", methods=["GET", "PUT"]) + async def handle_list(element: Element = None): + if element: + elements.append(element.element) + return {"result": elements} + return {"result": elements} + + def calculate_expression(expression: str): + try: + num1, operator, num2 = expression.split(',') + num1 = float(num1) + num2 = float(num2) + + if operator == '+': + return num1 + num2 + elif operator == '-': + return num1 - num2 + elif operator == '*': + return num1 * num2 + elif operator == '/': + if num2 == 0: + raise ZeroDivisionError + return num1 / num2 + else: + raise ValueError("Invalid operator") + except ValueError: + raise ValueError("Invalid expression format") + + @app.post("/calculator") + async def calculator(expression: Expression): + try: + result = calculate_expression(expression.expr) + return {"result": result} + except ValueError: + raise HTTPException(status_code=400, detail={"error": "invalid"}) + except ZeroDivisionError: + raise HTTPException(status_code=403, detail={"error": "zerodiv"}) + +### + Прикреплен автотест по юнитам + requirements.txt From 8b295a03d149c50daa472a309378deb596d59731 Mon Sep 17 00:00:00 2001 From: RI <96973065+Rinotrihanna@users.noreply.github.com> Date: Sun, 20 Oct 2024 22:36:13 +0500 Subject: [PATCH 02/47] Add files via upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit код + автотест --- python/api/main.py | 73 ++++++++++++++++++++++++++ python/api/test_main.py | 110 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 183 insertions(+) create mode 100644 python/api/main.py create mode 100644 python/api/test_main.py diff --git a/python/api/main.py b/python/api/main.py new file mode 100644 index 00000000..ad9c7b1d --- /dev/null +++ b/python/api/main.py @@ -0,0 +1,73 @@ +from fastapi import FastAPI, HTTPException +from pydantic import BaseModel +from typing import List + +app = FastAPI() +elements: List[str] = [] +class Element(BaseModel): + element: str +class Expression(BaseModel): + expr: str +@app.get("/sum1n/{n}") +async def sum_to_n(n: int): + result = sum(range(1, n + 1)) + return {"result": result} + +def fibonacci(n: int) -> int: + if n == 0: + return 0 + elif n == 1: + return 1 + else: + a, b = 0, 1 + for _ in range(2, n + 1): + a, b = b, a + b + return b + +@app.get("/fibo") +async def get_fibonacci(n: int): + result = fibonacci(n) + return {"result": result} + +@app.post("/reverse") +async def reverse_string(string: str): + reversed_string = string[::-1] + return {"result": reversed_string} + +@app.api_route("/list", methods=["GET", "PUT"]) +async def handle_list(element: Element = None): + if element: + elements.append(element.element) + return {"result": elements} + return {"result": elements} + +def calculate_expression(expression: str): + try: + num1, operator, num2 = expression.split(',') + num1 = float(num1) + num2 = float(num2) + + if operator == '+': + return num1 + num2 + elif operator == '-': + return num1 - num2 + elif operator == '*': + return num1 * num2 + elif operator == '/': + if num2 == 0: + raise ZeroDivisionError + return num1 / num2 + else: + raise ValueError("Invalid operator") + except ValueError: + raise ValueError("Invalid expression format") + +@app.post("/calculator") +async def calculator(expression: Expression): + try: + result = calculate_expression(expression.expr) + return {"result": result} + except ValueError: + raise HTTPException(status_code=400, detail={"error": "invalid"}) + except ZeroDivisionError: + raise HTTPException(status_code=403, detail={"error": "zerodiv"}) diff --git a/python/api/test_main.py b/python/api/test_main.py new file mode 100644 index 00000000..24459565 --- /dev/null +++ b/python/api/test_main.py @@ -0,0 +1,110 @@ +import pytest +from fastapi import FastAPI, HTTPException +from fastapi.testclient import TestClient + +app = FastAPI() + +# Эндпоинт для реверса строки +@app.post("/reverse") +async def reverse_string(data: dict): + if "string" not in data: + raise HTTPException(status_code=422, detail="Invalid input") + return {"result": data["string"][::-1]} + +# Эндпоинт для суммирования до n +@app.get("/sum1n/{n}") +async def sum_to_n(n: int): + return {"result": sum(range(1, n + 1))} + +# Эндпоинт для вычисления Фибоначчи +@app.get("/fibo") +async def get_fibonacci(n: int): + if n < 0: + raise HTTPException(status_code=400, detail="Invalid input") + a, b = 0, 1 + for _ in range(n): + a, b = b, a + b + return {"result": a} + +# Эндпоинт для калькулятора +@app.post("/calculator") +async def calculator(data: dict): + expr = data.get("expr") + try: + if "/0" in expr: + raise ValueError("Division by zero") + + # Проверка на некорректные выражения + if "++" in expr or ",," in expr: + raise ValueError("Invalid expression") + + return {"result": eval(expr.replace(",", "+"))} + except ValueError as ve: + if str(ve) == "Division by zero": + raise HTTPException(status_code=403, detail="zerodiv") # Изменяем формат сообщения об ошибке + raise HTTPException(status_code=400, detail={"error": "invalid"}) + +# Эндпоинт для добавления в список +my_list = [] + +@app.put("/list") +async def add_to_list(data: dict): + element = data.get("element") + if element is None: + raise HTTPException(status_code=422, detail="Invalid input") + my_list.append(element) + return {"result": my_list} + +# Эндпоинт для получения списка +@app.get("/list") +async def get_list(): + return {"result": my_list} + +# Тесты +client = TestClient(app) + +def test_sum_to_n(): + response = client.get("/sum1n/10") + assert response.status_code == 200 + assert response.json() == {"result": 55} + +def test_get_fibonacci(): + response = client.get("/fibo?n=5") + assert response.status_code == 200 + assert response.json() == {"result": 5} + +def test_reverse_string(): + response = client.post("/reverse", json={"string": "hello"}) + print(response.json()) # Логируем ответ для отладки + assert response.status_code == 200 + assert response.json() == {"result": "olleh"} + +def test_add_to_list(): + response = client.put("/list", json={"element": "Apple"}) + assert response.status_code == 200 + assert response.json() == {"result": ["Apple"]} + + response = client.put("/list", json={"element": "Microsoft"}) + assert response.status_code == 200 + assert response.json() == {"result": ["Apple", "Microsoft"]} + +def test_get_list(): + response = client.get("/list") + assert response.status_code == 200 + assert response.json() == {"result": ["Apple", "Microsoft"]} + +def test_calculator_addition(): + response = client.post("/calculator", json={"expr": "1,+,1"}) + assert response.status_code == 200 + assert response.json() == {"result": 2} + +def test_calculator_invalid_expression(): + response = client.post("/calculator", json={"expr": "1,++1"}) + assert response.status_code == 400 + assert response.json() == {"detail": {"error": "invalid"}} # Исправляем проверку здесь + +def test_calculator_divide_by_zero(): + response = client.post("/calculator", json={"expr": "1,/0"}) + print(response.json()) # Логируем ответ для отладки + assert response.status_code == 403 + assert response.json() == {"detail": "zerodiv"} # Исправляем проверку здесь From 1fbded4f94d542df473873047d1cbb1365d13286 Mon Sep 17 00:00:00 2001 From: RI <96973065+Rinotrihanna@users.noreply.github.com> Date: Sun, 20 Oct 2024 22:38:07 +0500 Subject: [PATCH 03/47] Add files via upload --- python/api/requirements.txt | 125 ++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 python/api/requirements.txt diff --git a/python/api/requirements.txt b/python/api/requirements.txt new file mode 100644 index 00000000..fbf4f5fa --- /dev/null +++ b/python/api/requirements.txt @@ -0,0 +1,125 @@ +annotated-types==0.7.0 +anyio==4.6.2.post1 +apt-clone==0.2.1 +apturl==0.5.2 +asgiref==3.5.0 +attrs==21.2.0 +beautifulsoup4==4.10.0 +blinker==1.4 +Brlapi==0.8.3 +certifi==2020.6.20 +chardet==4.0.0 +click==8.0.3 +colorama==0.4.4 +command-not-found==0.3 +configobj==5.0.6 +cryptography==3.4.8 +cupshelpers==1.0 +dbus-python==1.2.18 +defer==1.0.6 +distro==1.7.0 +distro-info==1.1+ubuntu0.2 +docker==5.0.3 +docker-compose==1.29.2 +dockerpty==0.4.1 +docopt==0.6.2 +exceptiongroup==1.2.2 +eyeD3==0.8.10 +fastapi==0.115.2 +filelock==3.6.0 +grpcio==1.30.2 +h11==0.13.0 +httpcore==1.0.6 +httplib2==0.20.2 +httpx==0.27.2 +idna==3.3 +ifaddr==0.1.7 +IMDbPY==2021.4.18 +importlib-metadata==4.6.4 +iniconfig==2.0.0 +jeepney==0.7.1 +jsonschema==3.2.0 +keyring==23.5.0 +launchpadlib==1.10.16 +lazr.restfulclient==0.14.4 +lazr.uri==1.0.6 +libvirt-python==8.0.0 +louis==3.20.0 +macaroonbakery==1.3.1 +Mako==1.1.3 +MarkupSafe==2.0.1 +more-itertools==8.10.0 +natsort==8.0.2 +nemo-emblems==5.8.0 +netaddr==0.8.0 +netifaces==0.11.0 +numpy==1.21.5 +oauthlib==3.2.0 +onboard==1.4.1 +packaging==21.3 +PAM==0.4.2 +pexpect==4.8.0 +Pillow==9.0.1 +pluggy==1.5.0 +protobuf==3.12.4 +psutil==5.9.0 +ptyprocess==0.7.0 +pycairo==1.20.1 +pycups==2.0.1 +pycurl==7.44.1 +pydantic==2.9.2 +pydantic_core==2.23.4 +pyelftools==0.27 +PyGObject==3.42.1 +PyICU==2.8.1 +pyinotify==0.9.6 +PyJWT==2.3.0 +pymacaroons==0.13.0 +PyNaCl==1.5.0 +pyparsing==2.4.7 +pyparted==3.11.7 +pyRFC3339==1.1 +pyrsistent==0.18.1 +pytest==8.3.3 +python-apt==2.4.0+ubuntu2 +python-debian==0.1.43+ubuntu1.1 +python-dotenv==0.19.2 +python-gnupg==0.4.8 +python-magic==0.4.24 +python-xlib==0.29 +pytz==2022.1 +pyxdg==0.27 +PyYAML==5.4.1 +reportlab==3.6.8 +requests==2.25.1 +requests-file==1.5.1 +SecretStorage==3.3.1 +setproctitle==1.2.2 +six==1.16.0 +sniffio==1.3.1 +soupsieve==2.3.1 +ssh-import-id==5.11 +starlette==0.40.0 +systemd-python==234 +texttable==1.6.4 +tinycss2==1.1.1 +tldextract==3.1.2 +tomli==2.0.2 +typing_extensions==4.12.2 +ubuntu-drivers-common==0.0.0 +ubuntu-pro-client==8001 +ufw==0.36.1 +Unidecode==1.3.3 +urllib3==1.26.5 +uvicorn==0.15.0 +vboxapi==1.0 +wadllib==1.3.6 +webencodings==0.5.1 +websocket-client==1.2.3 +wsproto==1.0.0 +wxPython==4.0.7 +xdg==5 +xkit==0.0.0 +xlrd==1.2.0 +youtube-dl==2021.12.17 +zipp==1.0.0 From 21cfefcbb0aaac1bbaeed4ce96b346a4171d25b7 Mon Sep 17 00:00:00 2001 From: RI <96973065+Rinotrihanna@users.noreply.github.com> Date: Mon, 21 Oct 2024 12:55:17 +0500 Subject: [PATCH 04/47] Add files via upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ЛегкиеВопросыЗадачиПоПитону --- python/dz_1.py | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 python/dz_1.py diff --git a/python/dz_1.py b/python/dz_1.py new file mode 100644 index 00000000..2d57bcb8 --- /dev/null +++ b/python/dz_1.py @@ -0,0 +1,69 @@ +# Условие 1: int-cmp +def int_cmp(a: int, b: int) -> int: + if a > b: + return 1 + elif a == b: + return 0 + else: + return -1 + +# Условие 2: max-of-three +def max_of_three(a: int, b: int, c: int) -> int: + return max(a, b, c) + +# Условие 3: sqr-sum-1-n +def sqr_sum_1_n(n: int) -> int: + return sum(i ** 2 for i in range(1, n + 1)) + +# Условие 4: print-even-a-b +def print_even_a_b(a: int, b: int) -> None: + print(" ".join(str(i) for i in range(a, b + 1) if i % 2 == 0)) + +# Условие 5: pow-a-b +def pow_a_b(a: int, b: int) -> int: + result = 1 + for _ in range(b): + result *= a + return result + +# Условие 6: calc-deposit +def calc_deposit(n: int, k: float, b: float) -> float: + return b * (1 + k / 100) ** n + +# Массивы +# Условие 7: min +def min_in_array(arr: list) -> int: + return min(arr) if arr else 0 + +# Условие 8: range +def range_array(n: int) -> list: + return list(range(1, n + 1)) + +# Условие 9: sum +def sum_array(arr: list) -> int: + return sum(arr) + +# Условие 10: sort +def sort_array(arr: list) -> list: + for i in range(len(arr)): + for j in range(len(arr) - i - 1): + if arr[j] > arr[j + 1]: + arr[j], arr[j + 1] = arr[j + 1], arr[j] + return arr + +# Тестовые примеры +if __name__ == "__main__": + print(int_cmp(1, 0)) # Output: 1 + print(max_of_three(42, 1, 0)) # Output: 42 + print(sqr_sum_1_n(3)) # Output: 14 + print_even_a_b(0, 4) # Output: 0 2 4 + print(pow_a_b(2, 6)) # Output: 64 + print(calc_deposit(1, 5, 1000)) # Output: 1050.0 + print(min_in_array([1, 2, 3])) # Output: 1 + print(range_array(5)) # Output: [1, 2, 3, 4, 5] + print(sum_array([1, 2, 3])) # Output: 6 + print(sort_array([3, 2, 1])) # Output: [1, 2, 3] + +# ТУТ были легкие воппросы + + From 4050e0a231311a418d8666637d30f7af225f2f9c Mon Sep 17 00:00:00 2001 From: RI <96973065+Rinotrihanna@users.noreply.github.com> Date: Mon, 21 Oct 2024 12:55:58 +0500 Subject: [PATCH 05/47] Add files via upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit СредниеВопросыЗадачиПоПитону --- python/dz_2.py | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 python/dz_2.py diff --git a/python/dz_2.py b/python/dz_2.py new file mode 100644 index 00000000..7dc2edf4 --- /dev/null +++ b/python/dz_2.py @@ -0,0 +1,89 @@ +from datetime import datetime + +# Задача 1: Проверка на четность +def check_even_odd(): + num = int(input("Введите число: ")) + if num % 2 == 0: + print("Число четное") + else: + print("Число нечетное") + +# Задача 2: Проверка на палиндром +def check_palindrome(): + s = input("Введите строку: ").lower() + if s == s[::-1]: + print("Строка является палиндромом") + else: + print("Строка не является палиндромом") + +# Задача 3: Проверка на простое число +def is_prime(): + num = int(input("Введите число: ")) + if num < 2: + print("Число не является простым") + return + for i in range(2, int(num ** 0.5) + 1): + if num % i == 0: + print("Число не является простым") + return + print("Число является простым") + +# Задача 4: Проверка корректности даты +def is_valid_date(): + date_str = input("Введите дату в формате ДД.ММ.ГГГГ: ") + try: + datetime.strptime(date_str, "%d.%m.%Y") + print("Дата корректна") + except ValueError: + print("Дата некорректна") + +# Задача 5: Поиск совершенных чисел в диапазоне +def perfect_numbers_in_range(): + def is_perfect(n): + return sum(i for i in range(1, n) if n % i == 0) == n + + perfect_numbers = [i for i in range(1, 1001) if is_perfect(i)] + print("Совершенные числа в диапазоне от 0 до 1000:", perfect_numbers) + +# Задача 6: Проверка числа Фибоначчи +def is_fibonacci(): + num = int(input("Введите число: ")) + def is_perfect_square(x): + return int(x ** 0.5) ** 2 == x + + if is_perfect_square(5 * num ** 2 + 4) or is_perfect_square(5 * num ** 2 - 4): + print(f"Число {num} является числом Фибоначчи") + else: + print(f"Число {num} не является числом Фибоначчи") + +# Задача 7: Проверка на совершенное число +def check_perfect_number(): + num = int(input("Введите число: ")) + if sum(i for i in range(1, num) if num % i == 0) == num: + print(f"Число {num} является совершенным") + else: + print(f"Число {num} не является совершенным") + +# Задача 8: Определение сезона по дате +def determine_season(): + date_str = input("Введите дату в формате ДД.ММ: ") + day, month = map(int, date_str.split('.')) + if (month == 12 and day >= 21) or month in [1, 2] or (month == 3 and day < 21): + print("Это зима") + elif (month == 3 and day >= 21) or month in [4, 5] or (month == 6 and day < 21): + print("Это весна") + elif (month == 6 and day >= 21) or month in [7, 8] or (month == 9 and day < 21): + print("Это лето") + else: + print("Это осень") + +# Тестирование всех функций +if __name__ == "__main__": + check_even_odd() # Задача 1 + check_palindrome() # Задача 2 + is_prime() # Задача 3 + is_valid_date() # Задача 4 + perfect_numbers_in_range() # Задача 5 + is_fibonacci() # Задача 6 + check_perfect_number() # Задача 7 + determine_season() # Задача 8 From c74682212ab6c266aa80bf866c71409f88ea9ce3 Mon Sep 17 00:00:00 2001 From: RI <96973065+Rinotrihanna@users.noreply.github.com> Date: Sun, 17 Nov 2024 15:38:01 +0500 Subject: [PATCH 06/47] Create answer.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit делала дз, но не загрузила ответы --- nginx/nginx-auth-theory/answer.md | 53 +++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 nginx/nginx-auth-theory/answer.md diff --git a/nginx/nginx-auth-theory/answer.md b/nginx/nginx-auth-theory/answer.md new file mode 100644 index 00000000..816a9631 --- /dev/null +++ b/nginx/nginx-auth-theory/answer.md @@ -0,0 +1,53 @@ +server { + listen 8080; + server_name example.com; + + location /secret_word { + # Возвращает строку jusan-nginx-ip со статусом 203 + return 203 "jusan-nginx-ip"; + + # Разрешение доступа из диапазона 192.0.0.0/20, кроме 192.0.0.1 + allow 192.0.0.0/20; + deny 192.0.0.1; + + # Запрет для всех остальных + deny all; + + # Установка заголовка Content-Type + add_header Content-Type text/plain; + + } + + location / { + root /var/www/html; # Путь к index.html + index index.html; + } + + location /images { + auth_basic "Protected Area for Design"; + auth_basic_user_file /etc/nginx/conf.d/passwd; + # Разархивируйте cats.zip в /var/www/html/cats + alias /var/www/html/cats; + autoindex on; + } + + location /gifs { + auth_basic "Protected Area for Marketing"; + auth_basic_user_file /etc/nginx/conf.d/passwd; + # Разархивируйте gifs.zip в /var/www/html/gifs + alias /var/www/html/gifs; + autoindex on; + } + + # Запрет на доступ к другим путям для учетной записи design + location /restricted_design { + satisfy any; + deny all; + } + + # Запрет на доступ к другим путям для учетной записи marketing + location /restricted_marketing { + satisfy any; + deny all; + } +} From 5641d88a7429e852a2cace4e2a23497f90244abc Mon Sep 17 00:00:00 2001 From: RI <96973065+Rinotrihanna@users.noreply.github.com> Date: Sun, 17 Nov 2024 15:45:17 +0500 Subject: [PATCH 07/47] Update answer.md --- nginx/nginx-auth-theory/answer.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/nginx/nginx-auth-theory/answer.md b/nginx/nginx-auth-theory/answer.md index 816a9631..eff14c5a 100644 --- a/nginx/nginx-auth-theory/answer.md +++ b/nginx/nginx-auth-theory/answer.md @@ -1,3 +1,4 @@ +root@user-asus:/etc/nginx# cat ./sites-available/default server { listen 8080; server_name example.com; @@ -51,3 +52,21 @@ server { deny all; } } +root@user-asus:/etc/nginx# nano ./sites-available/default +root@user-asus:/etc/nginx# nginx -t +nginx: [warn] conflicting server name "example.com" on 0.0.0.0:8080, ignored +nginx: [warn] conflicting server name "jusan.kz" on 0.0.0.0:443, ignored +nginx: the configuration file /etc/nginx/nginx.conf syntax is ok +nginx: configuration file /etc/nginx/nginx.conf test is successful +root@user-asus:/etc/nginx# systemctl restart nginx +root@user-asus:/etc/nginx# curl --user marketing:marketingP@ssword http://localhost:8080/gifs/ + +
../ +__MACOSX/ 27-Oct-2024 14:06 - +dancing.gif 25-Mar-2022 11:20 253794 +jam.gif 25-Mar-2022 11:20 471720 +sad.gif 25-Mar-2022 11:21 3605836 +
../ -__MACOSX/ 27-Oct-2024 14:06 - -dancing.gif 25-Mar-2022 11:20 253794 -jam.gif 25-Mar-2022 11:20 471720 -sad.gif 25-Mar-2022 11:21 3605836 -
../ +> __MACOSX/ 27-Oct-2024 14:06 - +> dancing.gif 25-Mar-2022 11:20 253794 +> jam.gif 25-Mar-2022 11:20 471720 +> sad.gif 25-Mar-2022 11:21 3605836 +>
../ +> __MACOSX/ 27-Oct-2024 14:06 - +> dancing.gif 25-Mar-2022 11:20 253794 +> jam.gif 25-Mar-2022 11:20 471720 +> sad.gif 25-Mar-2022 11:21 3605836 +>
../ -> __MACOSX/ 27-Oct-2024 14:06 - -> dancing.gif 25-Mar-2022 11:20 253794 -> jam.gif 25-Mar-2022 11:20 471720 -> sad.gif 25-Mar-2022 11:21 3605836 ->
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
From 26674967cc780c8a20c3565dfc030209fea96e13 Mon Sep 17 00:00:00 2001
From: RI <96973065+Rinotrihanna@users.noreply.github.com>
Date: Sun, 17 Nov 2024 16:02:28 +0500
Subject: [PATCH 17/47] Add files via upload
---
.../Screenshot from 2024-11-17 16-02-05.png | Bin 0 -> 1008374 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 nginx/nginx-locations/Screenshot from 2024-11-17 16-02-05.png
diff --git a/nginx/nginx-locations/Screenshot from 2024-11-17 16-02-05.png b/nginx/nginx-locations/Screenshot from 2024-11-17 16-02-05.png
new file mode 100644
index 0000000000000000000000000000000000000000..ead7ce28dcfebc226bd036e333785bcc802edd29
GIT binary patch
literal 1008374
zcmZsD1yogS*X=<oDYx&lT%57Z@IcgGq@}UOY(lr2uLTaHA(oW_tPX z;&M5kwe9vsiRN %606^fb5sOJ7}c)qk}6*^9ZB{LHITY& zObF$vXp5Pq357??xG9W2Uo66B@Vh%Vzc}L47~&`wum#?Yi`@xynhgr_^6AVg5fT@m zT?Kne Ky>xf)uL#{c3d*!mNNY+VF)_iRqS%^m<)*1hw3A`i^aB zmf25o`?h-YL%>#St4}i{B*a}-Vm2Kis6d*(vVT(RwD9Tihr5KBu?<^)L(InU(Ii=C zs=?DsURj*Qo0r`#$M5c4Y_?6gEMv(z3F^IqiK3@9i>Y2 T;xNW zS0r~JLJWaav{yMvd~)-ear`(XC8dF_ORe4|k4&a2*>hG)0!m8z2E8x2(E9X%iV`oL zOTyu=l!nHyAnKPY8(%M<^$Ij!qL*9uKW~UTTm 6k+GdOxG-1dhKivTR8KPqIKr60N%pf7aO>1Zj< zcoaxI03`!g(`|WRKH>(tyCiTW3x>2df6_{ox!t>3wOLl%gVH+Jlx<%YXx*yS&sU(Z zXIl; c*u+In$beR;y>w#x636HW<(p_Gcv9h0e`YVh^ttEol^DP{64J4e~h?O~L9 zPo6Mie4CSx7T2pK7?S)&la>oGsuQ@lfnnu6@3D$_BKD^w-`!C5p{EHYr0??%0!c*N zbUyupy&%#~Ome=>A$fBN^^%g-A3=bc-jFlQiV~?W5vgy($2#ZOXt+siDU*5cWH{4> zUJ`;7
tHr#SgLOYY{c4RxOhkq~Z;*D5IvQ3svc6L{ *tl}*vTX+QHLYGyLX-ozd_W2 z?}@y82Q)Wf{1~R^p=`WL5}@zv1E}(;oj0km&TvU+$7=v2C eC9vkmYl#h2a&L o(g`V$`|-@w&B{rwgNJq8iT(828FD>}94Q9CsT4Um`d@$m@={18{pweX9; zVC^ J-x^E?%zJ#oW5MDae$?VJ-9kMJKJT=vHk-;MM(ez z8n9PFhx97v#ZB0|MKbi8gHKU=b~)&-8|BlMiVAbZq;RtPtRM!UrTr#yv|+ES3m*yU zV-b%XQ;22I8(0N{OFqvmg;QaNojKywkzV%`%jG0{Xf|}>zTTdmJKFy6;RED)01Lq$ zj;izSEq%wu`3WV26j*2!T~#p(s8*E?cQs0;m| #}b6JQYlk`rOJLXCZ6>K&$dK2Rou4%XRl-aM0y zz^&PAx=J0K>mb^od;9=?hn$j qz4lMwMp!g{p(GRh(f3rnp zjlJT1-faQ81H+O-ai!|b!)a*KOxJ6dfJr?j3kyZ>qc`(iUV2y3129 nTaNH=W4s{nvNmWbLfm=f%+>fJbVLm*pNkJ z1) r& zV!`eW*|`ohPz&^?lc2avyl;K5)q?lvxq4#JwO>qu#;zB V6k^_I5W52A@&6peX2 e( zLJ3_k!l1g|E-SGkmuqNb!dGn6Jmp5A0+R`S%2%R=J7{p=({e)umB_Hfy?bWg{Cl;E z&t}@G@dJBOc!TIWKtSSs-XnmKUetWX14D&3<(rnlTrgDUw5a6Y2l$o*FqNQjsF)y{ zVElniyV%{&>seP%*P};|PB+0`fAQy4Bk(&IF~JY_^{GJ40Nta}^#dRQRKFP4Lin$a zl$03MS1DYE0)F{&)%P;m{B_BbFLcrv0IX<7GbxfqC4&ZH9>8O**aIKf3&T@{IXu_z z2Owvhg)j3x`$Nz3^6;Qm^d94jGvm-&&5LGops*XRu=LQZVvr1fbpcD@EY4jb@mGd! zsA;p)_C}c*_;_AvyUciW0GutrB6g&>a@I;+gr1`TG@|C`8!Mhle#wU19MA`F;0(m2 z)HUUP3AofX>K v3xiUylchZC0Qzd-P zj$l#ZBL^sfNSSqOnMo bv@Mh6U)4}HSbl$V}1YYyP)4w4wS%X`!X*4Xj*gz z=*QQ2qNbriRP_#<``DKPKu7>rRGV+#b6WIt-b{^;CnlmYgnG15R{m}jP1N}VdhL%y zz=?Rpq>b=5+iVno9Yx#FM~5+*62zb(`>Qu>LHA>*SF;5Vz}tM7JyyYto5W|V%nX#w z*R*lP^P_KK|7h}Q{E|cV;DIlNXf7TWV3>)>ba4BToRa>qHy7P(GtL;6aI~G1#wd0? z$CT!y>!vE;ICoW=WVVOX_zxHB9WIdDttkUG Cd)%wsP9W|MZ>!_vbRKK}^@VKpHQtS~0#3 zF?#phoNP`m`{bReKccsc;rqAGZQg{hngF#F$bLYK&q?)E$n1w+ zIs`PJZfTA!LOlpQMHV3;ojcOyqwItzfEwAs)TsffVfZW*XBy92Z1}Hu{mP=-tq<|U zT6fQYB%>AY%P(mF-ndEAQHfGzBzrw_C=cj9+boL&OWQS^bapW?2s}4p=HyHj_g*2t z^zs@l%aY{xyU*pcd5>09-=`qkxX8YKvh6bYZpK%6-qN`^7Ddfe05rt7O)*-y2evfJ zNA)!{D&QyxXzO0pejm8gVToh6JSCA){RNTTygOMZL=0aV-$~EH6z&_VNC2P=Gx}onV10j=;z65jn%vDw>$9V6 zV0?gMwN6`sF$vLlVM2$^cZUYq!wrzAr|ft04%M8>MVZ25f}Vv@qeJF>^vH=PlJxN| z=rTLwc8#&Fb3Y*aW;ImI(|}G3V4d+@vSDOdn3%_Zv@k ZhW9~-XxWyB-`QG+y zRYRCASBaX6h$?^^8)B*uJ*^)-{ 7>?XqF~@VS`$&F z*DlXUZf;(43x~M`yUTr>15(=22z}1W?i{|_xl_PNIo_rpR?}d&oa}9!PZkL~5CSg@ z8ecXV8h6?qz>CZ1V9IN#D-|dXUZSZdy`z%!r?2G#mZ@qL|6SQ+N4 H!1F|j@SVQ^Hx9xAfFr@FCYcPnWR%;vf2)$3eCCsM+xy1wE~%rf# 0+?!4D+ koUk^XQqsKDz%!B1j7ABKuiD==bXwTxp6b#oZ8ip;2 zL#OVS-M1j!<&J6fi9e{}_@cc}1wg#^N&2-c?PbIeN-i;?!-pGtFg{_r1H5b}Hf}EC zVGu}_QNNw@WqE7bC-{K=&3BroeOkiT$zF}C)GB9uxod&)pzk{U$9vddU-s!zh}yRD z9=5uMKE>yoCSr>p*^c@=+7D1)CBBlo8FoX8$AaQ+l;kW*BsN*ltH@B}C*^ST#3u=q zUs8rXJ{~M7WO4jai2?O*P$n?1Kb~L;&dB@p$#ZZ4)uPjevxKFP-xa^%7N?b)jWS9u z=0Epyjh2)T7t!(20fVFiRq~fFyjQz}BrX{BmRuIcF-^Nx^AJ@ITmYVgvsFH^n)1wR z`=+ImcdKP(UEP#Hq>j$(`UAzQ&-L$hu5R_A$7_Y5frsBwe(^?Ob9?+&Bw?H)`=QT} z!HoP%`btFM4=Nw>hi!FIw|RQq4IETS?u5s{p#M8$OJq?nCGJPunzbIjiivXn8hldp z|L0EUWy|y#3r12=R36PadZ3k<3>BpJGcyLFp`ezWk?UXxQQ%gOQ)Z8J ;Q@>i-f)9- zNZ`f|I6vxtUVVZPk|-$^ztQ{uF$$Tj@%#2Ia03nHk5S He3gp!-i-AGl|`^PAZ zUf$cn;^E +3Shfmaz)bQS{PLsE?!mxeomQLjI _imo!i zm5oU@cbaea=@x0-CKy0?|2u3~KeWa5KiR)y0=rZZbp446G 7e#qR zHekW08W}mzTeDY>y&&_y-$PL$w@3t|R1BKrY|A2UE!5Q|I3PXKj z|L;4$b2V6_0zDqt;rZR=#%|%p?%f401PrIx)rn#M_cio-Rxr>QRkDvyagZ;37H2Xu zkUlu$@HuwNCnIm)+>n$q5=+{BMxI|`T|%KI_td_;t^2Jy8yF(W;P~lBCz>0HQU3Es za*+jUSbWmP(1R$*ym)=LlpR8 {3d*Z7S=AV|yid&e=^~D&1k$BdJpDw- zBqnPs#)sBf_y5SYCq7Gf$zg}-=$*RQA-s;rCHa*4-v=TSgLIb&>r* a$q z4K-O*n6I1#N4N#98YbyMJkM7}<`t(LH+DQuu58*nevepcSPe)C`fys-UB_*zJTFAR zM){u?4qW$-;8ab! x*11nP n9;wQ5?jXjPz|(Q*%?C zDogirkgaF6V<1jY`Kdp3>;0=@ZHjgsAVm}~DGmZfh-^on$}Vusyc|u!(s;H>?cX{7 zQMK-28Jsntm@|lv+TTZ+M;VK2U^m^U83L?@@3L)G;R}NNOyzekbseT+zlAWBpy^9| z;I=p33E8Py`ib#jJnrpG{GAu|fhetrJ;{(dYkuqBAe~hw0>Qj&Bx^$2eO1p@|Mu9)MBWO-g}3K4Q`poBweqP+UP| z=6L4K_XD8z2iuT2E;|QKuB=Stcn`+m8=O>HPUekPh6w0~f0=*I7XBLBOoTYSFy#iy z{ku |cPh@rn zBE|1^fcLZwvHa-UyiDfA2PBGJ@4_4P+NKCA_ji9q=MfkDy2qPW{(g-0#q|{>7E&vw zUsh9w2MjPBsN+|uGyCMDVu~?* QZF LeDA737;-a*)*J(5$Ee5{P zl>%M$5J+O7S4=6zO1&@K-OJ8ae2G@oePG4`{9`%g?$ZIQD|?dNixWuOAUCS_tiL)t zXu~iKT}1hVfW{qZNrZy^v!GVg;s+{$1+-& p1Hw{=@(wC{ z3Q>1x$V YmJ $-%~jk38k`%< P_BgX21j;vP09 $gTjMr${H4dneb>c-w2 zP9`~sl~57%;W13 D6vmRC=!d8_)hs(;eaW!GRnUpu+&P9Zq4fPF=)D(#wOrNGOHS4*1eR zeN;Rd4h`~)9>q+` z!2wE{gKf-aJOyt!8V#MdchC$!B@+D*&e?P9bRf8`n8hC(b)TE@#apYb2`UK=!B?%m zRsP0Jvpfupv>L7X?< 72h<8AyFj!*odyvH0RKG%is-P;D-{4oGnaBNk C4PM*)}vLdiC#vYecpyu2j{zi`G6$uAxcR!kc$yt;M+de9@o`sIajZBT{JlWs>H@I%u5xfk31~sX9 z`Ein6Q)F2$22J>E6ELEH4v9m`^U3vgAJCW>7=UmZc=s*D9bae%-6y5{!Tq@Mb{|H1 zqK%&09>;wRJ_FqqQ?&3eZ?D&PY&grxu4rUnWj;%iw(d|zySEPKq=vTj1eD4l&?=EC ze6g!~R*$vWsAZlYR|>|mx`YI@Y|c)#BuhJj5hv4&Nq(dJKZeL|zsYlMO%^Dqi%q~T zszj}b@xFkg8CE$?*^gm><)aEiD4Zc!JTozYDg0=94eUF4kj$`n#l@Qf*S$)-37Scj z%y>q@Xk#1XLC_%e?>pL_l~&cSwxvWa!F&Vi#4Nn)F!uw0I<)*TBOBMX^@w2QR3SRE z2S~o2x#Y=m+qO==Hx;7%9t+8`==81qKQwBdx2+Lc;^yzFZ#MJL8kWc$d@F1*;?gT+ zs(ze>CwvjvHmw{wOy~7;be%1}NW{4KDOdVrTB5`=sd&NrWyIz$e7&aX*!>Zc&n|`= zckz+h!%7L;jpduZ#Ni`Ux@8vD(MsDI-^Vs_js7A!&ux91-J*o=OXieBr9^EGnXf-7 z+qTC iQ%7Eht^ zES%-=E;JO#7+{K~Tf{Fa3TBN8bZDSBtA6_RI#A9^p8&@M2u7@|o!#BoO%Bb4s+tUp zjGm&Y!RV4B&F>c!Udx*2#4e(}CblQgX1hZbOn^p{?#-?!vpLpejPcdVEcm5Ri0(Tw z1yw5--4xsxST3We&ZDOYPNdEdr;z@}UbjtiKpNLe{#nndQ*s{}j2=&C_q3mw!eI)M zgF=CSd#le}kGk8+3MQw^cRvN)Z1Z1T=R8~xLvJ2;d7zu4yy)+ |2=wd8Soe5BAkuReqe`LVw9A@Vf=v{!|;z@i{Og2Bi z_iSYGklW6veyxVi>Op6#Hqjtfs$t~M{F829J0HA3JMy?9-j97Mj3ciRCOGZYh4mI( zrb|coyxBh!oVJg4MLHiFS@tRzRG()UOwLE sjH
Uo z$7rKqvY4YwpZfwXJ=TI6gYc3?bF_Y>h(CLX!?0lImbK%z_2c|?be;uANOE zRh7LzQwH(9m%UD#C1Ni3fZ+D4r6WS@eU0(yrI~(LSj3Ac9?_2aq50KgYM;}Po@JZc zBhJG$GiYrKX@}I2hGTV?OT*`~2qXg$IdW+mogj^b|LHzneHm7;EW^I;!NgoUF*~mg zYl5!*uk*%8=8J|)i}$jxJB7G3l^y^eZ|gNW6+-$R_(uax>Dq`+t)rP{5>9TzK~@ UHv3h>DrOT=`UBL^)8vH zt7k|kr0w0`mP(9R{i44olIL&!-Oc_OF>!H~K(a$G4>7N`{(VL+^gEBlHx0#rs|pRk z1=v7JMpj1(b({{?rfUgUCa(_hgx(_&F|jY8>kJH +1={DjZyk%rI zIcKSdJ_}PBZ60QR8E??rPVJK%&KJ5HM&-Xxtp_UNyB0p~hCEWzukl0FxpQnT9vW>- z)=n0;FnMcZ4CP`{NL*+y80iT4jGNCBD`ckfmhbvr{E00a*J3aE;eK{z=HEx1b9r*q zw#?g(opjP1!4gFxQZxO1620kU-_5_TbT`4fzT(i<@&2^^{pnW-VYg$?2wXQ8%khDv zSN!8^1CQW1Lq$bT`@Z}%*B7U=%Km+A) ZPJ{`TMeF+uU57B)x*WD*Z>4gx_HD3Ow( zpALD%_~`(ge83Gn062pJ_zJ)09W^WGJs*_~(GMDEE;#2 xl_$I7qUy4;zep zdgQfGWUmdxLX6lPEf31b1^29&xH$N5rTIzP@*Z?~(E28)rcO&t)D0PW5i0Wx4ixez z2`9Pt&Afcb iL&pf(N0Iai@82T`2?G#T(9S6eJ#(qmziNQPsiDFzkL;&W_uwGP5~Jn|Fagly zYSD{E1yl}CY!CMHo%t@p5*CbaaJ_=Y%>1Z&LfVM?Ljq=`oDJo1i>N|eZnZ+O$+KL~ zJIt=Pa7T!aaR~cyc30=!!BCB1eO#o~|J}xkdwr00Hs8c#aCzI*bWyWuii0YSPX6+1 zNyFWSvyMR9^}n)sYvnuh2@-2!d)wJ4m-*MK=iLou&@_eoAKh*o_=gKXj2btKCK=NY z&lQ{RX0?vSQPgPk0i{Se bUU%ebH*VPj`63>;x;{yIj{etZF{0-gFvaq!09;iu-e`7mjFxcU&muwv oSu@}(fDDtyOW380W&4@rGQHN_m%bM)rFHzv~+Z{HgO5tc15D|>jBaj zr3;~AY(~DG2V;dxpYX*r-Wro6YUSOi7@%)@H(<&B{sN`uTOkEg7S0H5OmyVzukY@u~$q0ICdVi`YvByUDGPq2S W-rI z?y| oyy832jQ#; z?$^a%OvxUPWN6yJf|r&JWckIDpr4I5A{b&2&l`4qb7O)b|HZgm3r;z+E_e4=GD`L? zS_N+M>)15x^;o)vb2O*IF06E`vC7Sc<@43|-kh+S5^CXXsj6AM80E{~*+ *T}rZfig{j~3q*;(yk#FNR#E>f9o)7e z8$H+MjV*8AIUq 4E^=Um|Nmi>e+@JR^yFyXeyKuy!7fuNz6 zMMnnZVi~*qc`8Npe#<>N!g#)_q+xgFOjH_Y+unO!4MEREHzpD#Cq=5#_^nq{3xILS zTKq3a^h#zO@JzrP4h$T3=H#(kz{Ou4(F&7GqvgOw*Z|mxo}MS5vKs)r$X}&5Rm{oB z2{cT=w{KHRSuC-B^6UWih$9eYTMZy_VpC`kG^U&t&MK9&LaBr#xX&nYnOZ(O)^@7t zXJ`iG4ppczuyL}x2v1;#=&&=er_Truw;+beubF>mtH&bT{QQ1QSTx^}4-;>Fw6rI7 z;yQNASZkZ0K2_j6>ohivf8VBWs`tS*I#UFN^M)h8Jb{nwuYzaekvBFt_!7NbY)1|^ z`~|e^q%b^4T-W2o%BjeI?w*x8C1B8`$Y@&d(fAiH5O4W$Teg0r3<~F^AkN3xp1R)g z F4AjbJZW02ME^gIzE_0y>~E5?tJ z%D9QMg3~sZlUE0}Q<|mWBPrU!f@1@` 8aXplq |R&A&` zKRus({y6!!ckix9w`G^1A^&rw&R^OxeUE>(t#=WXC_cwWF8r!C%3kc2^RW4efciRh z@_i|jnD=C`;t6So)0Bt5Oz5P>2e099MCVa`rDH)V>Qo3TtMQlCxjav@d)dk5dRm2# zp5c#`yFQE%is*Uy41>pDG_{_I<8pWqy?D^bdv7v&Hae$?Pyb!=_rhn^5+^gPP#(oM zd0nzut^8(MWGMY!c+RH1!Cv_D Ag#h%VyKf4BKs$UfH}%+6*F3zmu{S{IVn zn0FqjSG>Z)?Wed+;KVRONW}S>-N>qpkXT4D%k}#1=UbW;QGZE>qi#PnwH-C^-&r8f zov^BNkuAX?70b07e9Ij-Te3jdbk=cGd?|8M?~r;ZHx>_XX@Bm`4NA_#thKYVjArWJ zZZ(te#UXaqj8+qGul0rL%LbwTdAw8HSYZm5mM9s9eb;-T{WgvE9K rgxII)P0bUy+Z61d8)esk1BZ9-M}=h zQ7&o?3=aS*+w&B=>Okk@ J%(2EQiy+m$1B_M9--K?*_CZ zSKbf68CD?Fl8<@`Zsc$~iHV6Pu>7?uC9#30`YnGljp0$8ezT7l8(V>&3ux28Yl4XV ziAtjZ@Lq1w(2JE(t9UHRrN>uO4(pCck&Yp~=X=Qu-y8}~Qbl9UioK{b$&1xw`Oy;O z^a7VrBQr`maQQZEh!SCasO0=0nm;AZGQ-m$7Ot1%CogBpNk?|4rd6n)y?nE0;drSN zfh&vQUEweuaXR2Pib{MeUX^JUukDLk@ySQ6Hwu>3&_1VNxCl_Lz>nOj(d>U9M9OlT z>hXsUA9`Pk>%>h02@}{%S9{{%G6G2yG7rg ^0v%DVB z_k%EF+?;J*%G3>uQJ~`knqR?~y*YZic+rYlmZGg*^$f;R{uU}e~==Wy`xZog^AiR>am)o7D-qz#*SouIQ3ml_SesAuM*#xV!xQszTTuU zNI>yX;g^+*rDfh9^`wbq=Q4J3plQ#>PS4?^ezmQRPx-?A@w@lye;fA?GDm8n$-%=} zBR_CMx`?F&fsTCZwi753@@USyHr%zJy*PH)F*fISkB&~n=y##xow33_T&V`8ahX7O zdk+o@l-z3xe=L`44W|mYuh%uja B4Jx^m$d~zeuSZ7Cz)@m-&ss8Kx-(x9+ZDg#5IMB}qU+7su z+e%&XI=X*v1m$DuQxYNq0yPK1;qU2Vm4f-z#(e6`i<88JFFYv9Quh7t{6=-lj@#wB zuTKQG!;LBl&QPj%pu@lCcJSY2HcT^^JLet4WFAJjNd;;oMk6%M?v}@R7Q4nh=Bc zrNyPAsJSJXU!?TT Nwb)iBm7a3xT9hn<-y!}Az)i~FG-vR$xL8brr?=!r5=NG2jgMV93S6|4z{r*1^ z%heZDnC|`;9 z4M{)2NQ?o3#x^%@eaq|&2C(lQTGX (u!xH5=kfbe zp_?U>Ibac+h=?6u=H!pLL!3~k71YvmOOD HZkQoRHwRALaar(Xw=l`mHEj(F13M z8>yHuBoU~pPe}r|xo-s|FQQpn<_#H_3$ybFwY0exYUQ-I44{(c53 SE#9$b&&KVybTLMij?wMrPeOa=*FMXm+vEEEnd6v!ZTEuXZ!x7<1p}+< z_dGgMrv5{QR_yoG1WAeV?fM&HWr`g?*fb12RH;$RbM%@}3Q{k@)a<)e-O|RxSzqvb z-IZl%MWrY;u0zi6?~^HWx8LiyNp0rUdM}8uB%d~X!5921#LuUZGZetxfYlPIkoA!n znW+iEI3nnNQV)B3ml &VYn?yqXzb~gRI&+pyLcP}{OIMQ?wUE0 zD)tM$-pyFD7k(1hX0JMjMjuR74fdJ?^pa0$!{5!|8+$g!WnlUXViQ}EzMdsfRM$;W zU}QpV{X bJ^U%CVWp!!k{Y(&^D`DSMA*N6C|c0Jf(X=maX=o3 z41d0FobDL#&7`!Bf(pBZC72e2z*z2%d-50N;5pJ^^QwDPc)h&ry()LW5G)%H7$7sB zg%lZJqA-~FCq3hE6^TF%ZFP@ilKZ4GK>u#lIkB$~5x)C}q+lrTTZ@ZhqR9mIU$g`@ z8I_v57=qF!g7XLNHm<~6wBc>#C1gBY3&f;rw#2=qB<)}*_ExTyJ2^uxF@rg(^&Z8$ z>%CYc1o9N>1$WYob+dxMai`MX3xED3ZpeZ!Jw1lUUyXSlRne0Kucee;ez1aq#(zc* zA@q8dML#>Ppu#GQU+R&`onB0ez){kmp%*TnT}7VFN>Sx7r^;rTKgt_Y=vqR|UzWQu ziIm%ndjHlguYdcayF_GhLXWcT|IqdC@l5#t|35zGCC!G4n#1OhdCIvmNn=8CKBSz_ zIplmkk7QGFO3WcbQ8aX5ISfUpIVQx+A?KDYIV|Sz+vkt(?#}@w@-Ezjk=+aoO&V z+v9e>-YNo67)3#iKeX?c{~`9z#6!s#zBEO>_lgfAf~XGFtfKx59QAe2J&y+9Szc|G zThDVkETzC*+=rb>3`ZL3=fngNT`DPA8miE(-?zGtl`K7Cx3BX{FE~;|`+Kc_Y9?+T ztPzt!7;bUR&c!e2d!f6{J7hIBK9==4UVbyarnar!x!&Pg&+aYlA4&V>NB ocZxQPWrNt|sOQV(D zRA8_dzU_214bUV1(HNb41fgK!rgG&|Lxz!Wk(uhC_xDysESDwztJ@a)Rx{~kfJ468 z6MYjUzbakyoTjqZ+2TGRObT;?Tr#rh%m?n)_x6)AQhBYqa1hT|MZGy%my*6Ry7BZu zJLw8>hL{j_HsO19HOs0hfeP -#vsOj4nk@Je&4)wE?z!=}};=;H^kBWy=W zH>F%aUO}xtrIw+X$576e-M&pNfFwgV|wh9HZ-nwl+o#%OlE&D?=zC~V7*Jh(#HX>jPiweWIapP z%6{S?-kDF=Y?K^%u(jWoxff4rcT%dx3VR;@-H(}_sKy$a+?8tmzWlTTi=*6Xwb5;E zdUy{mZD9WsVTMS1rqj}C5yJOixaV-Rx@>}cvh(9dTkAojX~o9+v^Xyx0Mq3b8Wl{= zVVLvT8k#|W*o<5sR$jSLFQG^O6-Vn*%zvfGXRWHw|E9Pp;N;kppZ^#Yi0E;xsd<2W zg1}@Eoc|0|Ayq3|#dm{`f=fcBc62T_IvWG{PKHT|%Zo3sg==*OPzF?*1yxNnhJ;uD zZEc!&9JO|w{fRQd^-ml0Vqo9ii>#>`a4~KEhU1rCq+%wBwHM0@(1@5>;^xvcUxqIF z_rgj6al$t30s0al0C$2Pd?T34`bDSgBErn}v(p!t6eRTeq$5Wgy%o0@V cO9uN0z3K5GI!Kj?6(Q=3Xmqysx>b zC2whMLlq3oVv6WVl4`}~Ht0ZZ|JKfkKHh@$Hf9*;=S;7UnxDxrUFykWoP2uMGDC`< z6SeeFJt_i92{aOi(IOTpslM`c8g0u_h0-To; Z??#BIP u>RE#&UFq{B;W(Y zQh=ihDxXpuV+hs%sX)p?EQwA&wGZ$%d#NB-sm@hiTU;xpYbNU&j?PR~)dIj7m1nav z4nx}qHy!iiLL?PR#M55B*UFHV8g6GG7t`6ZaLaSA(Fk5!SSHqEnliqJ0k>u}WqIiU zMjI@x2CaKm2|;LCIs5#E68cd`CV>sI_}@C3-LvK(%$S7um?BH*ATO;dU*j9sRcFgG zWz93Rhr;AXDb1hbzmBejGv7n=^WL6$E+lr#@DdlK*_m1H1A DY)1e7_Ws|`0u0I7rCf RL4}%)a HkbQP41KYY)8aLS_}@!%x~$6Wiw z$jJ YBD{5Dt-{R*Mr_JU0c>F zMQ+r_UBJ4~9NP*G$Ov0M`?keevXbef^$>Gx4JBuAM{f?bOyz()YfNl*EbC|oY{YA# zq{8Y6LLSB;3Xq(*vxG+_T?YrROh)d$J}qPmQ1n7V>4Mleb+ hMjhrmf|LsSJg zx^#1aby?q~{&axH6_=0S A37dJ)mkH>rNj_K~<;h&wh zdtv@l_NP@*yeLBzYaVW?FzX9^==Z97O#~RH)lUG9ZGq+$!E}D?cM1>~%T<2?NO*Z! z2>kf+nUt4z8=t(FD&O*MkdAtu_5+5JkuydvX@88MI+~KI5i2DeuYw5Mu%EOWtiO9L zQ6XJ@nTr4+_{HWnLY;$)KckZ9#-Cqh#3Ay6ej&{$du&gXu+u_JaK1A(Xe~i jMN-VP`}mEq|Y>{#oOf0tMa` z5K92G9_tf*A@V@xVwGc+#^mRLVd`ha`=WYNtRMane1<@T+I> 2li)l=iP9x%Jmquz8-Tsf2Oyf-UYx8f=JRNJzRSU#;K~j zDA5xDD0$#-d4fcqXX(s IYS uD?XWn{O+==c)j5Y^Cs<4!tB32SIG z#w_)!HhT>Nr8PZE3wR1oURlcK>N%q~-|%PE&oaNY%W8#8F}{!39KY0RY+M+Imo&eg zA0HL%e5v6dd9 {L2MWJDp;S z3oXqe&j(WL;?`BG7N`eo%4Xff`g;6You|kffNF(Qigd+U-u^JnnSybwb4&5VNvN>; z#CXVirHJtKoXhXdZcUl|NQGE5uKW8FKIaLJzIy)6-k*@PyT84@&Z(~|8)a=P^Kbm; zD-d}%S~D#hdvWvQ$1sqZhT$OM^~CyqB$> z5Ja=D@A5ZWnl7zhC-`5m;tI3Yx3dKVH)UIBWy}QND^z&U&pW%@$6F>Y_KzS_7C)(` zqYw71s+UUP^(R&I11^6?6!iJ>!!l>$>_+9hVcnKdm&78}MO!cGQ+DdoU@E)^|Mpd@ z^`$g5HN}@-T8)$a4S%ESX%UQjBZ4 k49KH cw9PJUwAv47- zJ0ffJ=v!57^>@~ Egmi>THhKH6 zu{<=mv|1D$5JzDu9W3#Dms$~0lQhTXhEbcgV`CB$kYz)&Lmj*TTj`2Ej%?fa7a^nL zMZ&nO2cb{w?@46F2qYZtU9ii{;l2R<*1CYrR;v~b)%mpMl@R0HL05Y;9_Qb;f7r!x z{Mziqip-3OW!V$ahx9(bPdek9F%FdQ-({s8`-g&8na)*{iqSf0YD26>2KrM;mi6!d zoRxoh(^^ivLmP!%@A?(%4B4P>z*ZbtFO`QzHLhjE^_e4txTI9(n_VVhpS6Dm{~T)- zTLL2uR(|v=H~K#7bs;?-Dyv_i?bC0$!wg@KjKTjuFF;5army=x8U#38uc>S~VNG#h zh!3~k3QBNl4PQSw5rKDSOav2R>|^Ww&gf|v_F|w#Kc<=@uHH}=KgGUZg#veCZJ&_0 zFL>)pos;5k7Ll1@-gF3i-PvP;^PO#GxEjcsB6>$!wi<~edkz0N4o$o=K|DzfQ3$(z z%5t4FHU+BY!VVi=cB#V!8|o*U+BS|Iq)2^}3^n1{P&rNe*0lYgO_9&mKOiWKRQr|Klgg-_pEeWb#t3rjkyv;K@Xu1obEHt-|&6k>{eMtE|3>-2UFKlXT@N z=!GXrzZ>j wmLZ;o?{>wOIe}FP2_~l;pt2Ec$!-9^wv6e24lcDz|c-$lxLa9*L zb2a71HJPfRgV=?TqOUYc40UIwHw39f9w}`3o}12fVw8||Y()Ba?3h7+;T>ab*WXqX zZ@Adu+biJ$SeK)pcEJ6vq(hRx7geEqVHR+JT!tA(q0PuZHk$?|*zmz=dzUs U0w>__wt0Wfwv}zZ=wt9@y*W4-6d9Z z)18D4XJ&wtOWDv0k%nbTqTHyFe2bmv7JEZpSH8b_DQA$$zZH1BXZ_ql??A4di#ikV zFOTc9sJyHIlxo2{NQPEKK`#8eICa}#)?eLF9VNvN<$Q1d|BleMkUoI{AOI{r0vQko zcXA922u%N@?CE1VQ*R)cQCP$sJzhPm$_sY?VH+2)DFQdtSJ%_$jP$r!5SBy@xW711 zR9HkAPEK1~bOmLi<~WWOT8P_TOXKCYmOJ?b)(=+C*Wb+hh!r(^ZxRN0zPTMsPbHi5CG( z7*fRS)nX-1Y;SxbfFVI%#a3el<=O*Jzd7R$RQ)onDr51fFV*tJBN$ZRn9Y^6l*bdK z2uKF%7#`+T6GtPdcG_Rs0$tp(jSyY=>8F-f+*(-ND=I#X;p8adPHnG4oj283Srrn6 zn4krKB3#()fu5$0v4dZlIQ-;vITQBQY}6#Vu(Ght*?HQ)c=9eL;p}LjK9CLzcEbsa zGYXcJI!cDv!q+iTp<-2Cj&J2Z>HRs`c+G<0#>)s^4Q{zlC?8Z#K{yc6R~KmZEa5I{ z#L}kb!7GX7n3^k%jR6r1v{fOfx3c~g>%;hZxF+} +P$-E&a<_ M1_Giz*d7VPPiRgy%`#N6rChL`95f3Q?zBw zI}nf<)s_@{^gS*qA v8sga
lHE(KkWqf~yMsi#mH>S;%-rb zH_6Ve_7AQ K?p 3gDav&hg=Yx%nX5Gku%p+--?>PO^cJ=N5}?ySO;gE+zX`h5gW zGsVjcri5!Bo2YxDhm+7xGd5I0cwwG7+kvA_ibXKgaM@46)AJ7NzX5;N<+Oy{Js%|F zw83&cD7>|zsu0-PNEP?+p0w^+YVxqQ%B$oeSAC!vhiSs9g{VU1E=musrUFp0ykHGM zNoQu<$AKrQR1 DDum^j#OI0Y2%WWlw_0$SH9Z7yP}w%+$m0JXQ#!p zNY?(J^6sQ26RGpnmB%GOz4&j8q<`g&97>wzj}7JI7W ss33A)v5#r0bxDDvHZY{{C2pTln}v?^IH@Fm*{?ce?NQp zyHls>HQJx_Nvasm+Wjl?bKi6?ki!} 0J<4b-GVs0S8(i`7JN(>l@Hj#m8)fwy{XqF^}&~ zOqlqi1rc`>_S8dh5iG5<_hL~^;f4i7vR;`LN!p);)BbPkzFbx_dq9s$I+#d0NJ=`Y z=G {JUQoS81^^ zwRRW&tM<(qjl5k}e_D83^VWTL3&0)c(#+nFnsNO|XLg_xYbmsitp>y;9`N7AhWw*% ziRAmHaJ;?HFnbigySF4bX5P!};HiiPoP_mK8)2!r&l|~+^TE-vM+XxL16L13Lkp`X zO@=1y&OPb_so0#Zh$+kosXuv4-ipvzD_{Y5o~sA!)>b|~7Ja1*Jv*9bd(h%iw3QsY z)|$dK=d-uAOP&vAn`Qe%jFoE6Btxh9JTe`HFs~lC`&8ZtP>9!RXZ< ci7xF1z}CF=h&wSo0$n_7Q;j7vY`HkXa_G0wr2xi}ZPUw>9b z0{JeeNGjLc+1ex*O!!OorMg-yql<1-`BKJ}s3*I_gBqLaYHF(7IhVZy{1XbGx81-w z{vS$-xeFT&Dze p&80Ft0}fz9O#E=|73I{^EtLbT943wu#{XvihX*3c6Wd@0P( zP$ue XN p#P*^V2s=ftj$k$*Zi z1po0Foo|m^M|*XWH?<4`2myBKzLVoSJA0ekE#yvn!X-O5b)B+H7y6LG!}aY)*QibP zLqnv8w4KAlwZrJUv?*rYN4R0>+xs%;f^bC`VS>;|$SPg=F!2ZzW`>?dC6`~M)~2%C z6mcLPDY3lJe!&%WGg-k8@$8NbVNe9#n)?8fhJsn4P&bggeaQSg$Jh23e7;@s6>A(q zau)&40yu@#&iXLUx&d*nXhU>xc<4RV47_}HVXuvGA-*|F>$x;Mo9x5Sn+C+_gX9%X z<+j`iTG&;KKQ7A^Vj{b8PnzCn2wL>@>G&R|^0J}%amyk;8{gSKHX!b3%jNbHhv3{Q z@ettX9~l<;F2xO|!9s6;Xqq7)E!GS2_;VkP_z8Ef&Cg%)1y7E>YCL4G%-X_#ANHkr zCjPHRH*i(BgGFV`9hKiZ 9unN$w!F #g5%i&Mr(O;Lt+L@*G*@J-}vGum)9dYsdha0VnE$xYuLj~+!WwZKfX|+dY6!_dq zzwmj{s?ez4tK3?-LB$fokruG1Prb~nj)R9C+8s`bhx#D~o>2I{DUg?rLwweWeJpoz zyu}>po)PH5K)Z@p){|(o8>g=)*H6@PyjN{ 1ih53caN hHO5;KGB zudskv@a}AJ@?~6d;Uk^!t(nDOyu2QeyY5%86N?ffuAutux5#mp7mtmMl4|1F&;2l& z=Q Q>we(^p=HD+?vqyHAUa53E)avk(Uq!xN !0Knfb0Fsh|`-oGyxP-1Pd+9VL z(8flNYxam_GOdfAT3^=ov=wL1M45Ww&%MK|SyJm*G_r&7o9$TSQQl} 4Qg? z+CGE7_d`95v!WR8Kb`&O{ Nmv>VPN#kDpXrr6P^C%e@a@+W4Nf=52 z#&wM+9BqfiSHq@?%|^>Fo;)eX&0ll4A4?yw9Y{+>A-#jnzLU(dcFhvd(@EogZWX!+ zmDhJ)`Tna28SKunfLeU{)@7(iluJE0*iIcSv-}K*F8<-eT~a;sA71rS>}{l_LNZdF zeIC)1BrtVsFedu8)PZ9-JjS)wLHtTsuD57^E9veKXN#?otSHDb^3y9tqo%ro(p)Wp zbr2ATmIX^ke{CKQ=)*4~s!?Fu;DU>3J)-Hi0y37D1pq%EVdRsypT1LDXn0}^ak8Xk zBZfBPOY%o|*Ed%o;dcv8SW1>=9z}0Nu>I@*Q=8^9#GPG6*^#pNRvG^)Yt%a9O`ZwF z+*b+ft0V5=Y~`HB77S*tPf8X{tQ^-ZS;qr=PqT26K zryA0jy|pn&C$^q+Md!*O_L`}u5kuS}{gijp>gu0JXJP_Ru)1iyvdJxfQzWthUwK_p z%`~j=j;l_I8LY{?tm7F_xSrrt|6iIBsqoda6JtS}AF!yiail~sac81=p2qn#*wy~c z6w$f~YKGU#mzY&il3?*UGiwvsYLiWofFD1`wN1Hix2_18N8K>K-uk>x?V`+o)>U^q zmjn6dfN!3Qx(7Mgb`NU-Tr*;d8b)3=)>9PFRZE?!FTao}H$Hq@I5_Y{=CYdVLBrwk z#X<|-q#LI#I$?f4xc<;~Q#KY7I>;{oLatU1 DaXL{v5`(Hwusoyj9i-A% _d>8Jhp1M(pNx|1j!_$rH$Dn8dO4IfXa8ke;*qNpp3ou%RK&gNd3@`@|`|zr` zQd+q6T_GO%K^pLpxZ4#N*mx6WWC +OPR7187d$h>kj_V z(K^)D7T>P%ZYp5*CWhQ~08|y4Z|!9g8Us4iXrh1T4>sx(S$0)_yRwp^64_W_<)j!b zs691QNj5*h-^%bSLcb>BlC4bSdc>^MUdgDMVaShPzx2^s>i6;bgj$0|FP)t?f?|Hl z%axZ@az`c-R^~@xDfcqIB2tdGEcd1J7pnINsrPyY7Dqco@#3JJ=X-Gg51LjsS3!&~ zwTDfk`<4N2y$oT(htoNXNn|cB-&lY{ml%y&z znQ46flKtICL^V{rD_!%`pEqNTi`-@a`@hLt@I4LLiE`f6I?hmWR=bvF=Rd>a4gY%& z&wiZr^U#g8&kQ $QWuje@!bS^?pa>H82QG#{>8+L1xiGUJ#jlh`bQ zY_DXw=x@)j-KyG+ZLUf;-wf9_s~pQp+FzjU`m;SwkjtukX4ZwX9Z3%mbe7JZN|dUw zu=`hQF@>rJCS9?!wfDkYUE>qu#MMsCWxGqRvt2ivOUJo27i}gsx3?#y%)E5N!y<@m ze~&in2Ll7CAq~Tx&4#Dzci#6p(4#d-?oFf9+-muxo2nk7eI0E=fndS7q)^d5KTK zUT(84|C>1arF=+~WFD<09a65Bp5n=v4!=4hZap|u?_$qL+TVvj#eeVa`k&q2*a&1B zcyyREV^8qdFRRr4IDb}CgfD?kiUUI3r<(|kZ|Yc0Oc6vV?p43FDkdQa?SD1} ^9i0Bu$ACX07d;yz~5LDb&tN>(bPm<^?pyMQ8)f={mZU*qh2&K=~k^` zw|9q|EA{1%tmNRlsWVaMUN;_nI5g=e&nFg|llT7>{i3ayH*PCwbx%{N5RntD4{pe) z%N(yz1lD|iLAKcXFx>xG@Uvetm;*1sZ5M{->%m}LYffG-kR@`BC45)#;{qT1LbVmo z!FBeFmxJB}6<_+&|0kAeB_~&J>VGv$C(Y;q)V-~a!f~T8mv?i{z~>picV-}OYJWP^ zsknyCNjjqi7cLU!HOBb}b#lU@&Q?wYIB~4bABZ5$ZY)1j)qPz1-suWQvNXU_;LVke zv3i$GKK!>eIz3vetwg!NXw<*8h0;`)WuDc%c(m+tH1TRNi4}B&ZE;zS$%L_U9@GlD z)SPCVovV%N!oFrP1!cQwl*aLhZ;s2UADtZUb9u?RUVL*r){@ysC)jn?UF0knzc#i; z0i1XznzBGF6EbZ!noA&kPmtZoKKAiF<3tYhc$k8iP2;^*VK}T8Y^503KyUzR4Dob6 zIUGWW^}|-aINBN*^GG!%gjs|Ni`CZD@bWXOStVgi@mz=y0MJqh;8f%KAT4B;>Y7n; z@AEZrfIDc}KotdCMy)L-R03>XE>sz1?7sC6D&C^kVdyxKE)8>nt-9?*9X~hn4xj%K zUtH8%Y5%b2>63C%M`@yJn `v0>_^(2wM}f#6{wW2&v eQafv EGRd@PIeO3yDYNhpS-VQyL1S*I~d0wnqbdGy=Ltk?(IY# z+^o`ggm#!1k1I5%9~^`p+su0?Gfkn_QC|}iwIq37FjxW2t&?wG!~bk;g&+RW5C>7L zW`ha{V`@V`pfV8_KM$`SR+}G@kM=3^4M#yotfRg4g8GjO^K1CDt@#D(+`rhXhhI!r zx>lF#gF4ze5|^HZD7n