From 12ed4b68cd2bc4bb81585a67fbe059c286ef7cb4 Mon Sep 17 00:00:00 2001 From: Emmanuel Averty Date: Thu, 5 Jan 2023 14:48:22 +0100 Subject: [PATCH] initial commit copy from gitea_ynh --- LICENSE | 22 +++ README.md | 127 ++++++++++++++ README_fr.md | 127 ++++++++++++++ check_process | 30 ++++ conf/app.ini | 78 +++++++++ conf/gogs_migrations | 5 + conf/gogs_post_migration.sh | 32 ++++ conf/login_source.sql | 6 + conf/nginx.conf | 11 ++ conf/source/arm.src | 5 + conf/source/arm64.src | 5 + conf/source/arm64_1.0.src | 5 + conf/source/arm64_1.1.src | 5 + conf/source/arm64_1.10.src | 5 + conf/source/arm64_1.11.src | 5 + conf/source/arm64_1.12.src | 5 + conf/source/arm64_1.13.src | 5 + conf/source/arm64_1.14.src | 5 + conf/source/arm64_1.15.src | 5 + conf/source/arm64_1.16.src | 5 + conf/source/arm64_1.2.src | 5 + conf/source/arm64_1.3.src | 5 + conf/source/arm64_1.4.src | 5 + conf/source/arm64_1.5.src | 5 + conf/source/arm64_1.6.src | 5 + conf/source/arm64_1.7.src | 5 + conf/source/arm64_1.8.src | 5 + conf/source/arm64_1.9.src | 5 + conf/source/arm_1.0.src | 5 + conf/source/arm_1.1.src | 5 + conf/source/arm_1.10.src | 5 + conf/source/arm_1.11.src | 5 + conf/source/arm_1.12.src | 5 + conf/source/arm_1.13.src | 5 + conf/source/arm_1.14.src | 5 + conf/source/arm_1.15.src | 5 + conf/source/arm_1.16.src | 5 + conf/source/arm_1.2.src | 5 + conf/source/arm_1.3.src | 5 + conf/source/arm_1.4.src | 5 + conf/source/arm_1.5.src | 5 + conf/source/arm_1.6.src | 5 + conf/source/arm_1.7.src | 5 + conf/source/arm_1.8.src | 5 + conf/source/arm_1.9.src | 5 + conf/source/armv7.src | 8 + conf/source/armv7_1.0.src | 5 + conf/source/armv7_1.1.src | 5 + conf/source/armv7_1.10.src | 8 + conf/source/armv7_1.11.src | 8 + conf/source/armv7_1.12.src | 8 + conf/source/armv7_1.13.src | 8 + conf/source/armv7_1.14.src | 8 + conf/source/armv7_1.15.src | 8 + conf/source/armv7_1.16.src | 8 + conf/source/armv7_1.2.src | 5 + conf/source/armv7_1.3.src | 5 + conf/source/armv7_1.4.src | 5 + conf/source/armv7_1.5.src | 5 + conf/source/armv7_1.6.src | 5 + conf/source/armv7_1.7.src | 5 + conf/source/armv7_1.8.src | 8 + conf/source/armv7_1.9.src | 8 + conf/source/i386.src | 5 + conf/source/i386_1.0.src | 5 + conf/source/i386_1.1.src | 5 + conf/source/i386_1.10.src | 5 + conf/source/i386_1.11.src | 5 + conf/source/i386_1.12.src | 5 + conf/source/i386_1.13.src | 5 + conf/source/i386_1.14.src | 5 + conf/source/i386_1.15.src | 5 + conf/source/i386_1.16.src | 5 + conf/source/i386_1.2.src | 5 + conf/source/i386_1.3.src | 5 + conf/source/i386_1.4.src | 5 + conf/source/i386_1.5.src | 5 + conf/source/i386_1.6.src | 5 + conf/source/i386_1.7.src | 5 + conf/source/i386_1.8.src | 5 + conf/source/i386_1.9.src | 5 + conf/source/x86-64.src | 5 + conf/source/x86-64_1.0.src | 5 + conf/source/x86-64_1.1.src | 5 + conf/source/x86-64_1.10.src | 5 + conf/source/x86-64_1.11.src | 5 + conf/source/x86-64_1.12.src | 5 + conf/source/x86-64_1.13.src | 5 + conf/source/x86-64_1.14.src | 5 + conf/source/x86-64_1.15.src | 5 + conf/source/x86-64_1.16.src | 5 + conf/source/x86-64_1.2.src | 5 + conf/source/x86-64_1.3.src | 5 + conf/source/x86-64_1.4.src | 5 + conf/source/x86-64_1.5.src | 5 + conf/source/x86-64_1.6.src | 5 + conf/source/x86-64_1.7.src | 5 + conf/source/x86-64_1.8.src | 5 + conf/source/x86-64_1.9.src | 5 + conf/systemd.service | 54 ++++++ doc/DESCRIPTION.md | 1 + doc/DISCLAIMER.md | 77 +++++++++ doc/screenshots/screenshot.png | Bin 0 -> 98551 bytes manifest.json | 60 +++++++ scripts/_common.sh | 70 ++++++++ scripts/backup | 51 ++++++ scripts/change_url | 66 +++++++ scripts/experimental_helper.sh | 257 +++++++++++++++++++++++++++ scripts/install | 151 ++++++++++++++++ scripts/remove | 64 +++++++ scripts/restore | 81 +++++++++ scripts/upgrade | 308 +++++++++++++++++++++++++++++++++ 112 files changed, 2158 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 README_fr.md create mode 100644 check_process create mode 100644 conf/app.ini create mode 100644 conf/gogs_migrations create mode 100644 conf/gogs_post_migration.sh create mode 100644 conf/login_source.sql create mode 100644 conf/nginx.conf create mode 100644 conf/source/arm.src create mode 100644 conf/source/arm64.src create mode 100644 conf/source/arm64_1.0.src create mode 100644 conf/source/arm64_1.1.src create mode 100644 conf/source/arm64_1.10.src create mode 100644 conf/source/arm64_1.11.src create mode 100644 conf/source/arm64_1.12.src create mode 100644 conf/source/arm64_1.13.src create mode 100644 conf/source/arm64_1.14.src create mode 100644 conf/source/arm64_1.15.src create mode 100644 conf/source/arm64_1.16.src create mode 100644 conf/source/arm64_1.2.src create mode 100644 conf/source/arm64_1.3.src create mode 100644 conf/source/arm64_1.4.src create mode 100644 conf/source/arm64_1.5.src create mode 100644 conf/source/arm64_1.6.src create mode 100644 conf/source/arm64_1.7.src create mode 100644 conf/source/arm64_1.8.src create mode 100644 conf/source/arm64_1.9.src create mode 100644 conf/source/arm_1.0.src create mode 100644 conf/source/arm_1.1.src create mode 100644 conf/source/arm_1.10.src create mode 100644 conf/source/arm_1.11.src create mode 100644 conf/source/arm_1.12.src create mode 100644 conf/source/arm_1.13.src create mode 100644 conf/source/arm_1.14.src create mode 100644 conf/source/arm_1.15.src create mode 100644 conf/source/arm_1.16.src create mode 100644 conf/source/arm_1.2.src create mode 100644 conf/source/arm_1.3.src create mode 100644 conf/source/arm_1.4.src create mode 100644 conf/source/arm_1.5.src create mode 100644 conf/source/arm_1.6.src create mode 100644 conf/source/arm_1.7.src create mode 100644 conf/source/arm_1.8.src create mode 100644 conf/source/arm_1.9.src create mode 100644 conf/source/armv7.src create mode 100644 conf/source/armv7_1.0.src create mode 100644 conf/source/armv7_1.1.src create mode 100644 conf/source/armv7_1.10.src create mode 100644 conf/source/armv7_1.11.src create mode 100644 conf/source/armv7_1.12.src create mode 100644 conf/source/armv7_1.13.src create mode 100644 conf/source/armv7_1.14.src create mode 100644 conf/source/armv7_1.15.src create mode 100644 conf/source/armv7_1.16.src create mode 100644 conf/source/armv7_1.2.src create mode 100644 conf/source/armv7_1.3.src create mode 100644 conf/source/armv7_1.4.src create mode 100644 conf/source/armv7_1.5.src create mode 100644 conf/source/armv7_1.6.src create mode 100644 conf/source/armv7_1.7.src create mode 100644 conf/source/armv7_1.8.src create mode 100644 conf/source/armv7_1.9.src create mode 100644 conf/source/i386.src create mode 100644 conf/source/i386_1.0.src create mode 100644 conf/source/i386_1.1.src create mode 100644 conf/source/i386_1.10.src create mode 100644 conf/source/i386_1.11.src create mode 100644 conf/source/i386_1.12.src create mode 100644 conf/source/i386_1.13.src create mode 100644 conf/source/i386_1.14.src create mode 100644 conf/source/i386_1.15.src create mode 100644 conf/source/i386_1.16.src create mode 100644 conf/source/i386_1.2.src create mode 100644 conf/source/i386_1.3.src create mode 100644 conf/source/i386_1.4.src create mode 100644 conf/source/i386_1.5.src create mode 100644 conf/source/i386_1.6.src create mode 100644 conf/source/i386_1.7.src create mode 100644 conf/source/i386_1.8.src create mode 100644 conf/source/i386_1.9.src create mode 100644 conf/source/x86-64.src create mode 100644 conf/source/x86-64_1.0.src create mode 100644 conf/source/x86-64_1.1.src create mode 100644 conf/source/x86-64_1.10.src create mode 100644 conf/source/x86-64_1.11.src create mode 100644 conf/source/x86-64_1.12.src create mode 100644 conf/source/x86-64_1.13.src create mode 100644 conf/source/x86-64_1.14.src create mode 100644 conf/source/x86-64_1.15.src create mode 100644 conf/source/x86-64_1.16.src create mode 100644 conf/source/x86-64_1.2.src create mode 100644 conf/source/x86-64_1.3.src create mode 100644 conf/source/x86-64_1.4.src create mode 100644 conf/source/x86-64_1.5.src create mode 100644 conf/source/x86-64_1.6.src create mode 100644 conf/source/x86-64_1.7.src create mode 100644 conf/source/x86-64_1.8.src create mode 100644 conf/source/x86-64_1.9.src create mode 100644 conf/systemd.service create mode 100644 doc/DESCRIPTION.md create mode 100644 doc/DISCLAIMER.md create mode 100644 doc/screenshots/screenshot.png create mode 100644 manifest.json create mode 100644 scripts/_common.sh create mode 100644 scripts/backup create mode 100644 scripts/change_url create mode 100644 scripts/experimental_helper.sh create mode 100644 scripts/install create mode 100644 scripts/remove create mode 100644 scripts/restore create mode 100644 scripts/upgrade diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..81522a9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 mbugeia + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..c6b293c --- /dev/null +++ b/README.md @@ -0,0 +1,127 @@ + + +# Gitea for YunoHost + +[![Integration level](https://dash.yunohost.org/integration/gitea.svg)](https://dash.yunohost.org/appci/app/gitea) ![Working status](https://ci-apps.yunohost.org/ci/badges/gitea.status.svg) ![Maintenance status](https://ci-apps.yunohost.org/ci/badges/gitea.maintain.svg) +[![Install Gitea with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=gitea) + +*[Lire ce readme en français.](./README_fr.md)* + +> *This package allows you to install Gitea quickly and simply on a YunoHost server. +If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* + +## Overview + +Gitea is a fork of Gogs a self-hosted Git service written in Go. Alternative to GitHub. + + +**Shipped version:** 1.17.2~ynh2 + +## Screenshots + +![Screenshot of Gitea](./doc/screenshots/screenshot.png) + +## Disclaimers / important information + +## Additional informations + +### Notes on SSH usage + +If you want to use Gitea with SSH and be able to pull/push with your SSH key, your SSH daemon must be properly configured to use private/public keys. Here is a sample configuration `/etc/ssh/sshd_config` that works with Gitea: + +```bash +PubkeyAuthentication yes +AuthorizedKeysFile /home/yunohost.app/%u/.ssh/authorized_keys +ChallengeResponseAuthentication no +PasswordAuthentication no +UsePAM no +``` + +You must also add your public key to your Gitea profile. + +When using SSH on any port other than 22, you need to add these lines to your SSH configuration `~/.ssh/config`: + +```bash +Host domain.tld + port 2222 # change this with the port you use +``` + +### Upgrade + +By default, a backup is performed before upgrading. To avoid this, you have the following options: +- Pass the `NO_BACKUP_UPGRADE` env variable with `1` at each upgrade. For example `NO_BACKUP_UPGRADE=1 yunohost app upgrade gitea`. +- Set `disable_backup_before_upgrade` to `1`. You can set it with this command: + +`yunohost app setting gitea disable_backup_before_upgrade -v 1` + +After that, the settings will be applied for **all** the next updates. + +From command line: + +`yunohost app upgrade gitea` + +### Backup + +This application now uses the core-only feature of the backup. To keep the integrity of the data and to have a better guarantee of the restoration it is recommended to proceed as follows: + +- Stop Gitea service with this command: + +`systemctl stop gitea.service` + +- Launch Gitea backup with this command: + +`yunohost backup create --app gitea` + +- Backup your data with your specific strategy (could be with rsync, borg backup or just cp). The data is generally stored in `/home/yunohost.app/gitea`. +- Restart Gitea service with theses command: + +`systemctl start gitea.service` + +### Remove + +Due of the backup core only feature the data directory in `/home/yunohost.app/gitea` **is not removed**. It must be manually deleted to purge user data from the app. + +### LFS setup +To use a repository with an `LFS` setup, you need to activate it on `/opt/gitea/custom/conf/app.ini` + +```ini +[server] +LFS_START_SERVER = true +LFS_HTTP_AUTH_EXPIRY = 20m +``` +By default, NGINX is configured with a maximum value for uploading files at 200 MB. It's possible to change this value on `/etc/nginx/conf.d/my.domain.tld.d/gitea.conf`. +``` +client_max_body_size 200M; +``` +Don't forget to restart Gitea `sudo systemctl restart gitea.service`. + +> These settings are restored to the default configuration when updating Gitea. Remember to restore your configuration after all updates. + +### Git command access with HTTPS + +If you want to use the Git command (like `git clone`, `git pull`, `git push`), you need to set this app as **public**. + +## Documentation and resources + +* Official app website: +* Official admin documentation: +* Upstream app code repository: +* YunoHost documentation for this app: +* Report a bug: + +## Developer info + +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/gitea_ynh/tree/testing). + +To try the testing branch, please proceed like that. + +``` bash +sudo yunohost app install https://github.com/YunoHost-Apps/gitea_ynh/tree/testing --debug +or +sudo yunohost app upgrade gitea -u https://github.com/YunoHost-Apps/gitea_ynh/tree/testing --debug +``` + +**More info regarding app packaging:** diff --git a/README_fr.md b/README_fr.md new file mode 100644 index 0000000..4cc8a05 --- /dev/null +++ b/README_fr.md @@ -0,0 +1,127 @@ + + +# Gitea pour YunoHost + +[![Niveau d'intégration](https://dash.yunohost.org/integration/gitea.svg)](https://dash.yunohost.org/appci/app/gitea) ![Statut du fonctionnement](https://ci-apps.yunohost.org/ci/badges/gitea.status.svg) ![Statut de maintenance](https://ci-apps.yunohost.org/ci/badges/gitea.maintain.svg) +[![Installer Gitea avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=gitea) + +*[Read this readme in english.](./README.md)* + +> *Ce package vous permet d'installer Gitea rapidement et simplement sur un serveur YunoHost. +Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour savoir comment l'installer et en profiter.* + +## Vue d'ensemble + +Gitea is a fork of Gogs a self-hosted Git service written in Go. Alternative to GitHub. + + +**Version incluse :** 1.17.2~ynh2 + +## Captures d'écran + +![Capture d'écran de Gitea](./doc/screenshots/screenshot.png) + +## Avertissements / informations importantes + +## Additional informations + +### Notes on SSH usage + +If you want to use Gitea with SSH and be able to pull/push with your SSH key, your SSH daemon must be properly configured to use private/public keys. Here is a sample configuration `/etc/ssh/sshd_config` that works with Gitea: + +```bash +PubkeyAuthentication yes +AuthorizedKeysFile /home/yunohost.app/%u/.ssh/authorized_keys +ChallengeResponseAuthentication no +PasswordAuthentication no +UsePAM no +``` + +You must also add your public key to your Gitea profile. + +When using SSH on any port other than 22, you need to add these lines to your SSH configuration `~/.ssh/config`: + +```bash +Host domain.tld + port 2222 # change this with the port you use +``` + +### Upgrade + +By default, a backup is performed before upgrading. To avoid this, you have the following options: +- Pass the `NO_BACKUP_UPGRADE` env variable with `1` at each upgrade. For example `NO_BACKUP_UPGRADE=1 yunohost app upgrade gitea`. +- Set `disable_backup_before_upgrade` to `1`. You can set it with this command: + +`yunohost app setting gitea disable_backup_before_upgrade -v 1` + +After that, the settings will be applied for **all** the next updates. + +From command line: + +`yunohost app upgrade gitea` + +### Backup + +This application now uses the core-only feature of the backup. To keep the integrity of the data and to have a better guarantee of the restoration it is recommended to proceed as follows: + +- Stop Gitea service with this command: + +`systemctl stop gitea.service` + +- Launch Gitea backup with this command: + +`yunohost backup create --app gitea` + +- Backup your data with your specific strategy (could be with rsync, borg backup or just cp). The data is generally stored in `/home/yunohost.app/gitea`. +- Restart Gitea service with theses command: + +`systemctl start gitea.service` + +### Remove + +Due of the backup core only feature the data directory in `/home/yunohost.app/gitea` **is not removed**. It must be manually deleted to purge user data from the app. + +### LFS setup +To use a repository with an `LFS` setup, you need to activate it on `/opt/gitea/custom/conf/app.ini` + +```ini +[server] +LFS_START_SERVER = true +LFS_HTTP_AUTH_EXPIRY = 20m +``` +By default, NGINX is configured with a maximum value for uploading files at 200 MB. It's possible to change this value on `/etc/nginx/conf.d/my.domain.tld.d/gitea.conf`. +``` +client_max_body_size 200M; +``` +Don't forget to restart Gitea `sudo systemctl restart gitea.service`. + +> These settings are restored to the default configuration when updating Gitea. Remember to restore your configuration after all updates. + +### Git command access with HTTPS + +If you want to use the Git command (like `git clone`, `git pull`, `git push`), you need to set this app as **public**. + +## Documentations et ressources + +* Site officiel de l'app : +* Documentation officielle de l'admin : +* Dépôt de code officiel de l'app : +* Documentation YunoHost pour cette app : +* Signaler un bug : + +## Informations pour les développeurs + +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/gitea_ynh/tree/testing). + +Pour essayer la branche testing, procédez comme suit. + +``` bash +sudo yunohost app install https://github.com/YunoHost-Apps/gitea_ynh/tree/testing --debug +ou +sudo yunohost app upgrade gitea -u https://github.com/YunoHost-Apps/gitea_ynh/tree/testing --debug +``` + +**Plus d'infos sur le packaging d'applications :** diff --git a/check_process b/check_process new file mode 100644 index 0000000..1acdd87 --- /dev/null +++ b/check_process @@ -0,0 +1,30 @@ +;; General + ; Manifest + domain="domain.tld" + path="/path" + admin="john" + is_public=1 + ; Checks + pkg_linter=1 + setup_sub_dir=1 + setup_root=1 + setup_nourl=0 + setup_private=1 + setup_public=1 + upgrade=1 + #1.14.5 + upgrade=1 from_commit=7ea357724f2371aa1173f15ba5a7502609a0a131 + upgrade=1 from_commit=bd3fe9a8467864391ffaf96426036ab731833f99 + upgrade=1 from_commit=4e078e91129725c8b09ba551ab2a04e0328a45b3 + backup_restore=1 + multi_instance=1 + incorrect_path=0 + port_already_use=1 (6000) + change_url=1 +;;; Upgrade options + ; commit=7ea357724f2371aa1173f15ba5a7502609a0a131 + name=1.14.5 + ; commit=bd3fe9a8467864391ffaf96426036ab731833f99 + name=Just after group permission support + ; commit=4e078e91129725c8b09ba551ab2a04e0328a45b3 + name=Gogs code, check migration from gogs diff --git a/conf/app.ini b/conf/app.ini new file mode 100644 index 0000000..c954f1d --- /dev/null +++ b/conf/app.ini @@ -0,0 +1,78 @@ +;https://github.com/gogits/gogs/blob/master/conf/app.ini +APP_NAME = Gitea +RUN_USER = __APP__ +RUN_MODE = prod + +[database] +DB_TYPE = mysql +HOST = 127.0.0.1:3306 +NAME = __DB_USER__ +USER = __DB_USER__ +PASSWD = __DB_PASSWORD__ +SSL_MODE = disable +PATH = data/gitea.db +LOG_SQL = false + +[repository] +ROOT = __REPOS_PATH__ +FORCE_PRIVATE = false + +[server] +DOMAIN = __DOMAIN__ +HTTP_PORT = __PORT__ +HTTP_ADDR = 127.0.0.1 +ROOT_URL = https://__DOMAIN____PATH_URL__ +DISABLE_SSH = false +SSH_PORT = __SSH_PORT__ +OFFLINE_MODE = false +APP_DATA_PATH = __DATA_PATH__ +LANDING_PAGE = explore +LFS_START_SERVER = true +LFS_JWT_SECRET = __LFS_KEY__ + +[mailer] +ENABLED = true +HOST = 127.0.0.1:25 +FROM = "Gitea" +SKIP_VERIFY = true + +[service] +REGISTER_EMAIL_CONFIRM = false +ENABLE_NOTIFY_MAIL = true +DISABLE_REGISTRATION = true +ENABLE_CAPTCHA = false +REQUIRE_SIGNIN_VIEW = false +ENABLE_REVERSE_PROXY_AUTHENTICATION = true +ENABLE_REVERSE_PROXY_AUTO_REGISTRATION = true + +[picture] +AVATAR_UPLOAD_PATH = __DATA_PATH__/avatars + +[attachment] +PATH = __DATA_PATH__/attachments + +[session] +PROVIDER = memory + +[log] +MODE = file +LEVEL = Info +ROOT_PATH = /var/log/__APP__ + +REDIRECT_MACARON_LOG= true +MACARON = file + +ROUTER_LOG_LEVEL = Warn +ROUTER = file + +ENABLE_ACCESS_LOG = Warn +ACCESS = file + +ENABLE_XORM_LOG = Warn +XORM = file + +[security] +INSTALL_LOCK = true +SECRET_KEY = __KEY__ +REVERSE_PROXY_AUTHENTICATION_USER = REMOTE-USER +REVERSE_PROXY_TRUSTED_PROXIES = 127.0.0.0/8,::1/128 diff --git a/conf/gogs_migrations b/conf/gogs_migrations new file mode 100644 index 0000000..5e7a3c4 --- /dev/null +++ b/conf/gogs_migrations @@ -0,0 +1,5 @@ +/opt/$app +/home/$app +/var/log/$app +/etc/systemd/system/$app.service +/etc/nginx/conf.d/$domain.d/$app.conf diff --git a/conf/gogs_post_migration.sh b/conf/gogs_post_migration.sh new file mode 100644 index 0000000..e4065ff --- /dev/null +++ b/conf/gogs_post_migration.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# Ending the migration process from Gogs to Gitea + +set -u + +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source /usr/share/yunohost/helpers + +#================================================= +# SET VARIABLES +#================================================= + +old_app="__OLD_APP__" +new_app="__NEW_APP__" +script_name="$0" + +#================================================= +# DELETE OLD APP'S SETTINGS +#================================================= + +ynh_secure_remove --file="/etc/yunohost/apps/$old_app" +yunohost app ssowatconf + +#================================================= +# DELETE THIS SCRIPT +#================================================= + +echo "rm $script_name" | at now + 1 minutes diff --git a/conf/login_source.sql b/conf/login_source.sql new file mode 100644 index 0000000..72eb3b0 --- /dev/null +++ b/conf/login_source.sql @@ -0,0 +1,6 @@ +INSERT INTO `__APP__`.`login_source` +(`id`, `type`, `name`, `is_active`, `cfg`, `created_unix`, `updated_unix`) +VALUES +('1', '2', 'YunoHost LDAP', '1', '{"Name":"Yunohost LDAP","Host":"localhost","Port":389,"UseSSL":false,"BindDN":"","BindPassword":"","UserBase":"ou=users,dc=yunohost,dc=org","AttributeName":"givenName","AttributeSurname":"sn","AttributeMail":"mail","Filter":"(&(uid=%s)(objectClass=posixAccount)(permission=cn=__APP__.main,ou=permission,dc=yunohost,dc=org))","AdminFilter":"(permission=cn=__APP__.admin,ou=permission,dc=yunohost,dc=org)","Enabled":true}', '1464014433', '1464015955') +ON DUPLICATE KEY +UPDATE cfg='{"Name":"YunoHost LDAP","Host":"localhost","Port":389,"UseSSL":false,"BindDN":"","BindPassword":"","UserBase":"ou=users,dc=yunohost,dc=org","AttributeName":"givenName","AttributeSurname":"sn","AttributeMail":"mail","Filter":"(&(uid=%s)(objectClass=posixAccount)(permission=cn=__APP__.main,ou=permission,dc=yunohost,dc=org))","AdminFilter":"(permission=cn=__APP__.admin,ou=permission,dc=yunohost,dc=org)","Enabled":true}'; diff --git a/conf/nginx.conf b/conf/nginx.conf new file mode 100644 index 0000000..acafbce --- /dev/null +++ b/conf/nginx.conf @@ -0,0 +1,11 @@ +#sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; +location __PATH__/ { + proxy_pass http://localhost:__PORT__/; + proxy_set_header Host $host; + proxy_buffering off; + client_max_body_size 200M; + proxy_set_header X-Real-IP $remote_addr; + + # Include SSOWAT user panel. + include conf.d/yunohost_panel.conf.inc; +} diff --git a/conf/source/arm.src b/conf/source/arm.src new file mode 100644 index 0000000..40ff57e --- /dev/null +++ b/conf/source/arm.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.17.2/gitea-1.17.2-linux-arm-6 +SOURCE_SUM=c8302d6c55a3471640e546fa2f6d619117af6e06fcf55017bd586854ffb93e7c +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64.src b/conf/source/arm64.src new file mode 100644 index 0000000..1bd78c7 --- /dev/null +++ b/conf/source/arm64.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.17.2/gitea-1.17.2-linux-arm64 +SOURCE_SUM=3ab5ac9400d8b28a38ecd173c5e181c2521c381a65ac00043b2d579a449efa27 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64_1.0.src b/conf/source/arm64_1.0.src new file mode 100644 index 0000000..3117a5d --- /dev/null +++ b/conf/source/arm64_1.0.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.0.2/gitea-1.0.2-linux-arm64 +SOURCE_SUM=b13562f19c41602d2b4f1601931e9d150de8273682969c081a4a5029622eb8b3 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64_1.1.src b/conf/source/arm64_1.1.src new file mode 100644 index 0000000..dc6b942 --- /dev/null +++ b/conf/source/arm64_1.1.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.1.4/gitea-1.1.4-linux-arm64 +SOURCE_SUM=3f7a01669bbad671907942cece744f12390a37771fd8e1142afffeb9ee1f31f7 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64_1.10.src b/conf/source/arm64_1.10.src new file mode 100644 index 0000000..f7f45e4 --- /dev/null +++ b/conf/source/arm64_1.10.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.10.3/gitea-1.10.3-linux-arm64 +SOURCE_SUM=3a0b6470a205c6b9f19a8b31469728f29818c58dd17e85a81ac4a928ab9f9512 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64_1.11.src b/conf/source/arm64_1.11.src new file mode 100644 index 0000000..afc1f2f --- /dev/null +++ b/conf/source/arm64_1.11.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.11.7/gitea-1.11.7-linux-arm64 +SOURCE_SUM=71bc3b41955461491ca3b1a1e4abeaf70dc0cbd15e43e59e2178514b8f1ef0f8 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64_1.12.src b/conf/source/arm64_1.12.src new file mode 100644 index 0000000..ce264f0 --- /dev/null +++ b/conf/source/arm64_1.12.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.12.6/gitea-1.12.6-linux-arm64 +SOURCE_SUM=b1e4620191d817b6d6975358c35197bf659bce04a5690bea2d1e6511054d0866 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64_1.13.src b/conf/source/arm64_1.13.src new file mode 100644 index 0000000..2fbd874 --- /dev/null +++ b/conf/source/arm64_1.13.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.13.7/gitea-1.13.7-linux-arm64 +SOURCE_SUM=cae7529e75ccfb0e4f3270c197777f9dbdcf66a516d3b4e102d1e208ff9a0224 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64_1.14.src b/conf/source/arm64_1.14.src new file mode 100644 index 0000000..9bf2c89 --- /dev/null +++ b/conf/source/arm64_1.14.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.14.6/gitea-1.14.6-linux-arm64 +SOURCE_SUM=d0e177368445748dcbfc3a082e2f1c68317d1490e11574224fb12ca01e91e15e +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64_1.15.src b/conf/source/arm64_1.15.src new file mode 100644 index 0000000..13f65f7 --- /dev/null +++ b/conf/source/arm64_1.15.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.15.11/gitea-1.15.11-linux-arm64 +SOURCE_SUM=a41a702d24e463c44dbc57a30551938a5e4c9377995065aca07e9dfbb22d5afc +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64_1.16.src b/conf/source/arm64_1.16.src new file mode 100644 index 0000000..f686bfd --- /dev/null +++ b/conf/source/arm64_1.16.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.16.9/gitea-1.16.9-linux-arm64 +SOURCE_SUM=c468cb92fee1fc917923fd2728449fb9da97e5e9e4322d531716b3c6571ceb20 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64_1.2.src b/conf/source/arm64_1.2.src new file mode 100644 index 0000000..553ba66 --- /dev/null +++ b/conf/source/arm64_1.2.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.2.3/gitea-1.2.3-linux-arm64 +SOURCE_SUM=e779d43f2050c43138509a40540bdd4d16a11e8b76a6f66b447623ead6466fca +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64_1.3.src b/conf/source/arm64_1.3.src new file mode 100644 index 0000000..a0f3524 --- /dev/null +++ b/conf/source/arm64_1.3.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.3.3/gitea-1.3.3-linux-arm64 +SOURCE_SUM=348993e5fd119b6708b96a29067ddc41d8fefe4c0d5abf540d1e89e9886202ce +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64_1.4.src b/conf/source/arm64_1.4.src new file mode 100644 index 0000000..9d9083e --- /dev/null +++ b/conf/source/arm64_1.4.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.4.3/gitea-1.4.3-linux-arm64 +SOURCE_SUM=af6a55516b94f5bfb7a9744086bd92124e6cba8c3d610935e5fe4c8ba42427ef +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64_1.5.src b/conf/source/arm64_1.5.src new file mode 100644 index 0000000..5bed656 --- /dev/null +++ b/conf/source/arm64_1.5.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.5.3/gitea-1.5.3-linux-arm64 +SOURCE_SUM=cdddf46e1711c7964cfd18b4ae37109d4865996b26426d4badaa78da969cfbae +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64_1.6.src b/conf/source/arm64_1.6.src new file mode 100644 index 0000000..74a0d32 --- /dev/null +++ b/conf/source/arm64_1.6.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.6.4/gitea-1.6.4-linux-arm64 +SOURCE_SUM=30252ca0adf170e84f52499a502195ad762f4fdca941f40ded80292790eaa2d3 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64_1.7.src b/conf/source/arm64_1.7.src new file mode 100644 index 0000000..31e6f82 --- /dev/null +++ b/conf/source/arm64_1.7.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.7.3/gitea-1.7.3-linux-arm64 +SOURCE_SUM=dc34250ddbcdf3096a7355db419fff615d7fd488e0336bec9bc880091f549c23 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64_1.8.src b/conf/source/arm64_1.8.src new file mode 100644 index 0000000..2737a2e --- /dev/null +++ b/conf/source/arm64_1.8.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.8.3/gitea-1.8.3-linux-arm64 +SOURCE_SUM=e3569745122a793dbf1e86940a00c8843c0c3022513a9d9004593823b9e6abe1 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm64_1.9.src b/conf/source/arm64_1.9.src new file mode 100644 index 0000000..1563e22 --- /dev/null +++ b/conf/source/arm64_1.9.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.9.6/gitea-1.9.6-linux-arm64 +SOURCE_SUM=f11e46fdca921e81255c4b052969e5c6085f24245e6e0da726c9627aaec78252 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm_1.0.src b/conf/source/arm_1.0.src new file mode 100644 index 0000000..fe6aee6 --- /dev/null +++ b/conf/source/arm_1.0.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.0.2/gitea-1.0.2-linux-arm-6 +SOURCE_SUM=d8cd551840b4b5620609eba92e810f4963b259d2809a34724e8fae7b1db00d91 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm_1.1.src b/conf/source/arm_1.1.src new file mode 100644 index 0000000..9b8691d --- /dev/null +++ b/conf/source/arm_1.1.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.1.4/gitea-1.1.4-linux-arm-6 +SOURCE_SUM=f39bce7927b363402d37774484a5d0c893ee55595175e3a4d14a12126bccdd80 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm_1.10.src b/conf/source/arm_1.10.src new file mode 100644 index 0000000..b0f51f2 --- /dev/null +++ b/conf/source/arm_1.10.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.10.3/gitea-1.10.3-linux-arm-6 +SOURCE_SUM=54ca0b8ca9f927c91c69c61da134738b66faf0be68e310f140e56c4f14fe7ecf +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm_1.11.src b/conf/source/arm_1.11.src new file mode 100644 index 0000000..1a7b02d --- /dev/null +++ b/conf/source/arm_1.11.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.11.7/gitea-1.11.7-linux-arm-6 +SOURCE_SUM=f106d1a846da7abfd8a7dbf20a5d9c60502e1ed034a31f5503f460dea4d0c77d +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm_1.12.src b/conf/source/arm_1.12.src new file mode 100644 index 0000000..5e44f55 --- /dev/null +++ b/conf/source/arm_1.12.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.12.6/gitea-1.12.6-linux-arm-6 +SOURCE_SUM=116caba20b596886b03309df0e319a5885ee72e3740e62ac488e4e38f424ca88 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm_1.13.src b/conf/source/arm_1.13.src new file mode 100644 index 0000000..91fd474 --- /dev/null +++ b/conf/source/arm_1.13.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.13.7/gitea-1.13.7-linux-arm-6 +SOURCE_SUM=ed4a0c39e1d68592210d5be78ef90125760f24cf1448fb864081265c93823ef7 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm_1.14.src b/conf/source/arm_1.14.src new file mode 100644 index 0000000..cb57028 --- /dev/null +++ b/conf/source/arm_1.14.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.14.6/gitea-1.14.6-linux-arm-6 +SOURCE_SUM=4c075c11ee6b89b6c436c94e47290cf7daeff2006bb7ca1fbe6f22db4482e16f +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm_1.15.src b/conf/source/arm_1.15.src new file mode 100644 index 0000000..25f4ee1 --- /dev/null +++ b/conf/source/arm_1.15.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.15.11/gitea-1.15.11-linux-arm-6 +SOURCE_SUM=c60d364d8cb7e25b341cb7d9988cbc7b3485ff5aa994e021980dc47996a870f9 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm_1.16.src b/conf/source/arm_1.16.src new file mode 100644 index 0000000..13945b8 --- /dev/null +++ b/conf/source/arm_1.16.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.16.9/gitea-1.16.9-linux-arm-6 +SOURCE_SUM=0f0af0169b17927db6e8fe8711ef40c139d366983653034d6601e27761c3aa2b +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm_1.2.src b/conf/source/arm_1.2.src new file mode 100644 index 0000000..6b5755d --- /dev/null +++ b/conf/source/arm_1.2.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.2.3/gitea-1.2.3-linux-arm-6 +SOURCE_SUM=06023c75babee8c9d76cee2886890ae9fe82b84a0e723c11ef9fafe3c5ba9539 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm_1.3.src b/conf/source/arm_1.3.src new file mode 100644 index 0000000..22ad6a9 --- /dev/null +++ b/conf/source/arm_1.3.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.3.3/gitea-1.3.3-linux-arm-6 +SOURCE_SUM=b1b20d5905cd275b384da2a08d36ed0730801f23fb33df5c45302c9a6ec62dc6 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm_1.4.src b/conf/source/arm_1.4.src new file mode 100644 index 0000000..2b3c5bd --- /dev/null +++ b/conf/source/arm_1.4.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.4.3/gitea-1.4.3-linux-arm-6 +SOURCE_SUM=d7341bd9536dbc7b1c3935efe3b0b6be953b0c3f0390b9b794e8fd54d58fee5b +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm_1.5.src b/conf/source/arm_1.5.src new file mode 100644 index 0000000..51d6bf6 --- /dev/null +++ b/conf/source/arm_1.5.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.5.3/gitea-1.5.3-linux-arm-6 +SOURCE_SUM=6d16b6bcc3cf804cc9b4e0e9ce3aa42e6699662f99998a06c25c7a43df64b0b6 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm_1.6.src b/conf/source/arm_1.6.src new file mode 100644 index 0000000..3b74aca --- /dev/null +++ b/conf/source/arm_1.6.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.6.4/gitea-1.6.4-linux-arm-6 +SOURCE_SUM=30bb6220cde6b35522bdaf5ffca0d2daba8a0eebee56e3f11cd40d3e5f8f5669 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm_1.7.src b/conf/source/arm_1.7.src new file mode 100644 index 0000000..8f37252 --- /dev/null +++ b/conf/source/arm_1.7.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.7.3/gitea-1.7.3-linux-arm-6 +SOURCE_SUM=c38394be40634b0e1bd0fac0898474ff50e4535af610c12ee16ec3cabd2d4771 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm_1.8.src b/conf/source/arm_1.8.src new file mode 100644 index 0000000..d5005b9 --- /dev/null +++ b/conf/source/arm_1.8.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.8.3/gitea-1.8.3-linux-arm-6 +SOURCE_SUM=920b74ec10be323e5dc684fe3b5c3b157bf6f1d6cca0ee1c4f9693f766d1574d +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/arm_1.9.src b/conf/source/arm_1.9.src new file mode 100644 index 0000000..d37b2e2 --- /dev/null +++ b/conf/source/arm_1.9.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.9.6/gitea-1.9.6-linux-arm-6 +SOURCE_SUM=b8f825d701d9205b529acfc9c311fd079af8f0b4ae9267b2dab5c12aee339c57 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7.src b/conf/source/armv7.src new file mode 100644 index 0000000..6c964c7 --- /dev/null +++ b/conf/source/armv7.src @@ -0,0 +1,8 @@ +# The armv7 build is brocken +# See : https://github.com/go-gitea/gitea/issues/6700 +# Use temporary the armv6 binary +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.17.2/gitea-1.17.2-linux-arm-6 +SOURCE_SUM=c8302d6c55a3471640e546fa2f6d619117af6e06fcf55017bd586854ffb93e7c +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7_1.0.src b/conf/source/armv7_1.0.src new file mode 100644 index 0000000..9d39570 --- /dev/null +++ b/conf/source/armv7_1.0.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.0.2/gitea-1.0.2-linux-arm-7 +SOURCE_SUM=1533c4b9142d89e3ac78ac9650a1f1507d24f9ac7afcdbe73c83ae5517c36165 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7_1.1.src b/conf/source/armv7_1.1.src new file mode 100644 index 0000000..6b83741 --- /dev/null +++ b/conf/source/armv7_1.1.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.1.4/gitea-1.1.4-linux-arm-7 +SOURCE_SUM=3b66cbca2f6ad10c8323c3d35280d63d17e192ab5e4aaa7415f5048710c00705 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7_1.10.src b/conf/source/armv7_1.10.src new file mode 100644 index 0000000..85e75ea --- /dev/null +++ b/conf/source/armv7_1.10.src @@ -0,0 +1,8 @@ +# The armv7 build is brocken +# See : https://github.com/go-gitea/gitea/issues/6700 +# Use temporary the armv6 binary +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.10.3/gitea-1.10.3-linux-arm-6 +SOURCE_SUM=54ca0b8ca9f927c91c69c61da134738b66faf0be68e310f140e56c4f14fe7ecf +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7_1.11.src b/conf/source/armv7_1.11.src new file mode 100644 index 0000000..52fa6b7 --- /dev/null +++ b/conf/source/armv7_1.11.src @@ -0,0 +1,8 @@ +# The armv7 build is brocken +# See : https://github.com/go-gitea/gitea/issues/6700 +# Use temporary the armv6 binary +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.11.7/gitea-1.11.7-linux-arm-6 +SOURCE_SUM=f106d1a846da7abfd8a7dbf20a5d9c60502e1ed034a31f5503f460dea4d0c77d +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7_1.12.src b/conf/source/armv7_1.12.src new file mode 100644 index 0000000..00b1c14 --- /dev/null +++ b/conf/source/armv7_1.12.src @@ -0,0 +1,8 @@ +# The armv7 build is brocken +# See : https://github.com/go-gitea/gitea/issues/6700 +# Use temporary the armv6 binary +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.12.6/gitea-1.12.6-linux-arm-6 +SOURCE_SUM=116caba20b596886b03309df0e319a5885ee72e3740e62ac488e4e38f424ca88 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7_1.13.src b/conf/source/armv7_1.13.src new file mode 100644 index 0000000..dea7e9f --- /dev/null +++ b/conf/source/armv7_1.13.src @@ -0,0 +1,8 @@ +# The armv7 build is brocken +# See : https://github.com/go-gitea/gitea/issues/6700 +# Use temporary the armv6 binary +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.13.7/gitea-1.13.7-linux-arm-6 +SOURCE_SUM=ed4a0c39e1d68592210d5be78ef90125760f24cf1448fb864081265c93823ef7 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7_1.14.src b/conf/source/armv7_1.14.src new file mode 100644 index 0000000..bd3cdc1 --- /dev/null +++ b/conf/source/armv7_1.14.src @@ -0,0 +1,8 @@ +# The armv7 build is brocken +# See : https://github.com/go-gitea/gitea/issues/6700 +# Use temporary the armv6 binary +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.14.6/gitea-1.14.6-linux-arm-6 +SOURCE_SUM=4c075c11ee6b89b6c436c94e47290cf7daeff2006bb7ca1fbe6f22db4482e16f +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7_1.15.src b/conf/source/armv7_1.15.src new file mode 100644 index 0000000..3c2672e --- /dev/null +++ b/conf/source/armv7_1.15.src @@ -0,0 +1,8 @@ +# The armv7 build is brocken +# See : https://github.com/go-gitea/gitea/issues/6700 +# Use temporary the armv6 binary +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.15.11/gitea-1.15.11-linux-arm-6 +SOURCE_SUM=c60d364d8cb7e25b341cb7d9988cbc7b3485ff5aa994e021980dc47996a870f9 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7_1.16.src b/conf/source/armv7_1.16.src new file mode 100644 index 0000000..440a26a --- /dev/null +++ b/conf/source/armv7_1.16.src @@ -0,0 +1,8 @@ +# The armv7 build is brocken +# See : https://github.com/go-gitea/gitea/issues/6700 +# Use temporary the armv6 binary +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.16.9/gitea-1.16.9-linux-arm-6 +SOURCE_SUM=0f0af0169b17927db6e8fe8711ef40c139d366983653034d6601e27761c3aa2b +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7_1.2.src b/conf/source/armv7_1.2.src new file mode 100644 index 0000000..63fe266 --- /dev/null +++ b/conf/source/armv7_1.2.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.2.3/gitea-1.2.3-linux-arm-7 +SOURCE_SUM=92a1a6fccae6d9382dccee90223457850124a8a9e9505401a04f507b8a90c1dd +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7_1.3.src b/conf/source/armv7_1.3.src new file mode 100644 index 0000000..f5dd751 --- /dev/null +++ b/conf/source/armv7_1.3.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.3.3/gitea-1.3.3-linux-arm-7 +SOURCE_SUM=1f52cbaf97ca70cf6db5c152f6cff7921e9b066ffbe21ee4015616946c9d4251 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7_1.4.src b/conf/source/armv7_1.4.src new file mode 100644 index 0000000..7849e95 --- /dev/null +++ b/conf/source/armv7_1.4.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.4.3/gitea-1.4.3-linux-arm-7 +SOURCE_SUM=2a93d7a09f0f9b999651f156a4c0c65a1d4da0c75a68a13bdd0b920082d514de +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7_1.5.src b/conf/source/armv7_1.5.src new file mode 100644 index 0000000..7d7c476 --- /dev/null +++ b/conf/source/armv7_1.5.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.5.3/gitea-1.5.3-linux-arm-7 +SOURCE_SUM=eb939edb6cdc46702109410f38e358cc572564307e619c4798b6b8b99d6ec7e5 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7_1.6.src b/conf/source/armv7_1.6.src new file mode 100644 index 0000000..100a3b3 --- /dev/null +++ b/conf/source/armv7_1.6.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.6.4/gitea-1.6.4-linux-arm-7 +SOURCE_SUM=e78d31922e42ccaaf6566f32e249fb6ba4af2876102c6248b3ba32d051e69327 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7_1.7.src b/conf/source/armv7_1.7.src new file mode 100644 index 0000000..5eb2360 --- /dev/null +++ b/conf/source/armv7_1.7.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.7.3/gitea-1.7.3-linux-arm-7 +SOURCE_SUM=fd4ba028a30eb2fac1f8570fd3f6157f0c46c21992a2062dd7a6751cc8a47f2f +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7_1.8.src b/conf/source/armv7_1.8.src new file mode 100644 index 0000000..918684d --- /dev/null +++ b/conf/source/armv7_1.8.src @@ -0,0 +1,8 @@ +# The armv7 build is brocken +# See : https://github.com/go-gitea/gitea/issues/6700 +# Use temporary the armv6 binary +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.8.3/gitea-1.8.3-linux-arm-6 +SOURCE_SUM=920b74ec10be323e5dc684fe3b5c3b157bf6f1d6cca0ee1c4f9693f766d1574d +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/armv7_1.9.src b/conf/source/armv7_1.9.src new file mode 100644 index 0000000..c9117cf --- /dev/null +++ b/conf/source/armv7_1.9.src @@ -0,0 +1,8 @@ +# The armv7 build is brocken +# See : https://github.com/go-gitea/gitea/issues/6700 +# Use temporary the armv6 binary +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.9.6/gitea-1.9.6-linux-arm-6 +SOURCE_SUM=b8f825d701d9205b529acfc9c311fd079af8f0b4ae9267b2dab5c12aee339c57 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386.src b/conf/source/i386.src new file mode 100644 index 0000000..7c6c652 --- /dev/null +++ b/conf/source/i386.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.17.2/gitea-1.17.2-linux-386 +SOURCE_SUM=6717d9589b7a671b8dabd772f36495256438942d038d0a898334616a9becdd43 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386_1.0.src b/conf/source/i386_1.0.src new file mode 100644 index 0000000..2ca0757 --- /dev/null +++ b/conf/source/i386_1.0.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.0.2/gitea-1.0.2-linux-386 +SOURCE_SUM=966840c7b815662332c3785a65685bed08c8eab508b8af0fe41307b5ebce8399 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386_1.1.src b/conf/source/i386_1.1.src new file mode 100644 index 0000000..80a2235 --- /dev/null +++ b/conf/source/i386_1.1.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.1.4/gitea-1.1.4-linux-386 +SOURCE_SUM=d3fc91e4da9282abc2785bb96d1d805c85ae0a253228c2277e21fb332946c0fe +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386_1.10.src b/conf/source/i386_1.10.src new file mode 100644 index 0000000..8bd8a32 --- /dev/null +++ b/conf/source/i386_1.10.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.10.3/gitea-1.10.3-linux-386 +SOURCE_SUM=829946f7ba6fced84d42718039db4be4371e10a3166f44ee22c9bfee35747954 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386_1.11.src b/conf/source/i386_1.11.src new file mode 100644 index 0000000..5c466c2 --- /dev/null +++ b/conf/source/i386_1.11.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.11.7/gitea-1.11.7-linux-386 +SOURCE_SUM=e176c650ab1dd9735014e5a2c29f15585b988ead9d800d02763e0f4adf283496 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386_1.12.src b/conf/source/i386_1.12.src new file mode 100644 index 0000000..97ff451 --- /dev/null +++ b/conf/source/i386_1.12.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.12.6/gitea-1.12.6-linux-386 +SOURCE_SUM=de287e912b32b0617e538f4c9c8d263fc16b5e2ba0b76ea9ab018011e9943316 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386_1.13.src b/conf/source/i386_1.13.src new file mode 100644 index 0000000..a226815 --- /dev/null +++ b/conf/source/i386_1.13.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.13.7/gitea-1.13.7-linux-386 +SOURCE_SUM=927710a470af5f5ebab55bb3e4a0994f5832942c1c618e288226b57634232ec4 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386_1.14.src b/conf/source/i386_1.14.src new file mode 100644 index 0000000..b9868bd --- /dev/null +++ b/conf/source/i386_1.14.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.14.6/gitea-1.14.6-linux-386 +SOURCE_SUM=1a3382eb4faf60a5f5c590843f8e7cd1f7d0e78e99fe2511f86368340c0cfe2e +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386_1.15.src b/conf/source/i386_1.15.src new file mode 100644 index 0000000..53f0004 --- /dev/null +++ b/conf/source/i386_1.15.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.15.11/gitea-1.15.11-linux-386 +SOURCE_SUM=bad15648236e8da71de1a09b9fe0f21d955605c3aba92f6bcf7dc1f490791a8d +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386_1.16.src b/conf/source/i386_1.16.src new file mode 100644 index 0000000..ac697d4 --- /dev/null +++ b/conf/source/i386_1.16.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.16.9/gitea-1.16.9-linux-386 +SOURCE_SUM=de40bf7cd20fe42f0d32bfc7401480cec7e1496297cb726acc94afd9d190bf9f +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386_1.2.src b/conf/source/i386_1.2.src new file mode 100644 index 0000000..d80179c --- /dev/null +++ b/conf/source/i386_1.2.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.2.3/gitea-1.2.3-linux-386 +SOURCE_SUM=a8593c5e908c7e6c26620d45122d017e38441e915a4ea472543251772dc5a6d9 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386_1.3.src b/conf/source/i386_1.3.src new file mode 100644 index 0000000..aa33a24 --- /dev/null +++ b/conf/source/i386_1.3.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.3.3/gitea-1.3.3-linux-386 +SOURCE_SUM=1b746cccffca446876ccc71efe328699f002622dab1d438e2142c8d7c23a22d7 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386_1.4.src b/conf/source/i386_1.4.src new file mode 100644 index 0000000..61dd883 --- /dev/null +++ b/conf/source/i386_1.4.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.4.3/gitea-1.4.3-linux-386 +SOURCE_SUM=760dda6f1cd76aa705915686a1d18837af3c4d912f731d1399048409a46ed2ea +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386_1.5.src b/conf/source/i386_1.5.src new file mode 100644 index 0000000..a8b9d00 --- /dev/null +++ b/conf/source/i386_1.5.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.5.3/gitea-1.5.3-linux-386 +SOURCE_SUM=292ef977c46b15650a68782666710bc3379bb4b22a3ae2cae761724569ca5857 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386_1.6.src b/conf/source/i386_1.6.src new file mode 100644 index 0000000..eabb1f5 --- /dev/null +++ b/conf/source/i386_1.6.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.6.4/gitea-1.6.4-linux-386 +SOURCE_SUM=1ccdca624582fbfb8c2b0a819b63b33e7b05a2d355bb4527cc55a6e367d5765d +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386_1.7.src b/conf/source/i386_1.7.src new file mode 100644 index 0000000..2fcf64e --- /dev/null +++ b/conf/source/i386_1.7.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.7.3/gitea-1.7.3-linux-386 +SOURCE_SUM=a420bccb17e6e1c317c014475ce5a5bf8091da123cc55b0569660ae43ababf44 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386_1.8.src b/conf/source/i386_1.8.src new file mode 100644 index 0000000..256641b --- /dev/null +++ b/conf/source/i386_1.8.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.8.3/gitea-1.8.3-linux-386 +SOURCE_SUM=e58f4a88b01a4880f97ae32a92e869d978a434a9a876c6a3f4e4a5721e8c4bd6 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/i386_1.9.src b/conf/source/i386_1.9.src new file mode 100644 index 0000000..1be81ce --- /dev/null +++ b/conf/source/i386_1.9.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.9.6/gitea-1.9.6-linux-386 +SOURCE_SUM=0cd6db19ea9268633ba17d5a6d7d4c6cc01b79b1dc4a39e16fda110b4f5f5569 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64.src b/conf/source/x86-64.src new file mode 100644 index 0000000..a5c0369 --- /dev/null +++ b/conf/source/x86-64.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.17.2/gitea-1.17.2-linux-amd64 +SOURCE_SUM=d0e903671ae04007c5956beb65985825795c1d9b24c9f354b48008fd44db1b57 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64_1.0.src b/conf/source/x86-64_1.0.src new file mode 100644 index 0000000..134b97f --- /dev/null +++ b/conf/source/x86-64_1.0.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.0.2/gitea-1.0.2-linux-amd64 +SOURCE_SUM=02ed9a3bb7bcd1c8f3d8888e51a0887b3c0f44b2a80d50c99f9e407e457545ab +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64_1.1.src b/conf/source/x86-64_1.1.src new file mode 100644 index 0000000..00da3ab --- /dev/null +++ b/conf/source/x86-64_1.1.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.1.4/gitea-1.1.4-linux-amd64 +SOURCE_SUM=1d8804ff7bed26464d61115b9d88ead8a7a7937ceed66fd0bfaceecd4be41274 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64_1.10.src b/conf/source/x86-64_1.10.src new file mode 100644 index 0000000..1594b3a --- /dev/null +++ b/conf/source/x86-64_1.10.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.10.3/gitea-1.10.3-linux-amd64 +SOURCE_SUM=e4e393da9f3dbcc6b200a58c0ba8c19ef02346ca24d6b273748b8346313053d0 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64_1.11.src b/conf/source/x86-64_1.11.src new file mode 100644 index 0000000..6e5dee4 --- /dev/null +++ b/conf/source/x86-64_1.11.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.11.7/gitea-1.11.7-linux-amd64 +SOURCE_SUM=9261c23b0063132eba61f995561d3a1e76eabfadd7370f8dea2989180c36e2ff +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64_1.12.src b/conf/source/x86-64_1.12.src new file mode 100644 index 0000000..477a46a --- /dev/null +++ b/conf/source/x86-64_1.12.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.12.6/gitea-1.12.6-linux-amd64 +SOURCE_SUM=74417bc8e950b685de79c3a39655029f28d27c99e94adbe83c0ec22325d8771f +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64_1.13.src b/conf/source/x86-64_1.13.src new file mode 100644 index 0000000..eddcf5a --- /dev/null +++ b/conf/source/x86-64_1.13.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.13.7/gitea-1.13.7-linux-amd64 +SOURCE_SUM=f1c0d3368d49f544183ec799005e7149fa566e3fd6eca1091d67d75b3f89f716 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64_1.14.src b/conf/source/x86-64_1.14.src new file mode 100644 index 0000000..be76bd3 --- /dev/null +++ b/conf/source/x86-64_1.14.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.14.6/gitea-1.14.6-linux-amd64 +SOURCE_SUM=20cc0a89421695320b077c9fe4f16996f03aaf9d24f661f8d2255794551c849b +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64_1.15.src b/conf/source/x86-64_1.15.src new file mode 100644 index 0000000..b647844 --- /dev/null +++ b/conf/source/x86-64_1.15.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.15.11/gitea-1.15.11-linux-amd64 +SOURCE_SUM=e2f62b67c311116fbf8e52b4c162dbd7684ce9c7f0370642c1d402fece43aa8f +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64_1.16.src b/conf/source/x86-64_1.16.src new file mode 100644 index 0000000..ee599d3 --- /dev/null +++ b/conf/source/x86-64_1.16.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.16.9/gitea-1.16.9-linux-amd64 +SOURCE_SUM=821dd30afed9ae42b18e727174b078ea9118a6ccc5106d8246bebf8180fcbef3 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64_1.2.src b/conf/source/x86-64_1.2.src new file mode 100644 index 0000000..faba5e0 --- /dev/null +++ b/conf/source/x86-64_1.2.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.2.3/gitea-1.2.3-linux-amd64 +SOURCE_SUM=bc71b6005617700c9b5654ddf5649aa9ee28dc2344d84254ddeb2678f4d44809 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64_1.3.src b/conf/source/x86-64_1.3.src new file mode 100644 index 0000000..3cfdf88 --- /dev/null +++ b/conf/source/x86-64_1.3.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.3.3/gitea-1.3.3-linux-amd64 +SOURCE_SUM=4f37b280eb9dcde7820e801e51ca07682faee703c220548da2f8aa9b6adb5231 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64_1.4.src b/conf/source/x86-64_1.4.src new file mode 100644 index 0000000..b493a9e --- /dev/null +++ b/conf/source/x86-64_1.4.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.4.3/gitea-1.4.3-linux-amd64 +SOURCE_SUM=fe60fca294baa24fe4862bbcfe29c92d5a8a883a48aadb80f3a1270cf5de9bd4 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64_1.5.src b/conf/source/x86-64_1.5.src new file mode 100644 index 0000000..9b20d7b --- /dev/null +++ b/conf/source/x86-64_1.5.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.5.3/gitea-1.5.3-linux-amd64 +SOURCE_SUM=f84eb0b77b47d88b16b1de6ca443dab4a77e940835748d309956052887b9c507 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64_1.6.src b/conf/source/x86-64_1.6.src new file mode 100644 index 0000000..8ea4b91 --- /dev/null +++ b/conf/source/x86-64_1.6.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.6.4/gitea-1.6.4-linux-amd64 +SOURCE_SUM=e9508e04688e9840708c341125b47b43a2c12cad52185be4b7b6cf7a2fb8bb71 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64_1.7.src b/conf/source/x86-64_1.7.src new file mode 100644 index 0000000..ce97cc3 --- /dev/null +++ b/conf/source/x86-64_1.7.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.7.3/gitea-1.7.3-linux-amd64 +SOURCE_SUM=49b733a3272dc49cb869c1ba9624a9880168f27b8112197d0c7fa32411dbf625 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64_1.8.src b/conf/source/x86-64_1.8.src new file mode 100644 index 0000000..d5d2530 --- /dev/null +++ b/conf/source/x86-64_1.8.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.8.3/gitea-1.8.3-linux-amd64 +SOURCE_SUM=7bb28b21cce4bdf0a24e6f6b21c064afa56d84904052dd55afdf59c419d49988 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/source/x86-64_1.9.src b/conf/source/x86-64_1.9.src new file mode 100644 index 0000000..18bfb1e --- /dev/null +++ b/conf/source/x86-64_1.9.src @@ -0,0 +1,5 @@ +SOURCE_URL=https://github.com/go-gitea/gitea/releases/download/v1.9.6/gitea-1.9.6-linux-amd64 +SOURCE_SUM=8080c6469fb1dd7e24995bedf927185f6abb57215c043dc8d7fb0cba113c3735 +SOURCE_SUM_PRG=sha256sum +SOURCE_FILENAME=gitea +SOURCE_EXTRACT=false diff --git a/conf/systemd.service b/conf/systemd.service new file mode 100644 index 0000000..3dcae38 --- /dev/null +++ b/conf/systemd.service @@ -0,0 +1,54 @@ +[Unit] +Description=Gitea +After=syslog.target +After=network.target +After=mysql.service +After=slapd.service + +[Service] +# Modify these two values and uncomment them if you have +# repos with lots of files and get an HTTP error 500 because +# of that +### +#LimitMEMLOCK=infinity +#LimitNOFILE=65535 +Type=simple +User=__APP__ +Group=__APP__ +WorkingDirectory=/home/yunohost.app/__APP__ +ExecStart=/opt/__APP__/gitea web +Restart=always +Environment=USER=__APP__ HOME=/home/yunohost.app/__APP__ + +# Sandboxing options to harden security +# Depending on specificities of your service/app, you may need to tweak these +# .. but this should be a good baseline +# Details for these options: https://www.freedesktop.org/software/systemd/man/systemd.exec.html +NoNewPrivileges=yes +PrivateTmp=yes +PrivateDevices=yes +RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 +RestrictNamespaces=yes +RestrictRealtime=yes +DevicePolicy=closed +ProtectSystem=full +ProtectControlGroups=yes +ProtectKernelModules=yes +ProtectKernelTunables=yes +LockPersonality=yes +SystemCallFilter=~@clock @debug @module @mount @obsolete @reboot @setuid @swap + +# Denying access to capabilities that should not be relevant for webapps +# Doc: https://man7.org/linux/man-pages/man7/capabilities.7.html +CapabilityBoundingSet=~CAP_RAWIO CAP_MKNOD +CapabilityBoundingSet=~CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE +CapabilityBoundingSet=~CAP_SYS_BOOT CAP_SYS_TIME CAP_SYS_MODULE CAP_SYS_PACCT +CapabilityBoundingSet=~CAP_LEASE CAP_LINUX_IMMUTABLE CAP_IPC_LOCK +CapabilityBoundingSet=~CAP_BLOCK_SUSPEND CAP_WAKE_ALARM +CapabilityBoundingSet=~CAP_SYS_TTY_CONFIG +CapabilityBoundingSet=~CAP_MAC_ADMIN CAP_MAC_OVERRIDE +CapabilityBoundingSet=~CAP_NET_ADMIN CAP_NET_BROADCAST CAP_NET_RAW +CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SYSLOG + +[Install] +WantedBy=multi-user.target diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md new file mode 100644 index 0000000..c85e154 --- /dev/null +++ b/doc/DESCRIPTION.md @@ -0,0 +1 @@ +Gitea is a fork of Gogs a self-hosted Git service written in Go. Alternative to GitHub. diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md new file mode 100644 index 0000000..018329f --- /dev/null +++ b/doc/DISCLAIMER.md @@ -0,0 +1,77 @@ +## Additional informations + +### Notes on SSH usage + +If you want to use Gitea with SSH and be able to pull/push with your SSH key, your SSH daemon must be properly configured to use private/public keys. Here is a sample configuration `/etc/ssh/sshd_config` that works with Gitea: + +```bash +PubkeyAuthentication yes +AuthorizedKeysFile /home/yunohost.app/%u/.ssh/authorized_keys +ChallengeResponseAuthentication no +PasswordAuthentication no +UsePAM no +``` + +You must also add your public key to your Gitea profile. + +When using SSH on any port other than 22, you need to add these lines to your SSH configuration `~/.ssh/config`: + +```bash +Host domain.tld + port 2222 # change this with the port you use +``` + +### Upgrade + +By default, a backup is performed before upgrading. To avoid this, you have the following options: +- Pass the `NO_BACKUP_UPGRADE` env variable with `1` at each upgrade. For example `NO_BACKUP_UPGRADE=1 yunohost app upgrade gitea`. +- Set `disable_backup_before_upgrade` to `1`. You can set it with this command: + +`yunohost app setting gitea disable_backup_before_upgrade -v 1` + +After that, the settings will be applied for **all** the next updates. + +From command line: + +`yunohost app upgrade gitea` + +### Backup + +This application now uses the core-only feature of the backup. To keep the integrity of the data and to have a better guarantee of the restoration it is recommended to proceed as follows: + +- Stop Gitea service with this command: + +`systemctl stop gitea.service` + +- Launch Gitea backup with this command: + +`yunohost backup create --app gitea` + +- Backup your data with your specific strategy (could be with rsync, borg backup or just cp). The data is generally stored in `/home/yunohost.app/gitea`. +- Restart Gitea service with theses command: + +`systemctl start gitea.service` + +### Remove + +Due of the backup core only feature the data directory in `/home/yunohost.app/gitea` **is not removed**. It must be manually deleted to purge user data from the app. + +### LFS setup +To use a repository with an `LFS` setup, you need to activate it on `/opt/gitea/custom/conf/app.ini` + +```ini +[server] +LFS_START_SERVER = true +LFS_HTTP_AUTH_EXPIRY = 20m +``` +By default, NGINX is configured with a maximum value for uploading files at 200 MB. It's possible to change this value on `/etc/nginx/conf.d/my.domain.tld.d/gitea.conf`. +``` +client_max_body_size 200M; +``` +Don't forget to restart Gitea `sudo systemctl restart gitea.service`. + +> These settings are restored to the default configuration when updating Gitea. Remember to restore your configuration after all updates. + +### Git command access with HTTPS + +If you want to use the Git command (like `git clone`, `git pull`, `git push`), you need to set this app as **public**. diff --git a/doc/screenshots/screenshot.png b/doc/screenshots/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..4e0350b19dd751933f89addcbd0a11116ca1f8d3 GIT binary patch literal 98551 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
  • a=|86dud#4&S6t@g#PANS(BUY&`sE3Qktux5ZHI_2W09@~qR)(8~|DHVm0dy!UF!94Gpp-wK!B{F&@T~1N|i%_E` z=DOfEkFeom>v*{yq<0GPhALxhSu+f`?QxU5o^cv!sh`zxW*jCp@zf5qs^24kuDnrN zz8Ka2?C9rpgC*o1uB7yB&LwL*{c0sd#vmU*``=t8LL5dDz~4zX^rahp7VOZv5GQ(P z#pX<`6WwkW@w)hyHjmgZN`g$e!nln(4p>^U9F-VN-Fqr`YMgK}0%z_lPDY206p}H2 zzLhIHM9je_085xmkXqt1&~Fnvx-vxzBYGo)nNCN&!ER<9;A?bILY7XUesWWT%r3|( zdxjuo_TV4``2bpHcD+f(1`BNjg!;?b(Rz<*WgZB!CNCm#EDV``aq&Hp3nWk}u?pJ6 zW}7BfQhc0R543!Dx+7$(`MGfr56~1?MQg!CbrIp|i*=8Cu0gOy@Y#^^AZ&#*EhYE7 zU`A+|pTVb}&56RX9nlZ*jc{9y2c%)yL4rtnNG6l>6?lDT*sTrj-@|X+;quZqx9v*5 z5^pN8|0rq|9N~4meqI+@#ndp^?@7=tQ9%3U*Z4Uq*p)0@RLo}rZj+5HR z3+YjVjLn@1i>4GGe1L{kg6bG1)Yu-kXq1(!v>dG4tIyJdgioKle_J0d|A4HQJ`_}YmV*L!96p|`e%)1_wjA(2hzBYF% z>V5Z2)fk%jt-3i}_s_3laNAI`vy>6Y<=KGMwq-W`s)p(sa^rw4})P&1N3R2^{9%T zuJBXiekN!h;wWbD1VtD|AF~J&A)@Q$jHb77D1zjJzBjDaz?M3WWAgd3-2Yb9b6#-X z4;|N*dS{2@6ZQ#<$u`yVO?dW?D7km=^b(DLg4K5R)tQ1Bs}JA)>|8U;m-sk_yj$o) zyVUUM`@wD>#cn#Nr8IUQFafSglwN~+FJe*|V3VUgS2E+YuTN__$yHT zOkS`$C5i1wxlllG=^{7|$Q)RTuRrmIwa_N~V%u?>d;??wF)+dX!E8^H=Z1-!G!z+H z5q8q7x4EVvg1KFraNBhuo43pc+Za!c_99i+pY_oo^Ae?x;b=$rFF=(|95B8`*#^|7 zt!!0XM?m?du_|X+ayV!|!iW^%vfIZ+FyeGNO;i5Opef|B8{2=8Vk}70(067x`xlC_ zz0k&YCB{LmER|vu)`V{W@i7%oX;uK)=j2U9wN#b0ZvEyR?4wya-ioxg`>ANYEq2MW zbnmpop0QZnLsNZx-ER&$Yssf!qhvxxU7xSgy{TA>pA7atV~X~-IPc=s)1K;6DP3Jy zon<*=M@wc3RfL1-z}7+z-|SZ(D*K^S0)4=Vn3I($R{5TUb$03WX-2--5H!r#@8L2K z*^Y|!*vzz)hH~#mKsF_gCiI8*&ar;1CjNHA==(HmDqs!z>4)dpF4Sfp(XE~PuV|9- zb+JbeE!B_gR$;HNor50AOz#_J;+|cl;x+HC_l{x0LsQFFYXF8@n?LdYp$ss(fWTOG zGn(9r1bma!84Z%jh_&quBP|Bn0FRVV)-KO^KE3GDaN}XL4$^MiGshS}XOxU{Luw7N z64_@g3o0sU#|Bg(xJ{}X22h_A>yBjoFQ@pD6-{h{zx1mvQ4-oHSeT<6i25@>UwWYM z8g`dZSVa4esBu%7gYvegMNHju)lby%)A$z|k@2g!qY;=+gjY0QNEQb@QLd&caqAvs zzdq3@y9VjGjPSIMP;Y@m0GN!4*$E8iQmwyf6W+kc%UL!^XHQ>xDkP)D$t^kj5gt_V z-lW_T9_$SF4u}J*@J$Qd-^8|K8LUrE#{JaDvOAU{L^rkKlLWhhYKiU_aQ44?T&3_$ zzm&j4c^fil4#MR7s6bPf`zaCRZhFlS^&`u>Xd^vi1BEne5g#o?CVlegELRP}Zi+TLP>O|zk4AiD^kTt)%+2};rLJGVWMqG`qe)tAE zBWJ`lnwjS`YhlO!>`nK{#FB?=)*4S&jJLa$8P|%pJw}9Tc*hDB$x~oI6~IftBvfRV z+mUkW5U{`f`IFLhR|)|7v*j9{tEMqc*E;>SBf<NdyEeJs)(ZJP)d^ZxCfX7||w1T3qwS@Cu~JL**ax0_fx#~lw{mJ9kW?4@b6 zQL(XQ&!Jho9L>D@geeWQg6+ydfiNFhQDfPxdCE26edEd;#v#zYi=wb!QN2FU62mFRg88eZ=f za_e5`hWk0GqUypvLsY!anw`uZjpRNtV=SLj%Csmyp|@~NaYFpw$-LLgUG*J4YwDu? z3Je&+i4)5+$dm1Z=$FtOnSP`wgLl36$WaCz^PyP*-DcKat-#9V3O!9|0GiufP>TD& zMOzb1*T@m@niNbJ%XP%Zw|i;Lht*(n$RZ|9EHU&jdo>C^)O_u(kZ6$VJ%jC{f^p>W z+&p*NFtDP1X;*x77YgtT;|-sC_+OO0bySqy`aeuFk~1PObSWVn0@58SrIHc?A|N2$ z-5>*kgdiOPN~eGz9nvK&9n#(5Z_o2Rdd|_a-nHKUMuGd@v-8^5CoUU(e*~YnxZ^^F zH+*cg=e_K;F#=y%%qp^`7mkMBCvqzD>Pt8xjf*DH97>}iGI}D73!j&3Gj^GJSKb}0 z3zvwvon8NYxEWg6-d1pFfhbLqxN7W4y|fwDowTgW9`XGak(a&CdP95WcT}kU0L7gR zUZkGnP;rl7vWPG0&20^roNEIYQ3fp>?YE7XG+9rgx?4u19nBIKul2F%+g0XCr_guY zcI4G~rukgkqBiaQ-s&apJ};c#11Po5oQ+ECG#qj<1eio=^F!KY%!3|rIZ+vQ;np@Q z>FI1P-F^SnV=(M!^<|&uo#sOC1!sXX{vJ-37BrQW>bZ&#eonlfg9(8H8KSVyC8)OA zv%%e@;%(Ji#iUNOdtt)XA-^q#g`%y-2=`uJu|=m(hYDZ^ zu-1*a^nXowsdWfiR)+q`u4$x1lB+rBc>1}}w!;oeyMErk2kBp#bA;Q;;50YuEy6OdL)Q@vGIql zHe|+z=u##%d!7L%7ubXxT=4=^-wIwmcuKmR85_^eAd}4a-|(#JZC@QaGgvM}gVCAc zUNiLC7nq}ql{TXYM6b3c-^m%N332`8dtLwgj?rpyQMvVUA)~(5=kmO0dl7Xh{z|@Y zQA(E7hre@Rv|_$bRcvoie9W+T-SS$`eKb}gznPJ(SXz&Jk4wjU{asw)&oBv*t>R^( zwb`Pw3iSkx+56`aLbpTf7fUK)6Z~(s%Q9s61}45eExqy1q$7dX9l#FfCR5siuNtcH z1fFZXJfVH=dt+X~E{?eF*AWDWBNk{OTG=+c_arQt0@ox_gq?TiTd#0z&H_SVTGf6 zqXUc9yBuozhu86kza`zZzqs96QCC>JeM-xi$FoDNKK<@GS`w^gilH%`B;woh_Tydo z?!7M)X1TF`acJ}}%%2XZH%s}y-U@5#|D_v3=E^11(8eBx2p}9?(?*JYrEg<0NOQmj zOAaMdpyXpUCGD?9Ui4hW-oAQoyF&c|m#$O1CV8WjY0-c}wESz(hm(JkOVSEq3h#aL zEb_Y^PQSs(Tl>g{!Ri!IrHOcAqDTDN``g(M*1VgqkbGs>-x!gEx)_+ z*Aifb0CD!K7mw-wO}F_!m3G<|4De^%9Sg7j#z=orEemJ?lZy4DTHv3|E#De>K%d$A zR(+4{zb8H|T7@4V>J;S45lj8Y*Zk*AYt(=eRHM0ayX4;!>|ZRk|F19fqC8FM{{1}n zJ0vW&dYs-Ef&BmO@c(-*tuNx8&hwV3&RA9?!6q&>)!+MLIuD}YN_09HldLVw_2 z9TI&l>#kZ=O*SzK_uJ@bV_Xup;^m&iCmI?WN~}#nE2J=$)1jfE0-&T`r%a{)s|Vi6 zrM0=4?RN89jCA8pyu+$1-Ajy$G6X6A(%M=P<0rq*?_XN@wd=m*!oehjx1?XL+vOV6 z7gJRi{qh3%GFQOC%)B$>m=M_c2hB|N7&5FS`Q-THy<5Mz0lym)0;o^nga0*||BpE( z5l#n&&iLa!vfmlb|6hOPTO&=&AlkE5joH^pQI+-ObLE9*oWQOBWHiyMQbB&`aehlD zc^Db&cDP1d7+LFf_)ZhHulz(qY59(XTgZc51POuzfxb3CL6Q35%H1}K$+Pt$g9rWJh#$av@5iz2W_$r- zsoy|hT@6I*kDG3VhNJdv6a#n!-}*r@zyg^lyH+e@8?Ho5O4xh8mSuk0e&!mR zZw4y^TJ60}x>vrMX0|_}!>h1ck197YaY@F&oWoUFuA3;(so<&FdsR8MfKS2Cx79as z-KDMN)yc#|{#faMErd5pfD$+!kf(M5UkE7ra@HAyPw^Z;Yh_5{Q6j%pZEiB4@Bu)> zA}%@E3dk{w?z|YzRSp$Ebk2C4_lTX$qFc*YBY|1)vq=OQugKf0%kxP&3aiENjlo*m zVvg6v*Yw2^$Ft!^p9=$PFTNeE9hcR{TScl3zosWebkf--;IX~EeSv9T3ct;)M16hv5v-84&)Le7)OYnh zXWb$uJ6c==GYn&sKzQTnjQ7vFOCX4AyCjP!@thB3I&+SCyCSv^tMbl3jyuwWsb2s#;IU(;*V;PJewHI4Ap#(P^fqXp z7EmJ@IFg|7rP|EQ;x9EDpr7G4Bdu7S&g?G#i6kZ+;1f~uMh>0S@m&+5KGAsGFg z3Hj(J;X$gPo|WXs7sqMvl2p$j3TgLHY1I0viSnr+mG{N&w9oA+GE?J=lijOY&!h47 z6H5DTZvFVSyA>^ZNTG5v_)jmmUMQ2syd*-f7DclAC7`v4ISJD0Gbz1W46js97IHPF zQac1-pZfymJN$W904Q&UaeiT*Pk&{qP{KKVW#&;b8Cs}VE`D_8co{CKG#(7(sjau9 z5xduS!yD_qJ59P03e2OC3`kJ#4%h88;U3NU6aJ%67fJ2TCbEH^c=(|!FLQ+iswoX z$$jd5P&-z&a2c`SaG0|sY&-bbnCSCneE6ogyp`qm$vb;!RU)=6!k7@`0dq6$Ghz`lVc^uxT&Ta(!<=Z0_}~q z_Z`_S4%{X>z;>}ViR*3fWB8+jn?rUj*mPT4n9bFw#poLR?FLG4NC!Otq48oS)5W}u zGpV^OYF!=ypWCMl|Bu^5?h7}geJKQIoryf9Z2*!r)5po!)4<8^ z+1czNF0%vN51tEeRb^fR!o?RoOpO7Hj3vUQC1D%9l~O_#oXuxQs|O(b-<}Rb?8u@J z3D9)%Do|AuXtpZoOju z-71rxf3PPixsI7Bo%EBG?c05N!A5dAUs|I?x>Cf8S!y@nHR0K=Q0q>mA;M5OW`sNA zS`HA3^9U3fl5VN*YOk}1tZ;2^?(}#~U|4ax5!lLX*V!O0TY|?J0|5K&Amdy*SQl2(RR$`XzxRjaf-0EnO-A+|v<*=(|)odt@ zRnP!qu^)^63n7QoNoXhaAP!sRO1~Fycgbw3cW;5=>qg@}AK)whWkaNf)*7pRV8%W! zmk%~QlcO%q`Z1ua-U^f`H*?W?S-UG&k2`SY{qxvce^{n3{Zq zwqBzo#B17HemL@^kAi=Z1#VYjYm9K%ni>zYCQ)cYSv-Ss#ru^644eQ$-f8WElB6Z~ z%{Q*rE`*`D)+F;#;|_cXJ_4ayW*X8TYqxnGRD{LA z*8*+6MPU9q>>f7pF~r;S>4PtdsnyLGdn#f^sYD@j3V zY-g*pd0&+?j{-WtT9*>FnXt$)nCAlC_(>3ly#YBFtbRr_X^}@qW5%zWMC|ZS7sw-q zB03*Bi=kdJ{Oh)~E|I3}Vg`E$9|xRcQ*LgGvE5)KqJI=L6|1SQ{lgZo9aaXHX2ZFG z=I2M}?;^r2S5!5RBMjJsmtu&x`yACRVO)4V!0uqi-368hgdw|XPqhr65>ShbDMY6S zLqxtr!?<`9c*(i+q04H%AuzuvpJOl7nBK$wBC@A2w{V#2ses1%$>VK&w;2l(+%Cb!Tv<{6N~prfMAEcD}r}yr_n}+ z>uK5^#loE!8s9$aqqlbg1i8jwNjuV(JVnu!0l9a<8m=p$6!C&rxR^tAAT$#^ju_H~ zOf;6!oO{xcT|*Qi8hzJ!e^kd_O5-(3LqwXKjji{NBr~S}U0s!6Oxrf{MH6;sL2K8D zM5fgMD;=G&M~*Wwq7F{|jB~B8W<{{2CZEz!VL`OVxbXOP!h2Y#tajvL2BV~z2#=}y za0MIRo=!+wVmXDtg>b4OdZ98{$=D81Ozz-#$fgeg-JZPgQ!~EZJ*q85p#(qdh%@Qj zo&2-~H14ho^%k7NcG1Lccg{F9ZSQ6(nDUjGyGSt9Rip^!Q0^VnGdR#8D#Jv$5?G2M z#x)Mu51v$QDUU{KW1OhX?ZkH^a|f>}$P*pkaC{)jV@lKbbw9xrd!-F)K3&)4`6)$9 zUC)jQyk8EQ*(gVDEHj?A*ckkH0XcJ3MVsVCd2^Y5WqTP+%5~ln zmZ9lm*09OO-?zlIV$#X(9LwI^p=&^h5S=_1KhIb>@wfO%ry??X+JGMvqM1VMQp!{f z!_e)rXPyeC^EwJXL{kYLcC@OHE|mL6gj1 zPS_hUgjTb}}PuQ2lx6P?%Me0_xL(Y?h+~*Flv*mNvpMt(GP<@mvzMt!$e;26#C&A0w)!e+;o#!D$GTLPM`J1O=KkSKm?0~r?In)lOYybs>a zUae3DyfCAQ@jZ{&qw}l6vJJ$JuiZhUHNQ4}Y{n|Kcke9NgEqvB!2>#7E;{IkYQ;{u zaQ8t<1}cB~t|e1rs{=QjlM6DBbXwyMulzGuniNbq!$_OMParV1?*bxMg< znF6(KO|cD4ck|r=mkuVX`?|pbaRk>ZU6=Rphir=W6Zu>A{WqZ*Y-8Cyds8{h0U`~N zo&(Ur6_3ih1kQzY;#2z@VQo}(`jfwsjN=%uK2~-{)RDKg(~P%MyLaQ(APw#)6zSaY z3sU`lz7}?glFVnK8EUcXEsSRxfpdY z$PwGK5@GhfpK{6O?g&LkeI==Ix+|jgGDu+lmf@8?m)#Cd6phx?g9iF;wOdLek}eOq z#H4lMZY_ZWujd|*doVMZ(9gg<(XsG$4g=McbQYs79=1c!_ZqfkP8%Kt^~;AmBIu+* zJQpJ7!Z;0bc12rNGaY7_Rtx&_MjjsR9lvm=+X;&iON<)ca($C9Gv1A9CMI}ay1Iif z`Fgo5+O)`^pL+-)r^xC1UKY|rNqIsxNRoK)cGB{AJ1^U`Yl*q~k@a4q zXS;n&#O*D^6pCH6!_GP^-nG=qj$o?*ajAs*TQP}866cH7*H?yKDuk^Y%QDrkhWK-@ z>`^kbq_m4lOw!U&E^K3u_9rylN&nv3_4(*m&d7v_`6cYJ6V5kgF&PwleOM(t10ITT zRm>ZF7(k@FQ@?QO@B7Nfgn&(75g~!VB5}_krI6l5@b(s46jrxU;K82=OxgGg*lA-x zq!A17Vz?HZ7@k1cJlTGsS}1vA%3(-px3swTJS6cTp5eHKNX113PmV~s9h%@0r`2(- zkAZqbM%vxK#BZ((DuCyLurF*5X^VfxO{CQfSB7sUH7Bv+Jw`l2& z-1U8P|0wEk+-4$wHZoLdxJkEgRxgZYG4Nnk#x<8y=61a?zUUqXO>d5entx2yj+}Yp#HiBj_8EK=Lgv>G-B=%}GLr98A(%=IFx|zE)L)j?I{` zN9E!XQKnnOwO%22<`=x^#462M%V}Cjt>6sr8t#;{lYB8EU}_@kgCFCVn2d=&xQFx7 zE&ooh!}N4uXrENRa^iN7qEPSFPou_LCfbMJ*Bu9=M-8wUFo^OD7;1O)g9xxNP^E~z zgif#=LWt%i&A8qC+|hz|7OB&zune!Su?>r-XatEq%E8zo3xM{~wQK_6!P+FrVcVTy zcC>)e5!$$M@rLiw<;HvD6F1LcpR?pAC1(eGB}Ex@nC)x%4f3ydR{2*c1e?AvqwvMI zdIN)nSjIQ;W+}N=aa=Io)uNv_vxY3%SeJwsH}Auh7@lzt6KzJr$h%pVV=Xs|)+Ai3 z`f{B+;p_%{oH5A+^btc&Rh-vC6jM|}?6%zHsCV5s$ND*bK<0ENa5lqv_NIL9(s3v=` zENUN78%z$BTE%TJ6O|#wo-1X?E1-eK4G)SZi@{EO zF&Ky#7@~HG>iFT-5IPb=`W_o9*USg-E_hwzNtk{gf8Aw_xJx)x5Z<(yxE@02A9NW* zA&rC1Qj@xn)MvY=;$hiLu#iyGIu@Z%6wVr@8q#AS>&1Hz#WSb|Tfz|*86D;Z>MukO z_NlC3Lr_gP)&%>?qvH_os(`)ya7Z9c`%@oZINE3_;cMdB4%~BvFg`=Yshws9qBTFy zr2DQrPDD)ldV4`3w918aRv1E#%6frLimsWvQ6#nxKP^UEbP%2k%3)(WQV2;4z82gS zX$;uEhvTA~dj2B&`}yvTyzNSDl#e3m4Wd07%gd8jK#UNE?dYr_IQ@RFMfHol`KNNv z??SIE?OCG41YcE^=gJ{C?csOCw(h;wC$$#F zAJjpIACK*OeNCv+Gm=KEMe_SVrPO)G_khdt_cBYbG)GFe7z)N3#5yTkbS!I1>YESK zDShRuteNd04n_}2P8yO;X;%9+%$p^XqJnpla7P)>6ZuYK9Exm`cp?o_$Oa@%SqL2o z#MhEa9~PyTMXpzUGL$)e3iT|63ebss`g&h5xDxx(1mrlC4J%<+K=X`lB!x zwY$jo$P0?bN^J?27;LDQ=mIVcX;x$wLiHCoZGOu1T^qGWD6`7p z(#9n`>79v;RIbwa1?ERS0HEjBtS6YZnlk-CmYDv`7lplTPdYNcj3!IOV{3m)$thi) z8lUwN+)cWbXW9Dk#2!M_`mF(<_vK_a{#(Zsy#QPFKpRe3SxNQx1r9Q_u^2z#t+?Gk z&}ye@upequ-1`SzT4VIhFs5H;^cQ;a;@Vh^_Mr>x+P80Eeni*$UQA}=*Vy^Ye&V~4oZ*J@TiReOobz}k5s-d2P^DBAq8_9GG z22ktw4;HbH|Abm!5Q8`Cs3+e>`~|gAfo^onDO7*>=bLiXF?h07Qq`n!%O~n7zXU!1 zGFaMk&IuqO29j90$FM&<8HR75ncuy8*Tl2OxZ*aE6bA!CW-o3vfIjQai*za;n8^Ki zo65X&40n!)1Zp!Ihv+>o9YDTf)l zfAl)Q%VVTKGj2!-{e`^KtBNA+Qu^G~3jf6TB{1$G@n9TUs=qPh+!W+CWm?Cq`MZC9 ze|QhgCGvA>eMMa9ak}?VHEVh2qk0}26BE;&P*(LndnmUNV^HI>s{j6W*%gqLj3J$I z_m_LhK&o-laa7N$!3Q<4RR~B%**H1-sDaOKz4dsh$w;mm!+jMMP7x+D3Z#)WuM@Fk4yv9EFNFiSVQTj8*^?k_ZDo zC@bKMpx>>WA~FswMoRe#($X3=;R1-* z=av9Cko$rJXMqo7AyT^=G#c*%S;_pBYWdwg^r~WLWJ|(zZpldab5itp${2}t{S25A z1=4D#rC7}gj?WuLPpm3p@hJuS-4!$ob zJ46IALzjHQ!~x-6;5pD28v^xw1v35qmME&{&aWf( z_lT&zMY1HiY~}$L{hfdOS+taG#}}?{xEcjoigs=M_)9N#KV(9-0=OdgBEcM$>a(@H zaCzaCk!8lrC#AELSD+gVf zLvyd2{!xjqLpP16PM#HSbeXlNVOne`(QouW!gB@rggnj zb$$#gQZ<)o51$YQW>}n-cWGenHfyV0^m3GwU;I29t-o;o?6g@MFU!WDaV`I85;K=+ zrFx!*R|==SZbDesl$H#O{wT%Es`QTc5HlG|2W57953<2-Y)ML1zf(P2l8+oslHz~v zb!luEFY?pg+gzR>9~ZS6MloS9*xx%vy1#otxQjXzZ}^#64rPavzR!WY)1dJQTvoyNu^O^CO@zn{u?qHM9YJUjbq8dfAA_fwv!xWG3%8PrI4eu`eo z{b<8HL`vjiz$~3fqH7V`kCvu;(NjrU0UH&g`WB?RHojnv2E^}^J@58-60jKpW4QQi z0sD$)LC_o=x(#I2<-kRK5-8QQZc;^Xv%PE04H3?FK%lJXl4R3IYIM*P?N$TpgiTQ8 z;b7lMJNHGZ=h5zV;gat1kr>$1^%vhbPk-vV(2*(l6+HcmtOjUtchJmxr2(Uhlw7j? z;t|P9sTLkS0T&~dNk2?n4;U;LW5fCTug?(3Jk|PCj#I;h$knJ`spK9Gh~&{*H|v%BIN`*(KdJ zyZ3k57urK`=sz;R?)3fhfguu@AllMEdB*|!D_~I&1uq*O^|kxG@BaRviVET;VxR2$ ze@=c0jE5?K_jKr(M)`ZBet&rE10o>IwAJf>#u8B9VWJKNPm&Q)Y)nkdHq*nkZ|l_K zLM^IA`l29OcugVg_?01nl_k}dwjm@h1q?J+Ym{`pn~F<)}=MR&agkbDF)F0 za3{2OwRC*%>H{nK0BQd&J5Sd>#Ta>!>d+wOw*vV8MV9-gqa4E}!b!`Q3X03i`Od-4 zZ8?~w7-+8ut5T=xXa~#J^6X$$j7B~A%iy1ecfRkG(?)Q0mS53RHwWV&ZQ?gU;BsuQ z2a5%)YEGW*So>zj65=E??+w@YmuSH5als3<&1H6N?zS{*4xvHv-?5$*N|ZP>adu>JRyD9G#>rg z4-$;nb;`L~i~wJ5WB8Fu1*nfQSUF{PAJ9BM0LqZ5{s|HTh1LMH{$P|24hw6ia!x{) z=>P^gBJMxZgDpYHh^q@EaSjZ?7N)r@CW8@)q^RW>SL%${<=Hr(yI2!3J}4&DcWFe5 zr!B@y--iRa|3B4cfG}7Y?KY9GkWgi1R9d zn~N5xinEEVt3a(H!&-0sd6R$AbtQQd?4QM;aLYu#c3D1frZBRHDlEFOYUR2VmZ>(f=T`5BmL2jJE(iW$+r?SCbLgBtW=1%$^*YBXFxMAd2 zyk7fxortroA?ets^Kg#sI`8*LulWHH(G}12;hxk8(hv zamRFC`^KJ^LWCwI0fC^>(P9MnK%vNg@ZG_9_dbxs`TI2@#xW!pPSouH;yr2gNsrcx z4~0Y*Em+bpur-#{f_-Gld?;HR6qeXn%}FI#god$uO9vC+w_JY%QCt50DRSW8GLLS~ z?F!ux$vi_|BhnFoQBL6cFk4IR4LzaPg48A8YK*`9y!rg{>=3tl=Mr$oAjfjAsj1jX zq1IQ(NrklNN8>Isjk=-q-|YmAj^u{$-N$8LBrJWk#1pi5>=NF$C~Q;`e|>&hT{o7l z^?QwD8K@W3R9JuI)?9--*P=7gkD_K`%}J+YoOy0{LA4#Ia7DOV0&j0PR`}@3sLk=E zU8wcs?8e`nLW)7&+xd?6dKIeisRx*R=;QtYrG&8-0Se@&1gpmN>{}h6M9im*jEv$H z68bJfwE+`naEECmK1Hq&Lh*~@#*uNYh-ca-y)+|6ozhp7X04&!kq#m2NcJW&*bYG_ zGbP-aZS-%x^hL*>05nRP{IA0aE5O-khj{J&7o0x_3gWx$BT;sZ#?0w4mHK;!(p!6OVVLYrC9$~**me#~}mT*2aoQQrYt-kh$wks5el z=Vw!nD10fe5a-WVj3;g84kB&_IYcqCoDv=9Jn@Yi7y_n8hY#zWXFLTc;jPxwCiiC} zKO&=e;D?YD*}F5>jE>6q#qa;-&wos&v}(G@C5+p#Ut|5UvNcgl&p<>m1~da`uqD;^ zz&K%$wg^Pj4lc2TH(~2csLs!hnx!6BM>xhj3a2YgLOeK&)FgP(wD&cFinJrI7j`%(^a zMb;`D%%eWA6=%O0X)*PB)P=F;(vJOlYdqGmaV}?ixN8gFoBC*zS+V-lL?Oo)xun~p zO9EMkfG~#}EYWIrYbeybz4Vs&P**~2&i3Dfm>nU}Mx>*lYsFEaWlmQH75`%F*-HNI zX0AnsEp7Cw#$-)rmC)%U(){A6exth9hqWJr#lLCveq(u^0{d&8=Cfk(r1Yav2Ee4= zz6^ix$u4`w+OnT66so+ZMCcgHEvoP7)$Rs+>!A5wU!==GZz*5p>J`IZePMZ9Cvu|Md4Lv(WeFL#!TQXqjC9t3eRoJN^#DhK7|9`yRN5bhyz-b)8SPq!$C4gwIWn%JP z=YO?D2L%n>^GDL9v00g!ixIcVLC&B8nLkidi$Z#eVe%z@Wd0w`jKcMkX}dl#KR@5l ziHnQ-E#t4*flAje1vQ(jEKpZh$3$Nd=xry{aGgTz@9pvA58p2QAFbxQ;d^o6!OF?` z3A6(rQ=$(S^{;-Hc+Nm8l{mhcGx+xpb&&naUb(7n`@jAyvLsl_gnz@L@PL?@7|1l9 zgY@GF$Vc6I8}*Rnzx&#P%$IpR`{9Qjj)&7uZ(?IB;_jz!0C5m~xzdL_*+x15{SxN8k(6q(4bKX5L*GQ)w%2p}^q-Jdp*=WptSSE^neh%V) z%affsC%~bd0L9RpfyrFjCP-0@6d8y=DL0F%138Q%kW!fJ72dY=KJ79<)9=AX{U!t9 zBgAmQ9M?8YCXP{K>j1LqiVEwQX=Gecf3d_Fj#L{9rX0>LHUMP3x>KzzF;P%w8v z(#{g8qnMhqwnVA@xnnARo^ZLyB>olgDmO-o)*q$?LX^u@74K58a}HO2cX~2u6vmD> z|LRR>g&nxo7#0Lj&~AHeyU%pZPJH~4=ZE6y@AUJzlYVRtv2!wmk438ixb)MW0IRs1 zqdbGlPLNtSnSDWt>pZL`4-R8bl7M+6U7)afnY@{uL39Tvi{()^hI2S5*EC|5ZY)A_ z@aE0+_3^TmPgC*Q!=@m6hm=nMr^puh7ndMoSOKDsV7?b!IU~X3yYscK`y0q|OdxMn zr$I^1&3fw=##(p-=sydjBtXycoB9zb%r}9|0f7+r(y}|A`>2z(Xbe#B%#jBW(#5F^ zI6hU3IFL0X)cC$BrYCmPX5wRN;%UXbNW`AMY`b_C)wov+{GaYTFTHmkl79z7t4wQw z+U-X=*B32!HRgH{F*<>ggu%O*C6|Q_@Mp>Fw{MqHi@FVydjct4n^r_&^uTmO)rbX- zMc@O{ClIvl+WiPo;Goy&<4>1U+2C^8E`DW*WI_AU1v|%NV?P@KjYJm&|1-#k~I7>mZYBn(U{o$Udd9PP#3uKV3CE zY(+;2-|qwvkvXfhlU(LQ4R<6bpa|P2dQ0F**;wk||6uB12UNKm2M#30Nb56Dt?Wwj zY04c7jgU5!i|^ZBq`GlP9y50MC~y!}i*5k~+?Vd#b)Wu88v)zFz*bQf!BLq5PGq8z z%C3V>a!5)0HSox2R&uk#T6065jwIZSaX+t)>m^mS6HQe0rD&;qkqJH_rwub?ZYaOF zxc@{64hn1*cj$wnW^MGkZz+gdj)4hI8Soe3)^Z&hYBxFcK_`GLyycEqJ_CjXrY_b` z+Q@7E|=&bsd)Pip_8Az&M)x;j7kN8G&F^i40DjS7d z)jb`#! zSPPz=1ub)*w`Fl=k}-0UP)1vvc~bTibC(4S%#8OIs8^vLb1J7T6;gV-Wyy9uPA@>w zNtV=ZDG{+%rb2Gqdd1*_Q>9w=Pg6Wg8b$9MsTN~new$QqIE`Qk$fN98zJt+guc*6dN>TsvMo5o0aMm6VwS8ejz&wIJA~#iFUudY{#UCkV`pw=wQm?>#6~J3o`y z1XSgGxb>3qneL*&vF^Q7lH?c){f94aUR$34Nxipr&Wkb89mF5QL_%sep7AfGgt0s` z`qZE8@kBqw8QfoUfDdgmEj9xoLs<&gCt0%^U%%BI*#at@j<8)gy1k#fL4a+<)Y`ot zH!L{qa@^Ijb?M^liaKMW*J4J z$I#EX&>Ok+unHK2j03oW=m^#Dl+NWRH&eajPQz zdP$EXi*P3^8?h+jIS(2!n@NYD0;hf8wq$mCdU^!5r;_J=`+zI@)a-+8iPU*`Vh3-Z z2$8NR5u z-NE4OR`)cHZjr6xuIx0&mlGr51q81j{{^AFDZsGq68oaG{NjBS_YXEMm#EQgqNdVE&Dl`wr|xBy(VMQ@)@{cY-rT|hET`6 zkk@G}v!zN1Y_?6FQ#79GgbQ=XJ2lcx+RzoL%H6_9yz@L?0;>)v(^5)Ecbc6b;c z<}o0knG|Td;U`gSR>Gtu33-NwX3NGC^kY(4PE#-qfBROGHQ1|n61Kc9-am2G5*VlG z6MUXuN*HN{wSkWC-3`yd@>LnJX@jF$Gq&B_M_-8Z{H*22Oh^qa6vVMu2e<+Gyb+ll zJ!RX?)NUdd+a$YAmWo~mIwG)g-f^L6iAG88=DUM=(i2-PnQiRB!@n!%fJWYiYN6xy zG=DZcM1XFcorl+sF1U_6d&lo-j~%9MEYYQoWC%>}qb#M^_zA5>8+WOtw~ljjus z*!qwVNxiWt^(kd;vuVZ`h=0Q2kIOv@yk8e=aIbgF%5a(N25^;OlQ=)acuJ5mPn`vC zN}$&2rmOpkUJFgTyA!mt(@YrrXdNl(qJ4nubi&gMa1sz^Me{tOA*eptVn3ThL;9fym(J_^758Rghnk?(_J5b121T286sut)bc7J{2R0&M zP$(wiKxp+7)a(I z&-b)Vey-$uql{yOc&drK&Hm;PrAsq>F$r(v$)2H}G26Zq`i;-bp>R`X+bDF}>MeHI z)*~$CAX)QpG;Qz#ax?_zRD@cU)PvJJcAF6T1tw9ht&GxZ{&;ru>$feK+paH)J(GAQ zsT()G(0NL%_Tk15gVmr>kBpOSP+Nl^T?o4ib1EeNZO456CPIGkIYJPwWAh{;C_cVW zj3Pq9sX1B|XB`JsVG^9PB~nLhFSH(y@rErip8Y5*=FWXFc~b=q@?iseUX@%~Rv8P6 zFW`n@JSu`8ck_n3S;-G0RFmkd9|M`q5=vrS&Lm4GHU0C+i>B77Y#eeHllINdu@mEqKD+;QkqJo`)J=ibmr z1AyLgF>w_FgVheMHrlj}PqIJiuFlr|8xTgpvPpqtVb_hRq`E@8A!uw%AZa(`R9n~3KNPT10;Z+pHH1VGM- z+rS81(v^z%GeY+0TbX?FZktYrP%!ep{1D7l(Q z4fjSki@XtxA(n=evRLRLQey;MQ+5f+f@RK00wkO~!}Q$-&%UEzJWIDiaali8!?-u2 z2?awG(U2w%5Kw;#Za;=FO5dIx4|&!YYMao8Cci_X>y+qO@eZ)Z*YL#hb1vF8NevTQ zDey^A?+=6vOvCxVFk#x14^&a{p0;4dUi0OVeaqV6g!cf$wq!-vk$wknbx)C2*>3)o zYiT@F5s|>9Gmqz%wBLZ4{VQsckKm|buL{VrSP99a#UQ6ZZM$8#1<7<|N!AchITJFc zhsbbVD<5KR7Tis=C2A)y4s%73g%@f^s-l^L6D!9^8?I@~)@tFwV;#wO4Bz)?RIgd(TXFhJF57-IgfvgkGxXOEYq8SGt zlD(!6VMpV(pdYmjmAOldj-%hkC3Rl-rNZY9g<&Gkf@44+La(zeP8GhK- zWfHviT>vS~0?w`59L?}sFK`i$YH@Zoo+gzNzm^cXnDg~T3-d9=K8i7Mg4*O4Woze9Fw-?0ePhH zpb;m!f4qCuCC}VVQv1Qirp^F=OgJeXBjo63sRB_kJc@LJo2_2U846bjZcPYf3tD{E zczp7?a9f0Qp=J9*ZtVF(Bl>wF0S?By9YQa=pa`??5w7cxAoWM;6C7AuwJd>7b;;8Uv?% z$gHwtxow54i}~YVYN+e`w`%o)5|3n2-s7#@O)C!^Hi`}PJw)fhwQce1bc@5QB44=M zDyqPO#)U!pwzUS$I6!M zm6|{UOKv=X6$E*AN=@3}jcVgSHKszw1pM7wB(bRu3QB2fOViSC1tn!;A2pO{so3#^ zCbHw+A{hn#fOjK>J8qLC{wPG?VnyR*k!UgoXkqb1V-lgcFAiQ~-wM?VfR2odOL##V zq4HR~xOZ^*{m^_BZ*CQt42EjZDKH-*R-=_~{>UOKco2DN7D_Lgl72D8MBTSf5r{%W ziCRF7{fK*ji*8qkPB)D>py8byil!&QOG&s%{$Ap4&272}6|o`o1=MZG8K1Eaw?7H_ zTzp^xH!Rh7O5$0G0-aB0!z+L!8`|k|U!5=%=MX-ONNdoQ(1%=Ge0%kPvTSu}*qW|C z2A1~ooC2lE&E*XZwSA)dZZSUN8|~U?n*tR=NDHM{hS~Z$V4pTvio5QZywp)Df1L zdS;ukhe3IsR*foWgggcZ$_QIHO-Cw%3c@`d-tl=OPj>p5hZI8lr`D&)pOFQbwPZuS z9T`6Y^Xd1EJQ{~s3Nt;f!#^QB#Xx{FOB^^KYO3x3mA5dR+tag945VBPy)u=xE*(bB zqP3{#)D;cQ3rI6UpM_LJiy!5j=D9Xyw5FhxmuXp(*=Wg+vqn>k0nJVKg>0|SkuhS-KUDV0 zOlPF&lo2_Tm}=>JMs%z$Guq?wx=N(^FkVc?Z>2hjR$1>WE6%RtH`&oZ31d2+ThX$y zm#$huFa^zTn4v(2ig6jgn}~;?*lM-yz07rd-fd6#p3s;Hs||BRCq@lHw(Ngk+e+EI zFLFN(uN(6sVu=a=YF|p>_D@pKhCk}acDW^aPg|4B8u3IoCbYe-YNV}JF>J*p#p4Ef1WHx&HCZ!?2$N_9 zQ~_}kZYGlog!TuK{^Da8>FN~x*ObVO6l%~O?RV+G}7ITARyh1bT|AL z_jCLFp8Ed2UmT9H$7ZcH*PLswd7a03UPGku{&9L*YkYmssgV`?d=Nq^DIE0Od>G%B zX{yHxl zr$~(h$ASsGj3-X6ek=R0ifeWX2qZoyPx9{9U+UTaeFqqls@K3(>1c-+wft9M*Vo)n z)SMEno9UCP+HgL@d(3}UTMgB4zH;nrXdtq61JYY_C8$G6HGE_+6qK27nogak8# zAIVmQ%q-@=6bik8^5BWrAj+I-OfX0r=pnRQ3Q}i`h&efzYGT)Xu zKU#^~_wfZ!P4)mQab1@~k`BGjix(RS8#OA2Ec+TujT|3QSui#B7JJZ{?!yTx6Q`rq zEdFspmW3!+4OyxOvAVJqW(jN``9%Fh<@V9O0s8_g6w~Vo4YPzA7cDuuDzloZVw%_9 zJq={4ZhWM*RaC_{e-wkSQXo>S!J51yI`JYeDue)0bn!MVNaBbmi|Z!(xk2gBb2@7= zPXo38F805sdzx0N;BTz|eFK0uH7Pvp=JEo>^Y?0M|D`aLlle}ZOx2q2QOu^Nlj)Qx zlzLWu?NAC*Zv1mvz_dX1&7QzI%(HFp^{B~5($M>B(0v$2Ldi^{7|K5fg?&TY{aKi` zvAJP(z|e~bnVU@!N}3*W_^$Leed4J`4f@B}v%tfOpnmp@dK~{U`p&g}vT~_snj=-W z8W1A0Nnm-cozmViStiVh8_cN=uLhsb{lJ>Pd%ioGlX30d&zUsG#-wHaoq)M2@bil* zlJ!5As{IU(wN10pL0@XgPvJRBVY`|Ja6CA;bn77V&wLxZU4MfGrQN81f7EE! zqL{wU(E}6*7Tr4K0H=kE9LG#|K&U7NB6zBw&8@B)uPMEaZb&Nx5Zkb@un*m32L+#` z|Go!p->BQ%B68~)kfvf9n+$96iybnav(2F^k1`hYuYOk)RryjB0274P(LiLf-pqa4 zosGYnwn5A@thFJKT9%*R1@yiGlM6Ui-QC?ChLp?=n2a0Qh2}YVe%m ziP?OTPxSTmKL%!torhidVqY=*xs{rDC?J~`wJdrKpGwf0i{2%r?=h!wd#Bt#Jg_HL zelRX)9O0p{QBxamBdo3wA?KDs+YEx4@yiNa#wQ>^s=sP%A|xfH?cwnTa~c2pzpyU)`c>1nZcKU>Xq}>I_e=VNt?H2pM>3~{ zVjFh1&mXDUw?_(w<0)>eKw8aYtCoLfW7BlzosM<5ToH3w`S@>|irJC(4Q6$(1$c1$ z7MtD6ocP_!&8XXm{I?ws7d=ZDqRL|v6BCijW&oA1q}ro!7Z5ze{Vj^mw6(N|`{aU1 zl65XD!CkZC575flc`{IiCdDu5-$-QEFGBGZ9oO;&{;^ogZ%{zrS%7wa4WD+#@~1Ye zYe&VA?C$l_5^151fMqZRe?6r-iri%tzE9CYchH{SRVaga5}`G}NPpRQ&;(@>+9PX z0D=y0vX6v6%q#sz0EFtG61VQNMJbP*nT}Ur<&O;gI`$u8F$*E=72+Ew07vHrT4pUb zkp5h5Q@&`zo6L`i=CC{AL$2pu7cC@^w4}CbeoCM5#}-BjxR`2vs20;dZfyZ_Z}tI| z39}6L=6b~2CJhLsK#Lrd+H&zxw6^OzPNhjxk*F-iMu8D{NJZ<9zAEci`b~Oyt9-~c z^8;K-@mA;Wl_IM8#)pgG8cB;0X`Oj;>5PZ4>sE#JZ7sb$WqaDKtXAYwKK_*5#e9sg zFSx&{vpeB#&33Y)GK_KXyfcmQ4mk_p7QUV>ZFs%6w^6K7yRvBUJ|W4jd|Ug;Rk*~V zb!J0au+{WB6wK7GUK=2q2h64A_~j=#N$WCJjumyy&%WB_*m%w~PGK)zRS|XR_I$Ut zXWhGpF@5i;Ituh(v8=|91giujN&(pSJD3AHk?YU}K=--0n6sV3l_oQK3P}Nirk0)@ z?CwC1sJ{d_TxzL_Pas-deaOiW=STon+o7=M%`{LAukFz%e?#30q|-dbp$GsS>vn~9 z#$;3Ss?j2*BPg|%GxN4i<^Ve2L)Et;C z%x=w1)XVL+I~UANJt)rY^DtLtlIzTw9FCwIGo~*eG^r4Rr}(EbA6(3NRqBmoyiU)) zs^oR-YUi5mrwJ^1NQjLvsk?kO@`QtQH7WqGj9S*V0xQ<}XC*-BbX#%E!ejsm!hA+0 z=muba9e}M?m$6yx3Z1M5Puc1jP>p?fcxr0`e;lC8EhYNH6R_Ct1Nm9CPtsJ5h~ZFP z20-(`l5(2MFH-__)+{}{cEp?(@W59|@2$0J?;lJ$3nfVwzzQX%$F(v7W)V*8kwj zr0ZJJ4IiOd>#aMU0mwt-ebl&DRy3rkbur34uU9RGqWQb3zS520xJ2z5ifhg|uKuh5 zdnzJgZVSDZo;FDM^ZMpey3oKBxr-qsU zk>k#_FQa8b9t&x6eu%xiQV@!BEN0QKd^o;t$PAq_(ZAbl{PURcl^6AKv2lB7+r{h)MO->g>e|G!_0<3Y zs;)BVu1+f*fm}PeG*^JA3E4{js0g)s@?E$C?voD(Q|E}E;d&@LsG|j+nXWgia(D0I ze0~yLa}0dif!r_yHbg0iV@_)mFp2;2s{qRWSqZ%+Uj=t*=u_a>R8jNqG#-vM8lIEm zmRaBjme|ApM$hB8`(ibmEvSOiu+1l1cU7-U<)GO1W(hy~E^eNBpnM&#%v*z`|8}Xo zZ2gz{4Y@=2dWho%pyBvG3B=qUS4W}^$p}B?(*b0&2DmwMz(8KJfXPNKflMs`p{x_7 z0ChUg+e?prilh`-d?LRMe@T3-1Kc@Cr+i%@RjrrJhcif|);LHo1RAeH_tq8wEYd$A z3F(bV-?|?@4rBx9p+ic7FSnB6yhvOeD6m)Ve;my1-~J|5el|vvLlf|1lp4xPs&>&d z133i&pMEl{ls(C@@uvWGh&D^Oxc0`icHUud)Sl{hd|IH-?k7uHseuTc3xMbV1HF{L z7i79IVpy*}JyKR&U%TdqkHHAGk;pmG{HOpAC$m#Ci`x5$dZ}=~i6vVr*;g9q%x(da z9sLQ226^{`nGm`XeHAHT4uRJg1hSt2x$D_cO%~Cjw@2j8PAz#DMpQi=3VK$mvq8Lf z>^Vni?#!$4zJVwToZ+81AhZ@$KjZzcfaF57`xu8;RLb0lf8OO4$YCc1CZ}m~-e4{B ztG5G!ui$&w8Mx@D#m7=?U+f8wjD@lL3c&@4?82@@ikac>xp4vDi$IH*Q_WUDpWj{% z4KBtTe~EeWHc6$!Kh(SYhm%bbW#3L~R+{Cbt6A8ijhQrLZg3%VxTLbAIDF}GUoUSj zt}JYyp|**lNfMjMI$_tQk3mOWf5$t0%6R4bMC)3^JoJ@OM*v9LI6~}88=PwgDjk9= z+%-C1klRyZ2{G=gC!%0p#{0a;Knrk0MQ(-qUy|FS)MdRGG5#gRtpzB-@alc6F2#Dl z|9pv_ya-~MVh^HUK4bLRArvP;`DOZn-gYWXd`7Lb9E>AWk2p~F82=sYG@Ax1kTMR# zy7oy0&Jb^qIk>HI->(RL zIg7Kb&J=QYf*QFday*kkXJVLN0Vowr*QcDj_7~`sA@;c#NEd)%$R0W_BM|%ARC?X{ zhQgi!eLn`HFM^)-Ny_z+dwjTu03m_s=kh(^ZRb~c7)0k!+>0{ZSQi+!nAoB#)bxAK zb@!Gm-jIs0uL6c)z@6M9=ur)oC2SN9BhsH1E*7Re@8h^EETJLs^b_RTI!?#CI@(WV zjRB_{Pn9X(0K_|DyIM0Gb7@Q6aMXi>Uc@yWBlt-i3rrK$A`nmJvQ%axi;)~ zSU=4xVbXZ(OnUPdq1V7FW0tR39$MzRTJ|@Icf3HokbeP{dQNzTKOjAmyXw;+1R&I~ zI;-OZA`i#W{_f99i7nj=dG5n~-)6zd&29r}4JhaX5Sy9k{LH|wfGt%l2hO(}5rKss zkJ~j1NW2Nsd7i3KmA~BoLhM>IA~~X7N+f%MUWtEm7em>M`A?w%3jtcBi9Yi~(ojLt z%TKf-N=zLJfi7GrhGfl4Z?52Rbh!~D+OB@gSnAWrmowadvoqor!Q9ml`YvlrgP>9< z1M%g?#X}e3Mcx9^wA%vO{sJocp0}+My1S`8XJ+%)Ay$5mkY-`?%w~3*%!Qki`0}zz z^k=$JN(0}DtIs2`_2TK#nyDxG0M6e#eDkorus$iD;|;`up$_6B$-qDqUw@N*rg6u_~!K= z&k96{1C9aaR2o_xqsERQ%27yIiR);#^sVAA&Fx4g875v*^)-D4x@v@!Y(=-vyfN zLi)n_spI0fD?u9|NC?Y3Y%x_ayE3<~M@)D-g+o*@>^wYQyc>_XVY=v7cEiuevn~n& zef8V6z_a!PRA&VVs&&I@5-ZdcU(%A(jjQcrl$$qRp+Rs0SMDQ)Y*wCUmBaZ3Ig<)2 zBh@0AdGr-fO}C6EQqCV)?*nC@o{*8pUU>u`iGLy{g6fCR;vrl=aavR?vCY)MDV{0aD#8R2k!h5NLQ+qE&pf??Rp>8Y0(M9|UB zbJ8_6e_D!nr4Xf9Cd&}R*yCnnSt5kWkyz7MR2Z&MHJidn&^{X&HkH-`a$K`ho8s)J zE}U;*lSN;p@G?+OwLND>k+*~X0KgU@`Mx?fU*tGO$UwH~i?sDpvgODzU)coIbD%LZ z*14p=tT!*v7#2PX2!(ZR^Yg{jf1>$1JM7Z%3@+fF+Wt~O2J8XNCa9kf7RIc1>EWVQ zS&;zoIVQ8beY?Tj6@$p1ABuBH(15h2A!@OGA8&DM5vdG(IK@GAabTZHpHuO0V?!{B zmB~C^M0t?2v;%&)5dG*5z)g!B4Fp+m+$%X~~;7W4^QV z+F`RP)TE0otB{Gh04uIr*FRl6Y)7@vSEU9C`L`bi#YI(|Ygp)CdK6jQdg)S?hQ0AEhT6B*0}2|V%R ze(YxR!o7O7@y*sUCLj?D+3*w5>t_|XDVjgA?8~@uc4RO-kVtG$aYSE>)LD!k36jFI zvR&=uHB;#!y~FtV+1KIKE0otX>OyeWq8PGq4qd$Yoz4Tj&PW6qeoOsr&88F;y7~Bn za51LFZ70%vb&A^Zig)Hd9DGLo=C8WNo{KQB1tfCh%6?Ym@O@=%1I%IPEg38HfJhe!S;kawJ>@XJ%URH1p2XoOymvqO7eDdRUQ{ zt5-Tn;*{H)ZxnI9hD%y|D{yFd>GUya;}>e5Rv%g)9D*)5FM`-Ck)9KW4QU-Gen;~| zj1Uwvh7{WSD#}M%&@N;oe~)-v;Y)A@LM{gTx>j*95zln0R6`Z)h71rV1-CEeLxTsJ z)nq~Ki|$J}gFOip#G^MU{y26UT|)z6qw;={g$u3E&811qI_dJU4}O3#l3WZs80oW0 z(s#20^>^h^AgsHYx&i4@25{GJtUD1OgDZgmKv18pF1&3#vtdw#Om?~pEbZ|MzgZZ8 zP94ku%xV`uP5~c6kJYE(;EA!a9rz>j(c!e4Z%s0t4&l>}V=0SHr_NoH>;qmPkT^lP+1@I1i4?pT@XI*lqqu| zR2-`*AXy9q-348djRgv@T;as-!>UM1MOuj;9m&9h?Rq5fSA&@tbgDz7wV-Jg%44iJ zR?Kbrl3L~8VtL+rt{TyZD+Yh19(j`zM?*F;4Xk{_KAea7b=)P#ylIZHf~ za0c{Xy4y%u_q$7@+CC$MOPL+$=!4DdB?gg`}<9r zQB&J9#p^bbXIRMXj0(3$%oK^%VhDsarz;hrOE04}x0FLLfK9d!OC~&By&9znR@pl} zat`$8ECb?ly+N;DUHw#E;SM7RgC!Q&8@NIChbjhd233JT7@D+by41OWTr*TD%*o9C z(H1h)J=AQpv?TbERH;B?)De?=i9Gmrg=nR%Uj89rMI^l{q*w}nE=8idDATk1DK>|15zY{;oKoYc!UiCoUK&r_OWdWL<+R_$uQH%;iN3^M8@IgBp##1$JU-e z-f)=`ezW~cE4?>amC-ZyB zu3f-~jxdAditwU0g$;o@pb8JRvYSGB9c#d6?nG8ms*Tt<+#^8ujdq`3UwC}*eK9>A zRA8nyd@oc`c5X#YO0cG5Qv)ykA%wF3U$7LyX18b`fdhYu%|e?}L9j1clFKiOX?W)9R9K<^JY z`S4TkE6-SDNGo4zc1lP!5K`RvS1Pmiod9NsOJ%~}iY-JcbhG zPSJzpS?<6+uk!eK6U@nHYj!NFcWkA&(Vyyj^F=eEN@Es&Ayz7^tJ%%# z#I%)~21w5n%}Y;v9am#m!{IhS&B@Z0y73SNBwDi&zKt;7ej;O%L6S1>DY|LH6!V`Z z9dLNFDUxh0X~~`h^v~OpWT6kQftre)GQs&4kD0hwyFQGrIVk;1hgP{Nsfr7aiiktD zataX

    %N%GY7ltB(FLQS!?-3vE|M_GSIIEgnbgIIZj*jY_yKUs@JQYapaHqjN+R> z)#euXnUV3*M0Xu+vS@wQpR7GKv8ksaOuo~A11GvFl++Asj5;!35GQNJb<8gtBwgWk z%De$uZ{Ttq8|rpinHdP262`l5?#-Jp;1T>6XH#adI8jJgW+dqU_(-dEN>xa$d5hLR-g3L*Gc zexw9%P^hh*t#Yjs&IW8*;>|MjtO!s9^)dBxZ;-T(n;D+uD#+4p$_aZE{1B8NraC0j z07XMxFNPd^XzeX6R*%T0sg_Oz28^JdUU+pC;{%Eg2DWDIo$jlY~VVf^!T>6r?G(;>(~tQ;RozdbH%{=I*?;@nTVzQ$4* zr#-D66MQ~=k2qha&aXk;q<+y;hHmLZSx&SDH>4&WX4fYe`++LRGn_LI>_W3CEedHz z&80Y}lIpfVfjw-TY7|F|sN5%4DCe{cqnrksAA`{^wWfb_xL)nT=E`!N@#$J2#Qr)n zLUqb{wHrziyvyEv=H9>5&wK3FBt@c2O;gt0p4G)BO!}hivo}fH=sQy+B0Rh}IA6(V zR3&VWujyytO9$zATu6qYhSeT;X^$0F1rnN+NJ7}J$F?8k9Z z9>R*|U2E9l@~u%;G;=SWw@^HWj84MSNd7~y_5CI8<5ihbqOe%C;exVks;ZeE3mU3^6-s=FXYE%A7&3QyvA-d>GZ-N_uVSj~}mGXSLAvlmg9Idb$ z2N%^{;xQz}=-&L6FsC`eesCbM%Z?f0?{R=TvcN0_xg$g}IyY8N- zEDlV;iWOUYd`Pi7FLWwxQ{elynH>9*&T`bKs@8{hMePSS-Q7S!%mzS{RQIK@}g1aEd)BQ`+DvyBsawdU5;Yb$=@eBv%osFCD*@YXL4 zG0yacMy%zyK3U&wR+p~JA-_Pyv)1b|Y;+QvuKOQSl&_k!p;>^_FIAn7N)y4OrG@hv zfxy2U^b14M*)0KysV~4ioF=&u#JHkJf!5-d6`OQsV?=abCwt#;v@?O^zp)6j!d)-7 z7P|)9@l~Rt6fZa|%n(NcxKW&Eqw-YmsuQV24YX3sLvDBcA!e;>Lc;c>Unq^+OIRi* z+15^Xj_dWOn$PNP{s0+&i{4PK6^Y}s?O7Z#EPXrr<;JEZMLV10iqu z%Ym-|RHtr;hD95<6JLDhze>lVgKrG=PI7wU{fnGMYKOSrmjt%)OJuVnAM+OlaQrdt zDPtoX$#jtTAL%BkeWB>54}1C(*+{UP&uTdBYUIPKMkhfzY{MkJ+hc>iFfX9hJdWuY zbxc%wP7$B}h9^jZV2~Lc%u$h_*}JGf=+d~EgL_<4sWTawW}<2?gsuhW$}zEA&GfW~ zNswhfSF+-Ucv?dGTl%8w*vj@j_|g;n)%fbTOi)?ksBW?OT%90X(+zv+1C34yFR1dc z^YJ*MJS~m`rdL;sjvxq{ulZEiD0UzBi5gz~DJ!j@9HBj*B-M8ud%sabCQ|K^(;8Or z6;k@SIDaKUKkzx@_ji-rMUHLeKs&0Uqx@Vn-wy~-XB9H`7G8QQNN{xqTd=yAdEv*N zmKtRBANCv2#2(&QcL-0z378CF6s1CR40(HE2X+|qusgPflRV}35alyY{&Y!a#rt}3e)YhV*KLeb8=1QvT>N1PZ-Q5;{_-|h?3W})t9Dp4F zSj3>NxX!zG#^{91<+(rfn0eSn-WA5DYW%&~{u|x;Yv-NH4yUE11t{m{r(46EEf##Z zLo&3yCOsH{qqxeiLtM);%|2M|*MIBvvIym)toHC*eu$?mCfI?-OU(HF%EFn}*#F#) z{mbR}y1jrw4nTj>R9SOAmohvm{n_~c>$zwXz{Q}N7YEjuaV33V`j>nAXE1h9OwSm4 zcM`NVmRdsVXuC?fmKrwgpZ%Qgt>47;{6i1@>v0`}MF&AuitkjLiY6alkYkeJJD~YG zK7tQcx^z4B*Mv$>Jg*P;bb})-u1fypd;gqCyBNL%VwQ5@gxd94ehJ^cRSkr_-6~}m zv{y`3)i$rE^jAUW(FQrAYlbX1JG?$2u9 z3OBRN8Q{~r14795-*RqV9SppkC4L#$;YWHzWE!IeVIN|tc2(yBXC{bQ24h#FeH34xoZH*e z9dxQh7h*iFx?=vlR5tr=ZawuqqW1D3oqm<2O0}7u-2}QX;4aev;^8{2?9bgqWB&a< zi{gnsod7c6V*Fl*XHuf0scuy^^tJpPeZFpXmd&J}>4UA>hFr;q<7a~dA9=Mm($4pd z1}if#1U^DCvMlOdZJJN&)ar;Ext#lR11C$1hfXpOwyVVyvI*JP;1YWP1NzZap(@>A zXISY`2FfdLWw@aX&fW&6-HVK4{QsCDukjI5g>p(5*}jKWI*3d$Y$R%Zf9Fij+V`=j z=$1^QA#n1GQf>OBNM$juP0s%KU}E!mY2>4E#PIKhk+3OBYlybmtlNHNv64}gj_ZAM zZ9>!SWJ>A0R@z(2QU>G!MCR}NbG1CoQ4V~izUH3|96SwNg0aZ059aGv^z`ZB^1o^^ zm^S=de8cD)9LvdoME@)TR+ieP0kqo54NWHkcMHBDh7Hq#G3!O$@3ID3PW{gY-8Ut5 zv^5P6qccp&2N|uW_lVV-jJ(qh%6{Lw=nsTtpkP~NnP}P65BCqFXDQ@kszo5cK{ZiQ zQMBOV53kVF4W)2wmS7WY{>?W3ngJn|E64G`s@7A@=z4=;?lbtaWB*9a9ka6#Ye`k{ zJGzFl7PI;+Z(}XFB(2}od>1izzr;nzEb0zZN^U$N9Lc7q8Xyfh)%u!Nl*6TVyVg;d zzoE9S>GYq=XHk4Ie}w2muFkUm^*8-#wGQGwT{QoNwb?~a)7#sz+OZ4UxXPC{$t6S1 z=n%<3HQt!vOV#L82c5ZyJMN3mI*?27uSxCtgt97Wi@^oU>_)P!+2yE%ls$Lzr4-xA zX2?K8!{Bi$t!WGS#Nfuk@WFzv{>~#!$H2kMT&|lb4>s(>brzG4#~*^orZ~z8`Jl52 zKFNnRD?YlL$Sx)QZ7n+DRq{Pc>?1Bh4^fwEj$Wr4Y3?5*NV61#@yfbKT-Y8IAB&kv z&RmY2-8@RYH7Jf}daj0~8P@l8V@_cI^Qk+D1NVa@)z*&9NTABLCF8qM>HZX#*-JS& z$YShEfEArcbQvDxnQ8mR|EV%QZYHJvI&n?hWlr5o`@L6-8GcR0fVvk^Jo-k-$M4p0 zDXP{hb)nqVRRbfDC#uopH4RrpWDHX!b($d>bfQuOY(-V1`pMSRt;yi}(15yHOD)Ng zOLe-k8{xS9Yhj>P*?6B&=xaJDmE6L_(zoY-I9%Q;`1%I{ONpIF3noqyWAlm)IbV0? zjiq|qapRcY!tDfXY%i0S@v^&XU{-+M53A`7E{MGDyh9R;jyaGHfk~4He(AM6EiR&5 z$SugIYxQglcseM8T3sTQO6g9cH)Om{vX)VbJZh3HEsO>;<+ zowik5^j=15G?V}lcO}K%#e2ddzqko|_S!=4v{bi)Bk^U>?o3kSsl9BA1>^t54~qp5 zpbD-mCJ>GfZiSWiC9KzEQE53;ALaCw+L+Rt2;y04N@kNWw^gj1mGsQ>2sUSrYWOCn z0-L{a@26MA&v-EB)Rz>aiSHuI8ikqKU!KNv!YX_AMAnwt>}2p8Lk;X1b%G6jm)UJL zjT`qj3Y|_^Jt4}`9UtJf8D1oV>J01ss=AkxI)(aRruqrTZdz*#<_^+6RV;8H7`wJy zUZ%Mx{JOlmu_1NlUIe`*!C#sA@Iv8)FH?Eov8Z@`>GzR>K8|!*YEmE=g;VfQ#DBTV zVhGzedCTC=qtuhjB9xprH?7)oq_<6d7Tf8w9E|u3t4w5RiEC55E9ec~ifh&;0BqBMsRA>|)j* z@2Zy4j~c#M3jlGeC2~`x>YD^NfU9vy%Jagiyyu{KM7U-u(|smRNze!ok1IJxZmN43 zFfWq@zbK@cJ1@8f>wM36-q_vhoF#nWPnmA0`bEA1;JoN2;y9oOw4}Di!IbuI=&`4+ z;E^AAvv)eNh06gTst;g&@MSIlDc%ZD)0ABZm{&PHEW}BGRGbCxrRJPrV~Qtq0*I9q zTo-HN!rex7o#Au3oKl*-HYu(2g1F5zr#&v{-3z$Rxlw;XEc?P@fBE>*>&8VzN8<%c ztCGM7P(J(N71^SaCE6tWJ!u*_j$rmO$l2K#J*Zj)m3^7wdV)^b&+H(f+)g&o(JHC- z-HA%p+1Q$oL}{%~Aa>tP0=-b+@8g7B|NM?y?aD>^95+X6Nat-W_S)^7Qt1u;(N~tT zUg2ab&oJ#d^ZOP7w%Oex0N4UFUh79(CfhPKHlsDc_W6tRJF|46XNS%R1X}wizt1vn)C;f-TaX6g@i^mELfPUM_To* z$cq> zd0MB@Z0hFtuTgs-ALrq=O1ozsG&W3ga!u%pevi#Cx?fcCWi)DOMcX_yH-1LDOAurw zdsbO6Qh9ekUTj%LZmo}B8oz{7WmZ;!lWCPYJjozW}*Kz~?cK$=-1BmD{D{tuf%3QS3#}26WTz0I3&;{2+ zmAMuW%SQ@WYi1NtTsFrU9)u@10%^)#W=;jOp0%>uw4iUdL=zc-?Opp?ClJXHirMa5 z`^2IO44SIO7SrlR-=@1%ImF_y7_zer+|ycJujuGfAMq8`4efGH(T-?+P}Q}&H=Z@_ z6*9ZEp8Vxivjqd5Yq(L9S(ha?aFTmH@&^1&T<2VWgP9O%a34bGVZnNKi3IOJjSvD5 zPA!H&Fo-%RB_GX~jK`@sl1R7%OK{t8&Uxt`$ftM(?Xt*n?OF8Pf(ZQH&fBkB^EMQ6 zKf^F3*H~jL(1!LmEq{;iZDd$eg7MHN>ZVq!zC<`rAAYB~YH(-{9?2w9<`dzZL96UB@$Lt$1wa^sI*~)UN0h zdI*uWlHICFDwqZfPsUD)oq+Tq_u&p+H)<94H$O%^1wGcZa59fiK8xTD{I;?edC_G7 zIbWW|pnIkv%*8%LK7<~S>J}pIMb)g9#t;!?7AQ<8oZG-(M@%f528;IR$HEBv_9id(ODDovOVZ%1P@TE}Z z%FVYRbK4v}<(SHu!F0O1J}KldaR(cVG^ zYWz#o3dDg;q!I09C%a({ptsFgYq$=@DYdQ*5 zzFreTn#LSaKvVB^YN2y3jH}Dq`?-X*m>aB+QakYk0(kQuJ091zEu^yvev;UoT*S_D z@ZE~6IEA}TZ>$@-akepe zA}9tVX7T$9x;5(iYU-aYPa6{F_*b7cvGN<+fjU|pjrP7#T3g>YR8=f3@XWe7et>9X zlvfBn&R91t>SftpADeUe3BchdhKoEzJ7_d6)qpd=gdX1Tb5-8b?&E_IN7X~8Qftv% zIVNJ6dLLJ5^;>o>Zj!H^779E4$`MnDHztvP!+BXymS;kmy$XC-;a)lNP6gI+5F$Lf zbwNKERXAONtzu@`#NeK~(IT9a&jFcske-MXE?nX_Kw|0BE_dNBqZor3WlhJn1vkV> zTEnO6#2Ft5BBTaH1Cm{utFS>fOzm<#=eY$epttiYA0Sw(BwN83h&ml_aB`Fkjr#@I z3}%6@fVi}YKl6GKigvl@tVwT3;zj_b(drZc^tWsdftc!Kfc#L;vA%vFbpT=j50$yA zY~mqjga*@|mrH~I5^$ev63vBTTfp+|^s3{q)@ET~e5N4?Vd}jTSBt2*2rGpN+Yiq{ z#eMg>>Jb)<$tlZ}z#-Oe^cBqwHntj=LTvK}Gs4<3@L^G=%XGIrxGlIR|uptC4A@>5iUtYuO%3-7lTpGRGP?WM~*#DN<(&bO$rj0B(6_8zVdPRCh(G8 zLI`i@t_?F%57ny{B_SVftY!Khefyx9kCe0ctYWMtYMrdPUGEdgPXVlypuLae7t=t)Z1?1V5k2&V+c*Nkrvrr@V5O zC8BO#_?@zK|7>@657CTDZxcOU_};VW-6@*|OSOea3h=A%i1MacRjkE8hwR&{>G3x| z)s}T$mLt70=;6!%GAlvNMBirKC?4us0KQev(VajRD3&3JEUzq;>ABF zg|TOtc44)ZC~>0wyqtLc`{*enrdcOmULT9MP;+w|f~2HQne#}LSGh0pQ9j16r6Ts5 zu`RsKg_cDuda`$)kfM>z>2KWxGBr6;ROy%GZIx!Lq=VHb7ams~Z!jEtPWl{U3z?u; zr%d~@kG~Jj=^g^KUS51=l8u@xjK5Xe0|h$qYL=~us>nAG}>HEUNfPBK5*NbJ70jCAhG<0=h)65BJ9k1)2eRwum3 z140d@RoCr-$*TI*R*Gm8g|!=0OM1^zY(e4uEh(L*x&ne z4n$bfPN0|e%u-ohhg<#7bc>!qQO8S87SQ1fImIktmZsm&;NMoQ#!6L?TA2@}?>K;S z&h4nNbe4_`0nj?n9b25zbN`bG+M<8pLt=93`S7@yjntQtGmj_6{ghE*>?LM#kC6Mt znTy$E&xYxkPZD$ys5&jY8s}l&*}hFe=}V$I7eB{ux~7!t>pEozk}bB0_umr|1uoR#u`6_e0A@*Y)R(cUMkMX*z*8n*gy`u4B!(XRA*K*lV$(!R(1!z)LWGaqAXk zr7z~r%#XFm?^`(Wx6UZ%I?I#ggA}A&x1mgXY|>axR87k|$fkjBG>$1lHXi3aUAFX` z>qg1 zw#apJY&lI$6H!73F5bvC6?)G5)ivFlX^oQ4r#hIORa@9Flx249dnpYhpsoiA8dBP= z5BDYR(G*6xS0nq672;XEKY&EC{m+C3l>&!XWsujVA^5y88Jx~h0M}h@vJEg`jIu@~MwAU-@h_t|i zX65CA%&e9vQOYy}3;|dZyk1uxZB6K(lmJ6oLLd%oOes}4jf?f?4 z-jurw9v*J4lxa9Oyc-Kvb{4nS!tjvFxQ?YI5&npu&kjdi$nUzcW?b!5%3~AU^)*CJ z&5rbmR@ZlwO1FJs#A59UA0nfFb|1X-#m9^dl19kHm#)wKt@+saYYXqUTLx2B)JG4j z`P_m?CtXk+q$$E;{=y1$tNHG@X1XhMyB-;07rJMb?L@S?DZq@ zGVG7AX7gZ8!m?YKY)n8n)gxrus7vv3%L;~7tQ&cJ$bMBDGjf_WjQS>XtKE1`Oj2># zVn%_QPC#oAJ>YCT<91f8l;&>wc4$LM9%YC5^i%tGNQpaQC25aqo$5kq)n&LMf7z+v zv{Xfx!Hm?rM9uG&WJT1EI}2ss=?nI@_ua2~OAhd8V8xhE>JL|`gX?(23h#GkWCvAC zA4IiA`};4urES(ty$VO74FX9csF@4$qfZQz%ZP^#`$f|Og|XQj_GX+;mK(<(WZgdS+E%4uKBWu_^{2H8IP}*+Y`OI*U+?bR1+Ujts zlQR~3n- z=Ao4dqy__n3#3D*k_5DRy2)B`VPX8YHBFo)a$Bqyt8zdM2WV>o(XOqzAm^VRBIevH z5D{1qq7I$|h*dKnS4Re#6{8W8QafiOVBp-!w?(TJe0DgTI@*zQ!R*kUSFIzwWvWxe zpt|p$nXy0fuGUFD&31q3y3ZkO0c|xg`VO(XX6}sdVkqF}g}PA`r1m&y@#R=sBrBa|CCz95D4wJuL=d4K-ro2V| zs1hWKy*npNHXBexE`DC_wckv^=iBGLbS605BhPePSzV?$=)PA&`l+h6XQbBNi@fL; z3SmdBCbk@SAh3d1U*qDXMldu8K47`tD;loMealenYO23e+!M%oCT$fm^1`9W@fSY%a`jGX!}o#QZRbjt?1Y<# zX)038imZpTf{VM4BXeufLgqj-9=SG;(QHfzka;IIj!2ccXG5xEQ=M@C;D_#~<_P4O zUqrVW;35f5s?J(H++AP%45ke7tlpc-*xE?pcMQ|~qnuz@@Y&2B6B0S2o z@JV&bxVpk3(`y#_uCwNxdkz7UEcpHYj=L+mCr2)ZylMVOzBmP?_gPHFr?GzFLLawI zIM2FBCJ(IbmZC^~!JibV4^5Oe@nD@Q$`9Ve-g@Oj2MhQd?wR--j$a8=?n|GEQG#sf z_9muewVmAu0*^`cZw4;NCb^(K_TzGX7O?Jik9)z9MxG}tco$3*uX2Ok#XezA3N;b+ zjL=t59?XsipLjI`KB~R-1*AGAkBWtT3j9{*ld30c)k$w}O_ z$sVus=5uk8`@3C9Uxci+dj|nJ^~)wct~$lM?1qbLS?($&o#@6E9TvI0T4!$~9XEYV zRJl9RdR6EBgMiYsg`-s(_r3d+nkDmvy@+OHB(}(KPqNFMiJn6Rti+!>ilh|9;}&i+ zGp#M1K^YyIi|*sBPIpnB836)?PSL><>0M%qBX(00B4qr1C4tc6x1<|7$lP{=RQaSY z3DrB8u;->rT+A+Z1*8yTWm2IlS$phlgTH<~83w;T+DJ5Bc~p;nxk~gU^{&za87g@S z3Jig_cnj|XlTf>-ky>iwyMu%>^P}IvAWmHP^Uv(KW1|qXiqsqDNcVbZ%wm485Jt{e zqabX&N|xpmZF6|2ql5`YylhYn`ss1OM0XI)FWk#-bg+8R;w@rhsa$+NGwyb?rd9Ln zhTKow=oFTGFC88TLkj)Pf;#l^(aB-p4%w@!YB_Xs8kCEJ=bp-FD0D~Lm{qd5?wZOlu6-axGQJZy+?~6c_in`djmoK~wfi!7 zD34wgR=ghn?}slZ09|wqmb=%MaxbtH_XX}yO|g6i+!eX*^oq5ucjskZ(~y>@XwmjQ z32Wv8oPi9d`SwM(+kH?Hgt>1= zg}`C@$GsPi|Wc29oiJpFgTSb3G$>by6=^oTn-x}#|Q)IJF4YNhIDu{u5?2nNzR zlQ4-ZRhn6CN1v{j6@$hpBO;SFGPVYDFq_Yd@K)scTLG z*4NqL`Fc5m>8*s97kgCn(RhxXe>S)Z2@Eb-g$Jk0y)Mi@6O#&6rnX>C z^3blYP67*H9IPh>!x7dLmC)4nQ`Id`1_vS$HZHsES*_8^w#CY3`x_~Q%!oVP@`ZML zUbotaO;6}yhR^FoiKgaYEQa2LU5LctWxK>XzuVlQspHO%| z^7rS{Z{Jvq^joZ0M-#8Jw`bY|8QBDEg5&X-F1YoDkNoU-XkL{|M-!7P(ze`uV}fVU z-L}EU$Tx}Nqa}k0H2)f`qrgKZ*wx~cg!)>e!~>f#0Cyi>T}@F`KbCjD?u)!W_KA;& z@#jEhY;ykBb(TY^Tmm?9GF)%)2v?{`*>US)yRvd3FK!nf+J*dO;UL7NlBv*% zl>@6IpnX7qP$QS?WXSZAE>$#;#1E>o$8ch@l_>enZpIdrvG}NYn8fF_b48jlAqql3|58IsZjralgKAQL2s%L3|Huc8VyhBFJ$DX;DADO>IyD#;c5l*RJ92jqO zC{R38BCc={pPr^f3q9CO+$jDblSP-PCwVp%D?h zrhXtiz`M1m)8hS1PKUD4wU zwcxig-MZzP;X#DNw8!ghj=eOiykq6CJ)!S)g^PL>yzQK{<=N zWe|26WBY#5_2)g578M*np&vWET=UPl)ig0LtvHk>Zug^h zK<^St*XvH^-_YOP$$LE^t}t;W%V8byYlE+(rD?dm^&E1cdSG8Gd-yy7~#xm>$ z!JwRxEu-{#+mz(eqcZg?mUroDPMdtO2wrv5Y-k{C-aUjW}sa5)?gp;E<)qdZq z>j-swYpxHAZV_g00B8LCS$on7VduKd;O*={72_4lwQWPTB)CQS6P0ke74 zIj9}4rQdPMb5q={(50RmSxdSi%1vcCa(Zb&W&}sw>^;*Xzw|goLyznCOIw#xW<%z) zPCwz*ZkgG7#YJuZ{4{>^N>5vaxT7Y&n(Qc{<9d8!Xp1<91H#$684{N*E23vIPR90c7}O_#(U#RaTnM-OBSzWylpx zlngY{anYQ5Q^Yio4xaDu+-tFja!Zkd-MNCxaOTs^Q!~xuBca48{Em)mg?5X+kcW*! zYscfZn=qh`#p*6L_(U?bQJ;2gC?U)J8s+pw`38N7()Q;`jv9&2kF6fp_qx&7Q_R(4PlHhouqC+x`b!ylh z#E$Q3KQj_~ej1QKa9+}sxo!JM+woE@4NmySZ?LO+rAU6DGIQfvHU|vU=t4S^nYxk3 z3lMSN^!t7{DfhdZZ{7G1Q3S$iVbDSD1u)U`# ziTFg}o6MZUT^&v|3h^D`Wz2P*yI^d-{3zwXR*WnKSEWa46;(l%X^sbr|KVM0?={>u2Epai^wxUG zhzzH6uLj=YD0W20=F}Ig3pUD#pD<2f?dB$_iz;et_ed@(kI) zqbJ!rthQ?tVc%e%C&V`T zDTeeGg7m2K&ESIgBKk_cndNx@*&pU9(A6%w42@S61W^jSICI|vN}SY`_`@yM_Sq7g zD;@jDetmMg6DqCW$Xbkh{dv6QvH8cWiUr)`?{?p=KdXz8U2C-3bL_CYgsWYejrQ!y z7^ftc#uDe0$$DPkS_Zbz+qr)JqKMLOfAd$Ej3h3of%@-pcz)A3L=VkIpl^N#8|lio zuzr3zF7lo&XZgWHSKE5GT+)^IAmC&!MPrxyI7~_VM|xHl0^2?c_t$byd)kBHVo&I2 z_08V<_a%1N&f?-y7;8K~KLi9<(kv&WD%8rYMYn~jW7hg9^pUVPeQXDNEC>79s{4>O zA7mL>nW*1xv{}UX$ZxmliI_O}Sumh?vRA*U3(D-yJ&e=q?%R`-#Y-cyX$VO!X-A0} zamlAOLe?2w#y@6}j_xaHtxhP+&N6U2nemNC-%?3BW18rxitZRX7$^HPo9Qhf)=+(; zouQCU$`=ij=t62WcJP54O}xU}Iil3YZKKS8^iH>ss8OnyiS@NM+Fv9nlC#_iRM+%0 zc0HC(#^c|B4C_8(?_zJqX`3vM65Z4`7{6WpnY@WzDv@^iK>+l-XuDbxDq>*(RNvVl zIRk0f6{yLzkT9c(mM{*A4+WS2A=G0*p`hN51#VOR>+; zmuBpWB`=|ZDDAV*+^Be6i5IWxc|&UEW#c)1bgD*rLpCI}Nu#>I`+GmfwwZuAV;ByB zf6Y{0hM*s?hz=%rGcGhkWVA8Qvn?T}f<8h+{;zC|aFdAA-$g4P9y8Z$2C$FxqqS=6)ab4SgAIv~9#OR*jYb9NtjIs!A6vJ7 ztr+KB^H0mjRo<&Ln^RLMO9&p|5TqZkdWB`hTdh@4QLSiUyKh}zfw>B96Xt?Sa?3R~ zP+4(2wHS=bygACy?MejA3xa?oim!Gqn;fC-Ktj@1P;qxD@&YWxx-48eUKeJohIry* zy`kuH@2XJ>OuMPBhjzD5BJPw`)#fDeYA908p|3T#E?f3ex;tXeSNU7>1rif{5|9H- z8XuUq#0S4?HkV6k!CwD#C+^6sWYwrS519q8&X%ajyVK`#2|`i+6gKv`Vl|6h;^nd? zJ-06}uNn2b2(Mvwq+UaZg5apC4aA}{Nr@rxGPG)UX?=x4PfsnGAd&8}bKnc6?28sU zBc;anL%dW}id*|EV+PDlIKsVzfK@QgS124d^QNOROo>cx94>BfE4djTJvDU|#_3n- zj6x(X@^2hBbEH0yU*^6+D1SIArw#pb#xjTjAnc_P1j3E*FI0${5)v+DXuseF&-^mN zPq5dFqsko#3dp=0;o&+Xcr^G6!oF~gCOPS&`xH?<2kS(5k$7KJ4nkVWt(Yj^7B>gp zN~Drpg=jNWaJfoS7`u5y(rqO7s7#Y&a5hR*;&~$n?d<3%+D4&_I487yuKy0f@UTG| z>+m{Tt-o_V^6h5faOBI!mO2sKuA>9k{Pxyn$eEo_W`qj@ad>tb)`0)H=c(Ne`)Ez{ z!tn_Sx998?T6@+v{7SS1%{aZrej(rXA2bW7kJ`}{6h_18b6j$>%1X(y`Kq=0RbZu1 zFNxY@A8{zb!wI?8RB}!#`h-NjMF(Bh_4#=W?if0Ti?A!vs+41q#=82j`yUg`$Ej#4 zsH7c`c2MhtEl=>7({74pF3nS)48i{Z#{w1BAr<_&j_nz_ji|2j(uVJ)q}NJB>1^`u znF+zdHl9fX6E8t_pI6Ihe|pgn3?ZZ8V;i zb^7rsJO*;HFv}rMamx$Gg*A@d;iz`w_dul5^DT8&z*E^90^0=F^TNB75E)Vt zng(V7Gq!hK?ABJ_R`I8u^Mo;Vk-Dhp(D7%5Sq>7I22c8FS0bY&oH;u~g63`%@~F{g z7>X5725PR8SlZIzEkhAVB{uO2(Wzreiz@dJXywJ?d}`|Z%m(!=k&BD8;k)rw_tX^S zAt^JtJ}I+b!Fr)zm6|Yycb8G29BQT~h`J9mY*H;omWcN~7KB;lKTP}>R}NQ6Myd~MHH1%QtsYCt_wnvq%rkvY$u2ByyvI9~!hJ^ndx(HIm5_!y_>*;dQru%STbOthwf{IdpcJspyF3G^9W$qWj z;tw6FNBrL5MWW4C3AC`c!X$&yQ1mV`+NP+ma7Xy@%EGKFFQGz0IqWIFV*ZNBs90!;m zqCdiTQg?@BhXj9L7&?`^Vgso8LYJs03F`JJ>xua)9X{#dY|xK4u8+;tN#MbIZ$v6z zDR4qLH3EUjBJ4?A23LeAR0`a)yC7|_x%KFyf1LR}QFO7qz^v@*^>2ILF*`?Fkj9{%RoETt^*JxeorT6wa2PDTpiJeL1#$-Lp_44@ThH5{{uZaR<|9 zl_5`XfK^rGy#(!yd?=Z#&4znY3!+{1N^pwbyHWvckwAEEY+ImX+`(>;Q+Je0=bt zMeS2JWNW#8^Tc|a*K{i*uz&D~1`_nlf5G7My^TQr;d$Z+tz6$dtg4zVKTr#_z)m$x zzctv22jp9ZSCxWl`>b8hu^Z$A_)yznosF)|IrQV14?0(^fR2*#2_5w$oC%D!flr1% zh*1dbkL_dq+Nebpfx31N8t#KPLR3HVP-8OCCcH}Fq2=9J-Rl!#-SI~IS+G3|!S?~w zv_A2S`wU=;=>%pP$FJZ?xCl&WU@m~=-6wCN6!xo@A*{RG1+AJcUoXfmVR-&4Mu_&! z03ZkZ7w=t4gpC&90nSJ}UOht7v6{kUsb{x0Uc;^JmA-m2K3zf-Nlwr5iAhh4N~4e` zH1b_}Dt15MmjWbfpa|CYn@N73qN@#DPskAKf^p50HK!*)0U}e^?R06zQ&t0g*_R-V z1b5?_=&IHdMwf=$^XsYp?{=B_cy^{Ne`n6ySF&fLc|G>_2qYHx6{_TqnXpu6IBy2UcjB=BQlNJXFXn`LWyS9pv6$z0S{>{ zND46u7-Aii9`gDiu%d0(?$)H{?xw4{-T@@r`m7-j1+KR!Dw)e>ysOGg^R$CnvI-U1 z%CXmoB}PlaK5IMJDYRj|u1_(d>NT|wf;f=hoCI=fWrYX%k}25JCeW9IzXzG#;AUbP zqTD5Eoo%%YgpB4P1Y7+W{d+RUAdIW-bH922MgR=Qn zSlFM4wMy_nC-2zFOZww$Fuj~4{v_6G$kCosFx}>AWnN3 zd)(n%$fx=?@YkBV&kM3Oj1{v!`_Rk$4yVl;LFOZlC6MF=$)o}^UrK&24#lj3aK&aY zDD%<6weRix{S5~!SJsqaF->ZH!Xq1ZX=-~5-jzNqJayH`}MZMtLEk= zL6?i~bvD$*4@0B*Y0$QMLrelxM4ZM^cU3e@bKN`3x|3JQ4Nb~+SDN*$uFju zQn7X)zQYBtx=$6AQpJj*k~MP}tJ=^dizU}c0{Qu)Hs*>|LzH=Zo+)%05R3S7kXuVNV@P5(b8w}2Q{6pF)nP^(HzCd z3j;k?;0_N)Qfn-0qNT)4jwKkfP25XTsU8mIQw~?ZZQpPptFTLV6TzpXT3agxPu8q7 zZdn{E3KL-ybJ=qQ&d@@W?YZcAnZfJT;k-w)-`Kpugk{xbD^x1i)OO3 zvdE>S0mQawcWolloF>MH{+K&qkBD;q!5_1qLblX`hw+`Yn3_U+Bh?i=<47@5ql&_~ z(_m@Co^W^fXQw^L3EdWv*HIle2oR1Ps30WwRM9$U9f^c?hH$a@WB)ZLvxh>FFsRmx~N| ztb49-y&d%Ed~pWwl+X=5D=fmk*+^s}7iIw?{!JS%M>GEfkZR@#Z=M!S20v2L^Wf68f{(sEuwOeA<#SP<9xN19+UWkZ zUIEM2FFyRv7kt{tU+MG+twnyZ<2>c?GC|ZmSlHcI$-LH5#!l$|DBt7bl-3bYCK}qz zOhAqls!c;klBxOB2?b^OTk5O9+W^;ZF*f$&TaHk}_B&ru{K7<|=ZwjbBZqQpQD`ux zmR~VnMks1?j+N`{<+v#3tf>0%?#z(32Jm{Mkg7rd{}QZLl|?iUBe`MTm9G4i{%~S|1*Ey z`{#7=7=F!;Z)bV)-y^@Ypfj zTIE@+HJ7uLiBw!VPiamK1x9lC##IXypWZgNxW1CB+qU@fMRJGX5@z|@ z#J|oWe>MtO-j?2-^GT#u;S9q^$5NKISPp12`o9SqQ^<(Kroh8Q-G40VW$p+>C{3}& z3x+6}e#Do!s*8MeUOlw%m|`KV#@qbsWb?15{kx|F4~+ofuuO!6M#hIpCRX$byFz~} ze}y1s#zKzvzX&-DL}X>zBhYkjk6qHkd+GW2H2q%>I1TLt3e&1O`CWI7YLO$Ba08MR zEaKUomf0giGx5fp6RGfOl z#5kJ#OAMdV&Tizm;N0oYVeo&~_|I>PQ1B|mx`=u${D{lnO-&Qx;%X7UMmqgN0|Uc_ z1N`dh%3?f?jh#6w&#ux|`X3A0f&+$wWVV25cV6`m)nxw&w1HEI?v2#{-MGNRDv$Aj zCiwqzEBlSP8?zyJ^)S2TZKkbOr5DpPqA`IHF@7d(?8Y+8QfblV3O;% zS4ta;eK|2nufSn<_FTQ!^LNLUA?#8$Mbu)-!P|qe|LNfWX=a@q_(em=)7g(pDDVBt zeiZR1&rr#ZBdPjjykd2AAe3rt!)o&-Rt0Bkv#i$Q@{U^3$S7si%X1~=@(M~;x{J!+ zOt%9GDt^S5DI^y$%~M;aL%RnO%6P-65W_%)5fu;e=^2YqUWZa;y0N=#pZB$bt#y2C z_8M`@{Tcy6(w~PIdxT43gb{o4&}%eD5npCp!f3uyDD;vw_Vm_K zk-v1(M|tXP*Su&e>7GzVRlDa9%da}&&bg+uynwajnlpmKU>JP+YE#Zxc*Sh@yJ^bd zF*u@gp63@&?s+)w-l7vC3PkMtout_^8w6v6YaK#^&}D}ydZ@tkl^|bgE^(Rs#6BU) zV#Q42%DS{w$9UD1<7c#vMJ{ya^*0x#f{Qfr^VWw~!4jpF8$rr4)%4sk0!faUeCpw< zr@CU*v0R5WDw2tbdiLMwxWk?ot2Ewm{R-as1+}9)Q_wzXA==AmQ~MlD=jD2{%W-d zx7VBKcl0K4$;Bn1se0y0Q<0-81~og*&-Lk^OUU7nGGh72#O>rpaB*QQe?lDn(_=Yz zsfrV0sc}iwv8N=*vI)hB!u82{k>hziac0 zl}(K;JgTUOtcw1Yn3(Kw5SQ0=yT!flv_i!op4Cg(c(_xN>zKuV`XSrZlq z1H8~ViJXFoWr7oWKA8^8#Ak#yiW$@gRsMc$K0dLNSQ6`sXEG7 z8So_0g&*JF?5oG(zITilfH)?2T9 zXO>6#92NLDa#iZ!i{ThiejT?1PTri%>^Tmto*-{h!=Sue<;GY|6}>?#Oj{jbi`@9j z3C5fZ5l{e)8q-do>`t^6x4SxxYfD}1by>R0L5W%(9Nv2IRa2pkhoJXUkxoj@dltJ7 zKjI~RGdz-e7R|MakCTaTi1Km2>^fu?1HY)*gt6x?uZG}GHb}%xsZzpYqvBSHdz#pn zw+LCqz~eJMTcK*Cs66nCVX@Ilh?`sFR8zhun?U(2gm7d0Yj)X`fEVsr^m~Qd$g<=7 z+t|FEF3eoMFn1aQV&r0iDFNPUezj1!owPP>mwSU3LH0_X3H&ez+ zfIoV)elMCYa|sET&qO&!zbOqu6WfK?Tp%m-C8dVC{8*{rqOt!jTTG}#w85yJq%Vn3 zbjU5Km3@`yPY)7%9BHaQ7qX2|`Nm@LRJ{Q$tDN-4=u+fyag8-Xt%8lhAhlX!V}hv9 zB=XvyzJ0KUx%75=ZAgO!l|4fG^1a!7LB7i0H zGZj1g$~fn}hWYQ-Ma&Mz|tC!XXL0#d&vW2aF+jaFLM#!MJk#EI8Tb zshP~k7(z7|HV252LQ*#J#67~!T$Zj9gewClvj8G%~ z550Ax9-xQ5AZzySEk8JOp0dKWVnrg_4D#LU6-LBi#TyvO(^SZ@2>EQbG9SiLgC9}l*L5KBnvya&s3d;c)KZU8)QR6!g6?|i**tVC zM(QNYo#d5D33;(cNwy%Mgc@|5(_>;df&g#SpHXu>#6NVL_Z-U=n1_cNW&rET0>hbW zlP#r*UZ$7J!9O+Uw5KeqFQ=9}QG1-!Pqw-2qOOIjC!^93bm&AcYH7|uC96XJQVelD z-)}m^8!dorB}=O+;H4{5@=oxAr#~Sc{#w({Qkrh?TvtLVQM~ARdK_>kWOxn5n-dA= z1c{yBNVez2nWaewyKfgzFDrpg8?=%cX+`LxN^3EY*!L~ePR3e)Z?UA??lStiB_yr@ zocMdgFETh~iHXYvNvSZ-g{=>wm!k%$eV<;!-Aw3nbAleb(vKlv5;K`1bTUi!N%yfR zPu}v9zzQ!ep%5Y*#F2O+Z6jC9yormXW^m1kfybHpSh z%YcEsVN+96)}3*N3yC|8di`j5(_YGt7a%yTem~Rew-(TCe|)Y^iH+4K&2+C0N2Bk4 z1A2DgYfm6-1CU-eh{0rL@O)Ae=>dqwZ!VG-r0D@>Jf8;=Xu_$v0zW@}FwN%}=LWj2 zZwlZSz#Ztg4oF!u>vn^)?BQOx8%jDjb{4DWfAk7*Vml+Fw=d9eUlB! za#aiz!PT*go@A^5f7{74er*0#?An+Jowc>m1DR$nrx5i4iT7@ zeFr=%xp;mPQINc|m&2mkGpqr{n^q(k4g6^X&+Z*2{dzl@k_CP27-jE0=RA#AcQ1M$ z-LgOWtynbUGSYj51tft--fONPfhpYRK;GH(r|d!&vG9*&%jz&7WCKyuv+4+z_}u&P z@dt!3hD0y+surOH6*X`W0d}FNqhM?rGyV=CIamY(@0nnRZ44#}9(Tttlfr{cpF?4ma|nW znz+r9xhfQPh4&*Po+k?4;h!|LanexP^Mv3cMkJbd`R#vu4ZyN%yJ~Lm@?uze^RQBO z+X_AGdextPp-OEaqK!HPm5Ya+B>)v@uBPc&tjiY5`6~G3@_!a|7`RStAcIx=3sJS> z>9VetT%B1ML@(+JkeK*uFan2jIfcpGh%9pe*UKF*c1>CDj z6iX5$)4$JQFk6_!l1Nqq0=ne2p|%~*XY75Ig$N=v6!c;Y`}ZeHGc?Ty1gZ4;0fq(! zy{Ot}_e`HlSLI)LTp)ij>NJ09>b1WjPtMWhN>k(P`W+XHB_?>-EAR!eyAD<46Ud}!mzLpit4c zm^la0{)l_guqo@zbPRj)xD6#dZNv!|Bq;ebW4AoW*SGV?wwbcYPBNvz?L-Ofmsh>MlxjL&BF%txLdwVBQvXWu> zwHH;sjz^YB1(fFqGfy#A`(m2Th(lY|&qcR$^cTBjEbp@5 zPQdfRVy;A)1!-!6`<)|cCp&42KQ$piNlsBrEaVh$f(aP^tkLpO~}Zw5>KG2^7CW5sRS&xhz)T8?-K79uKQKHuA9e6 ze%Lx-`#>KxeLy5aCUz2nOj)W}qLkGZ&$OW0WNXL@+bxz&%Va+Pd0p0YDI#L7h%k|) z4s^ztv=%g*$t!7nM*XK$MLwNhP~7N=7!{jG+J7T9&FXaL7I`C?y#B1L(ngYyGRdXA?Lsex(#yj&rw! zfk8Gg;^JOnk+^}{l5_g~p^)KI0bwO4{7*WB-RF+id_O#+TY;m1AuLompUAunyRP>e zA;C+-XXPTBfl!MJt{I(XHTUz$z@#R#6Hh4cvIn$%!MC#JJTTR8E6Ou&Bxxk^QCHjt z=j@jmd0%d_-e?}a)j-)^wWCd(urpPy`0K4s^i9u}=80u!9e2z@VH|gTdGg(NK zidEh=Vh{v}Ea(_k7Ww=+FE@P)7073oBZd|+3c?T*_hK5V&h2q0(u28g==gf)iC16R z_xz)IRdHxW%VWt)m!REvp?A0^j<9AIF|{%E*9@mu>jY1AxLynUf0AO-z+RHKcffJY zN-u-!Vo_Izkuz}Rt3>v0BWZtHN5`GD;5v78YOO=?Cc>RyMR`>TYI$zE#D_zhs5Fu* zpg%4rL=atCXyc&hMSPIr%~G+48~6;GboTy3PUWIA&MgDw9_M?7INs{L*?YSholY0% z`c{G(7J0gi{ow~FCJw>VP0bbvGLUtBf?DvUkWzEk+yXM0*&R3mN?Fvs35IX|$bQ@R z=}Y8yslSfRg^VIJA5S1#_HU%roP*1vYB~q67yq+!t*nDDRIbRNR;lcy!w>MgdIh?6 z?T4?dI@EmPZ3Ea&8W+OY3PDfoT^< zLC)Pc2gy1sfb9~;?L;>TOFzZ^x6A(0A152&;Z5O0SwPm!nmg1Uh&utv$9!j zv#_FqhFpiav0$4xfPTv!Z~PZU)XXK*nf#A(;o8)GEx=F2yH*F{@hfr6_Hu$8U$2E3 zXvM8)OWFj!kaR+n><2?B`ndk|k(uWnbz(Qu8{0`#e7ZtFWSX6shZd=hBI}<+I00Dr z6V_e+ye`z!MNSO!Yz+2_DiV2#Gxj0W&vv@Auy+nou&B?X615jYgj;)7DUdk_8|Q-H z6CVtg16=ty-AoYzgEg~ACOcNjqOmK6>{LU3xLDr5Ms(H-{4{S)bswcKkc^?F_AEs` z(CX^VI7X@V)ppMI5wFvQ7v(NB3nH&9AV0^sLF4{DWR9 z4T0cKW)Z4;gs#}efeSn73T?tD8lMK64nDKXCd-m)$Rs3f+P8v-1U)EkRYr$_bz?F+ zxa$M#IsuHpIJd{Rw(`b|oRa@t2=-by!rHs(pSdJZkq#38*cH--Uk?)i+D1|R!#EpqkagT44F0L$A zJsZy<@8&G=11-ktWDN9NLpR|9$+f=zAI>q#&4!TX@Ae0i zzlQVk^Z%6&tW6O#^NZKF+jH38Im2$8?a!X#qxKpQD@cSS+0Om437e%c8iU_&oay06 z#$Aj_jN-##G@8U?28A`JzBiTx-(b1I3}?Lj>9DW2Nx4GHTSQ;(wHHwu?XCU+dPe!F zDN8{`1#NaiOz$^+lRiHi#o{HK-JTyZl*nm6$*5!E2rdj__Z5N;9jIBHnq`|oy}hRv zylpH}K1xdG7EI8veYDaYecAQD>dB)Dd69yJG_WFlC^N6S-hd3p1K)95W}|xe)l z=&GGRpdF#{3r|_ow`I^;HZbw*Yh@bk$ z#qdJ%bhaoK+kTRF6OG~&sH>5vsHnHbmbo|&sTRE7aEL7?u?Tf8;`IhFH>@5lRN!J$ zJo@z_EC!2=J`5r#P;hc`!Wq4|;&)F@d>dyajIw=k#LrI>l+NH-`tEdQ@qF5#t#Uw1 zUYkY>-r<9ICg)d=MOD9SMc|F#f!OyeT>%qG>EB!gz)6 zeV2c@?+182CK!B{CVSkTqj`k#$=@yg-<*gA2EdiDe4*uD`G4sufR6FO+wiLgoc>t; zfz1NK{$}8Q@U@saKQ8@^zy24U1h5)@(9;oPW93L| zH8nNB*~mH&3>izlj|WFuaVvwE+J8pUype88SZgBDp;5)XDtZT#Km@XBOD+6TAOZ zQDDK}sN-BxRo&yNU9m%IwfY-(``=`h_m~hstr_v}qyKYrlK!FANT0MC{<~;@6~~AW z;FW5!uEYMZiYthqq_r!E9u@!C&N?;lKtnD~x(NMaxlV&SzrNxuOM+VU4fA1gvy3QJ zXkk|?mTL?xvy>Y$#THwL(R-HvQ>l19^6Dhw*S?=}&;5RP$si_CfSyD}F01!gp08q; zIyD&zrcqFiI-W}1{C``mQ;4u~1a28U)V4IF(PCGOo=;u1_pV?_`~*Px>s`s`=D|u$ z=FG$^wAaR0D~bTpVLNs$JDXr+e7qizKU2-ydaIbzT?fLp@W4^Z1{>6dpp>X}2Rc|9 zKAo_+2qvh@7&w@bScPxRtM~8C_Bqc>{BlaY!B!#lHxZq6V#RY*47e zBAaC~*-&aPh|e`pREren(O>*$pvC#~0Opk&(59xQhS=p7&lG2$^(pxSgKZ9bBVVG( z#ZR|&uNR)~4=*0?Zj@&%m%G!ZRXt};`$ADyVu;1-3nL6i5|*+BL+2^+*16(!-48Cj@NCAD*kyIag*WRDYsdc=Hsf!^R^w~3B0B+r7g?|hqav} z*JYo=^TvJ?{;_b!Xkwn+$@5;^uFGG1ts@pV*XxaZ3t;JLad)zWX>kL1m*S4EZ3H9V z_yN>pLLhg^CK<%#dkkU;T1Ne23WxQ`Yy}XTde(AYUpU<53!x6UyDd=YU+oMj)fiEi z$Qd3#!E`)sTl`^-=8H#Iu)L=se|dVaxn`A((o(SbQ9gH8g<8y$&;%(&CkrZBMI#5f zm(zMY9fP^qB34L>z3}E5zE!v0BDXCKoIUGg-(ptj)Lh42{=O$&MkPc|hy(r1Uq`l3 z%o`r#p?*BV{W}$|pPB-;8+OTh?w4yVr8`O>v5L8NZ5Msqgykz$_|baOL?#J!9b?f- z=7DUZ{9o)rfl3;(E%y-^9+=n08r|azz z>25sNJa4$jMVh$fc_S+8%%RX9{WaE%qVA#Wsu!G^aqa$%J}q{^^H{bWm$#e%sA>ak z`-5IiZ?%sPn0n)nu@^mI-%iV@VRZVNRR^ZEI%$$lByihqKPV;Ol(eEB$yusD5YbiY z1SF5$0jt>Ja6Dxh&@~+aa8zxsSh0s|)Js+_kw()jo!zM(IKQm~z~WkcGa9Y*^8*)` zlB(y2ETU{kdk!Y6whkly+ z$UG@j6R=vRR7Q4(%zTE9Z>cnSPkFpGpXVs~W0yj|TAAh;Q#XJT5D6kM;=EaeXl8rN zDVCE8|6&AFY0}5hSYA%=BPt~ld1%yUcrHO&;m}k7HmzCMzw&FPKrj)TUPOk;PlvmeaJP+6L!OMl6gWxrdrdx02s8ca|t;$Z>Lz zNNz;0L*+Dehp)Bq}eNBiTBX%!vS&fImv2YK+aIUHAOyp7qQHF7q+*Ady@PZrf3l- z`8tH$lxj*AkDW4Gdkt#_pMe>rRf)syCP+sLk$GmuP4v{3WoJ40AkpNdfB@t+;MJv? zA7XNPalvQIE)=AeCze+o6WbTh;tsoP2QGCH1on;S1N7tT@?4cS#sKVxjQAU@R14)| z+&syp8X(xAIK$g1bAIZLd`tD|`*^|-%RC2GN94ARL+m}hDnVM-anAZ+HR`t~bMI`Y zf~W5VrZPb*EQi_V#KNJ)C5rPY(_Av2gCsV&!lb8|=tZ|*V*6_i+YDNEChf(` zwC0q=4EH?IIqjN&Pzw14;Vcaky2vupfS{tsHJ!!K5ei>ekdy zLF&!snI3n^ZI64Y2{AEx)M~Yry}e1ta!N`GoPd)mv&CZN4<+vecjU2#Pkyudw%M+j`vGRvhj@rqIEyq(1>{&N<^@wk!ot-x}>=<2__ z9KgkGoJ?c0<8v#JO2??DZ8>3BLAu`8)XJhp_a1uy)5QkRJiIDkkkvT-b{Rl}8x6>T zF#!B=VTr!UNfrQB!6J0~#s&u9Ovv&-ft<#`(0l-D0iYM0!6QH%(HPLg-sJN>vE7W` z8%srv)A)n|#%VH%_s7>cy211HsY|(DGL_jIYX*g86oop)AL=kP<$w*1nEA0l1A){k9u3^r@$f&S;#|&ZyyC{qPAD zmZS3e+kGD+CgF6Gn`?32pi^Vn)4Z%<6dpBGF|o>rKG2`Ndi1i2uODG&H}>1Z%W+hE)Nlu6}A;daWa@e=q=S(9m#Qv<|rsj&S`fv zmM6~sHo9UHRDBUNz2rNU5< zv0fpB`)kH!us>M;!%iCp=H68vqJUdQc_ebvN5@kD!;C2iSV6?F9`r;y#~=QtbaX^X z@CxU#>;{As_2_NebYDFOi=QA;3&s3Md=w)Y)%Xy91M|L}I~wCz^<%otP)s4$>#vBh z6FH3+6ve*RGii=Xw5fRugA;)dVjunwdsI+G_a@TYyk%9 zhXS6`=ZhZL9v4JXsagPoB*UT|Dx|%LFUa)#4rvFtrjEBd@>Hxy>w^FH!E^vqI2IH)%O5^1jOZjAfWH*Vsa5^@dZSE<6cW(0G zQI=r-K}g+|%ooZng|QtJ$lw)`*&P*><1|Fbim6Or9xize1=sw4Av8ku#lwIZ#>amN zG6USi#b!0HcvWCoH$d7kP?7f?k7kDe%pDDB?e26XP@k-^u$H_o&w_e=k4BZe&oGN5jQq}xoP=nWdQ?F6OOicxEJNqfdl_kc4MrcRmYTU<;}1ct zB$)sSVC<27@OCJ;G?xmA$eLw1^0ce^4_^ zK?6xsp~?b2ZI{h|^9hTzJM{aaEX+4VqCD)$_VS=vif6Tjt1f~}$?2F6pf6(JuB#_h z@BlC@mM4=u<6foG_)=-lEs^W|(j?c*1rR+_F?s<{ zAx}_`B%Kqm1P%{Zd^bmhv{Yyg@zBuTnGIA6Gzo?uUKa@osgn>g31j71XR-*iqSz6J zj|DbueCoS$@z2PZVcbmPaPux{iY*b%LA_=H6dzz3M9s zEkrc53rBV4q&)a8chtIoMC@qu+9`rE1}DVe-}3qpO`}5v#>XUsuBrp7I-NJz5>R^m z55E`&NK18P4hm?7N(1kx-T(pTGieY`m|P^lWR3Ix$n;60NniBuLD zQNOMt*4U?e`wUkJ~ZUIQ0D%z217Q3Iiq2ZUdhIIHmP zY;7fhRvU-44=_nZFBSV^82_vC?NHjQ8c_0`Z+1L2J3KtZm%f20QJB>%m4Tl%n=dsD zatX&^g3bhz-fb(t3ua-{>F~%{RoVMj@c5a}7U}}Bnhh{Cjd(xs<2J)Z0p#FQ9>X}V zoUoYjE`b=FECNaQXOTEG2^xyg$Y6#rQJc8NgKVd5Iis8OIcSNH=x4S-eYm{?*1Zwg zEw@_k_RkUgVW#@K6pA09e#Rl##3>XA>Cxr&8d!B*z5KfJ`|#vD>_0@*dv~6qqAL~* zi+&i=^UbG;K)}i2Qh*%mf;)l-9a3Q~jGH-K%TA_&SB0z#DM>+)9gkSnOo>IbJyDQ% z$WKFX!Gg1>e29P%4sulKJZ>wIxMm!P+Y3h9@qdj2h2P?y7K4X(w+a-WOC=)^HlvM? zVUA10lZS&tY9-48kD*J=YbVQ6F)AwC$-*UX9uV0HEVRq)t=IS1V<)MnyjEITk&`+U z_dc@@q9~XyA3RBJB^!-q7`%MAl3^o^$tLLbz@(VT1X4GrB9)Kc#!*BqC{TULm=dAe zWQOrhTb^&Ex&)B>U>m%TBg_y9^KBet_eJI$8c|?Gq9~E}$+B1{PQM0@Mi@na0!OKg&Pxiu0#n9n#9&J>3@O>LvkI|@*{sH86T@xEY5WQ zB0sN#a_hjKc@yrZ2omjYJR*&?u81P4@>z7wF7Y@i?pKv$g3n3`A;}EAh1YsX)2p}{ zi+2D_rKt$lPgFbyefil1S~>V zL}-)(Y0g^(ybSn(pVxone*%g_eg!&^iJ2cV8V)1z2mAMQhT`=Fxm;jy!M}<8$U0ze z4L%KG&&$tGQ29S}y=7Ef?Y4Cb1cC&DySoQ>FWlYTgIgfD1%kV~ySuwfa3{D0m*9FA zd!Mt#S;r=GM)aW=;*_<=+%zi$@!*Bk&Eld)R5OKQLqJ8BqD|yM1ia@hQW8Cm zRX(!&5y^K+P>RWv&+5%=Yfj%pE?j_!qJm5Uiej)>Dq1lz5442~qnJ)c5;{T;`T43} zB-4QB@806e;Jn9AtJ_@4pu<-qEyA>moi2&elzb1>{@f(A6_x@e&|qf*#8TmOs%VkD z(QiT+Rw*JHiUZS-KY|Juf&IVlKBasExiX%=p!vvFQfGtBhk(uC|{LZV3Fz8dD<>EU|y3Qwej>Q`2-5p!X~#5M}c&6Q1e^! zaXF~|MCcVvy&L(LidL9n3Ca0c1(vQsVK0YK`J8s+S0iZ~2mC0BcW1Kk-@ec+2eB8N z+W<88iH@rWWTBRcXlIzJypSVOEtl9)Gu~GhP+PI)R$MF7$bL#=6q?T9<^h25yzxk* zFDZ>192XDqcfKb)Wjr#GR%*-0NoOTfoM@u;6LR&&9)B*#dh&DGtnImBRqUMHgw%_> z=_m}QTL3edXh}|uBN-WD5a?`)UU?6AMm+y7E`>zw+dvf)0eli( zRe!=9rOJtapT4`iJ{&+FPra`yf9#-zJKvEe`kfwzA?Fc_>a%E5fhy9aLI8xv9 zQj`Z^M&VdO8YLjd+1c3-mjg{0C^Ec6p1w>O>r3_0$XXQWz|9YM{0HSr$nx|&@-{?Z zEw+Kv#3mSTPbMSzpa|CAt@m7thG{aFQ{m0wEG1P1yk$Ed&nohW4WQ@~cL|%tY!m0+ zZ!>3ex(Zt}@lp8jTI_kKP;@p60Mndmt0MaP5Kl!A!oyur+>cZysol-tGlcTa@v95e zXXbWpBN0YwvAz3MSjR`TL5@9-JAEj2KTm_g5JHj=8$IyL?xDETsGy=GY+}~*KRzxN zkg=s|HFcsUmk8m=QKRg1(Tk4@G8ElNI50;@G3B^=`1rwaG_&U-_6h=s%GFuGkP30X z0FoHw{Ns8%FO@;behk;xzho~y5E2wB`&)4nhW}eq@U(uUg%yyX{T+GNq1!6{Z@U3KK#);GDNAL=u=QIme1|6XWLO=jNexzyu(CPqy3y{*%b`( zMz^!*6^;`0VT69nzgq+(e-=AfX^{47TB|-ED=|dl2Q!;>EBfDyn1Y%$6nd|*oV4uw zRFVT`KBerjam_JFbvFCNuE0qS#y_0h4MKOhNnjlQAwaN6(6P#VwoIjCq=7=!gHRMT z8#z^3w7LQhM9QO5lP|~fv>6Grpgj#&A}k5hx9ageKsUMJ{6hzDzFm}!ua~Y zVHwT@OUOX}?K^$>=`4k6;YP!ULP+6W5nNTi99QtOOhgI|`4rN+D5%dWe^qV>S&nE` z3B%BHI(JsYerX=Z)$pEY?}sAs5hw3~Cd$ZFVzAx9r+#+!Z*{2cE8$-5JX{priyy4` zOq^q2sBp4*Kiet1iT?3t40#imV6FZRKIo_)TnNj(AQ+m^~{_f+e`aY5>eSx%=h{~xTg9q zsV~^amT*@w&nSRx>;g-#v6=jF&AK$=V~I+EIyg`@3b_QT4mrv!%yt0JZb6bB4yT-F zis$)4MH=7VaTb>WboBsthp>P=q7!5{>OGBT1p+?`yCW9 zT%&M(Iyd5`X-jBR1p)8cr6OV55n;WbiRjT`Us|a|#0jXJ!B9H{Zbx9u+#;+fmpe~q zb{ElEw1rQF1`LemWWAkY{0AVh^aUyWsc8B3o(kP88DYtK%_=7-uc)N_f$9D%Neogoe20nuRMW4qd6h;)k-N92WB(cLdA3)JeGVRizYA;$4VKj#E;x0Rq_ z_vl)0FGC9W$c{u1tckaw6bZ`>_#mTt;fzvN_*_ASddSLb_ffgLh>4a`*Ji^H>q>|N z;-IXr#@Y`qSKq{BZOBlSB)9`^pc5obu82waSwz6>1PX+U(|i@E7U<-1tU>ABv{Fb; z)&85g^|cy;AnF%IQ=^qnhJ$wT0T8fYfg=G2OIZlc&is1(o>{ab1 z1UMxlp<>>h63@3!kYm^wkdEkVxcb{`BG;1blzggE{EHCC*)5SJS>~*ZI0wv`*Ab6- zm)(|NqHP87PIOiZt}TPST>o~TPPk!+8vjM@OnOPBDDNS8!N1HGNGBnEOT6ceHi%by zHUP3Plbcc@Zp?{!A{6|W{ivrg;smgE->G#eRt4UkorwC{N1){1NiNaEr5Tn4olOr3 zdfXlmJK&iEKir!yNTx$Y4Hi_zjr&TQZVxaU-(IqBfqJsY%fU%dXeXJfXW8B-n~)J< z$jqL%%jQ9qM*I)WD$FW=!{2M@;61ZQtLc#qNW2GqfC;B~eJq3Fi7NAI?JIsmhyQmQITlQ|FWw9FN)D*I6C&v2qNFL0#O-m7zD|xP172N zr=6m?qBjdO^NIf3qdL+Wdt>^{!D(zjBP$Hg6MNyrQd!>bSfXoX43i*LFNrqbjZQ-3 z3l~zGG_6qO7y7AD1$jkHan<*VOJo5}Loxd`wz-MvJVK?lV&3Jb*D)_c2mWH@|0p>p z1mJe{BanzqA&cW7>#?<#z=+V$DMr<(togjXaIDNUwzsAOI3oO?U9;jT7?FU53OT$q@rD!{t+tj zKtKedu+yrR)&q-I+7Py_QpTHIsmFmpE?u# zu_x>NziHb4{yvQ#z{|s?anJFOuMR#8z&LrP4BV9eAI}c}QUr|GU;p(jyn_WGGs zV_oGRADa#4Wa>OecQyjS2QXp`jLpoKkLJtzMiOXKoGlZLs7Ko1A#p#B{Fegye})`1 z$RNqkDe5N8lJJ#z5(U*L_nYCgYA69c$r?s=x0`we|}zYq<6XQgq)UMsMZ=i zUz42QC#7}H*43tdzAOdnR@5gnf4gw8%JzU@syzTqe5mo@K&fOL0C?p>Qf%7wBpan6 z>5GnmZXTaQ7GH2lssTr?RILQBoC`Ty@p;GgXF$Zz>~0+4Y(13IU^S z&Dz6+D=n2)gXF^~&%+I&*=pDa^F+7%n8|MMGwz{8Gt8wWE?VpP1&dzpJ-frmz_Gul z3{{bh=p>GbpFD_3y4&3sj9<6&msjfErKu`NA{} z$lk>w-~c%K`aDY2_PVF&^7q)-`fTR6J)N`-@f%?lzTsjg=geb-h5=`%iG| zz@ETgVetRdD-?+W+>M~RZi0L4-NxYojxDDE?OfmY%HVaY{guYSFsH4cVDN65ArSI= zrZpK$)BH9?Te%Vhf!8wAMSe1g)ybZJwMogGAuFkzivn#7Fx^-I5i6AU-W#_J_J0FRcTkl zMQKmp55g!~d^MryM;s7OnaC`Ofd`jNZET+%aA*!8N)zId29LU4ik4mJA=1Aqd`cs~ zdYmd!F1N@aJ1)oiT!Ew3wAh(t%0aN&n6LM?{qKN5wG~mdHeAgCz-loPMeQCr#zZT_t>mei!nl{vvTm1UodFJ zm_xfLa6Pf>j^)!^76G&ERa8F*r&|9vcbk+UL{#F^tk|!Zx0V)%2&F+D=J7Cn1JF(I zvd^wdo@2<=yw2woekx-9v6HoD;=?GgpSK4YWN8#?MSDigSn4EaNyI=5Wl%^G(GHMKGYcpDN(v4MO z47D|N>W~GtEB@BU(=_v6W|(9gnUn#He#kB>Qsgw7N}?=!oZLFo*eNj4C{vQ=<7Hg_ zaud*)SR7by9v{`YC{=1%RNTd<`o*Gg4zwcll$uW-WG*yYpTEQ+Nn~IH>WE)0Gv-S% zt%?|@;uF^+U>#$moI4)<>oLD;gS2Z%*h)@l%Ms=y}_S^18cEfWs{mwqhIH% z>6ud8e+|VJCmN=FYimg=`Z;LKv9MzBvQ~KJhc*<&l)MjLUm?S24WRM%B{wMYNWKe% zRbCw0aF#L7R*KqZWLB0~bb$@$QBJ)~nK4C2nr-Y_7#OfYGI~ZyrC(4==@P+N*a|fU zF48B)X{ycHC?b^0md_3woORi1%)2u5lrVfS9wpO%4mUvcjwLOF()=tphX($?d9UhYqUeMKQvfG4y~pz{0iYl$X@#M>qnHfD?D+s~ zBr!1&1Lop=!w0awr5;nywTEZ`2js6e z!vK2YB>xj+?+ZXTmlpMXY*b5CU`MZVf(URn<^%%-o-c$wfXth)*E{v#jA9?p;8`T_ zzBf!`HVwT2CdU|b8b~YCfFhO#j2`%ImyFrH9={zg)fj&jUu$(+OD~)F_{|Q9BJa+Jb7athoS<%N)f6YWGGv@O^&UPm+2ZZR$dbx`WIsq?vW@_| zq*1?(+i;s(4fXZQFJ*u3?);z-WR$+|sLZEnfSs#>Y)X-0Y*qmylH#Ad>C|3!b#u5d zr8fy?oHD|gBXcw_)KZ6?H87wRk;q*qs=5p#P z^rKS#B2wWohPI|XE363|0gTw{ljCW6rI)Khp9QZYF(2IZO~Rj&`zgZ|558W0Ef{rG zd5|c!EdE+iP>A26E$m@Ftn*~_ZM^(GtMx$fR3m;g#+_SLN>9WLWcFe~F|*hp8aiL8 zHy=4yM?#$wikyGu!G}pCMt@8xeUnC{l#V(ca{h-$&Wj3u_tU^#W7AOJ0G)~eiirFD z_1^8~P#lB>0#Dc*(#aV)-zNpINv`aaOmWTInQqOkKV=)gYUP6%s(0?bTFd5(e4eT! z*C_r&^$CoQeJaXQiR2+uA#{2n>HO7}-U?b^zpss5!3X8!Q;K>Qr$HgcU!0%jo5ERg zjUifs$wi_cg3pLEjzV_XnS+mkJi>MwPG?kl3tjT&?Sfl`2!@@Tv5dylCijC{7-Ed} zfNpQl0B^8B&4+Ht@O}DUb#12mYl5GUC}GEll}$*}m9ZY#Bu`xhE3w-SwK%<_#BK{! zG%#eOD4**TJ9&;ZrE>9|MXrfop2F-yArf?P`Mk_Z!X21Z87rMPyzEabe2 z&ei!jdcSxY0l~{BO)4&7FUeA^0sfdUm_>8xmoF!)jdI0h!f{$8&t=wfHExbehd%!s zSAvCfbaaIGnb)>$Ay3B30*E@hbTYVLG-U6?YhVLGHDbq$|x@Px8jcL8R?JUqR4}D*eI)c;)qtuwWjw0Cb{Dv zPp+&hz|^t@*5#z_?d>fCw{RyTlv(vaVJ2@pc#dAJ$%xizpl26QAnno%O9>eIfKav) zO)Ly*;aGPy=6uTy`vSN7o)BmPZW%w$c)r{$208s9H2n?0%N%(t^v+BKeH1-J&SRc_ zlRYb07)8;j^$tVM1W8({VMLPDTGh#~uT$xKz*ViiZ(S+h#FR~s3Bm`!!}=rc-{2|nhT6BcB4jEH7)v0pmK z&)ACARngpGwIPT6YRJ)iC^Y-(Bt_AY0(hCWe?_Ae9&w6P>vEJ6wPIjM-cIvG3ui@c zC5pY{L=zL6=+WH9YJD}&x7r*@a8LDF}iJaA3#KT%)s*JH)T;WVFfBLF733I_I zxT@g{kLma9?P*37Nag>=nWt-`agvxU;fiq-i5q zO)SsC;^c2ZH%S{Tke|v5f@84RBLu&CrBjCv#<+jZ=f_B3=GaCz&q$k}0j(Gv(|eYb zb)hY>M_5w9C@U!pyLEb%xqso$FIaPs3d*)*h+)G@wZ)&DdjPCIP>vIq`rX5J0YW2(|KxJXpN+SN{E93 z58jn0X$ooWTnS+X`4dOcAzigccJ*S6c443C=}uapgoVy2tCmfAwX(s4F-7l5An&K& z6Mq!Iz+K@eH61#eW~7s;Ht;K*;Ecf%z(94CL$!~#N(xB*6dAVnWL1+DP`&XVsPYVB zU?j6y0KBQ0qo)@2Jbu02Hg!RPH0sQLp@0#kM9T$}mF@xIX^dcs2L%=;ZM{y<76dFt zA|xFZH5931AXA1b@g1m*%887^81KEi$jJ~OkkKW0K7;lQgD^Tar_xXpg0 zno_lUiYvYX%l!OjKGnRhURMZEEaw3t*j<1|{6lNC)%o~-d+g;bpi$@Rf{(AHOlN-K ze(JqQN!$3Egp7o8fu0DpY8=b>ORxeQwd}M@yn;}&N!)#SXWg&-un=9%lGw%Wxf$nY7imbNf=@hAn&y?bJ~hhIF6OL>ZL5k|{k;F^SjR{PtXm1aGl$d&5+PeE zm}EYcls#LCJ=;YZd`oVfaTZk(*_mDL>P#esl472Ue3+&PQ&4sd*hhXc39|ff193$I zo~!Li?38LT(~A)9mq|p*kFz=$^B7^}Y)H%b-gE1&gwum0I`Qb9-t&axL6Xr*o)3rL z578cTUZRgi6KGaZ8n~o|;uL%iamhY2bE@v*v&9C4aFtrjz1}lpKZzi7qs$A57;B#- z9adIGkux8VGf?c2Nf0ffB-n3@8r?4MmuyEPsd3LwaeGuTlvij zWOhQp0`MaeZf8Oqgnt0ufOWgOY&u`J`$Js%5I6!JSL!WLCFn(x*)Om&KE*`kQsrIM z3LK##Ct7?sIvp%rioG7p?D&w?)KK)Pyp%;zc#W88+Czhejv_)gbrH@I5|wGj{vm+r z(BHRmreAbXDkbDahI>cZ?Lezw{whaXE%#&21bh5)1~BQ$B?iMDL8~F*{t`00J;quy z)P(fq2cjvFDz_M!fyDSAnMxPh%W9RbZrgeJgv)tK#*fD(sr`rI?EA*tY6PWkyG#RS zo5)s_7>K~-!v-qDn_ibY1L^Fm=+d;WFZOW>I5F?H?=?^5g1Um?l$2sWP6$Y z5Kyk-#;`GaO{65pTV!uL|8sjOP2?NGSlBq0IN-f;K^S;HfI0~S;|={F9{NV$)2>`3 z*VB%9B?)RNpc`h)XB#El3*qPbnTnGomGucbu$T>4=CU6fzfO}NExpH)kX*(S6wRnPNJ&Yl#_#W9gR8?sSoSAy(-ww< zanp>U`54$QHEdLyv7{!mrEaKGB@$LTCiYuGwcHkYc215k#URVh<0jJ)r;Bxv0H?PUyF8idbcoc{6Qg}s8gmhSz$;XBIRBr&RW-l*>Jp3;7}EL zmogdwRa`z&P*m9W33mQuda`I`wZzFkYR~XWR3<@blnoKQ1ysc)g{j<=Fj=6cemLGSNcKnCsypObq0q2gCO0jx8qZG`}*Hk$fxtbHDMkz`U!+8 z7r$!R1nOg(A{Ura`heKQvTVj}k5DD4Tm-6E#avwxyr0kMR02A`VIL!OkR*77a<YadKrVm*Zp~D{mx?Y(>+^)wX;)vge-9ptpQ!Je-5Kd7lzo` z|AWbK8q=o}{)h8UZ`Da8G7DM0k*$;;h(4vmvl0m#di_zN{!XT55teWdW9r!y7{7@e z^6SurUL2_Bx<)xLS*$Znr=6&2(&V4LMm+K)R`jFnFm=AzF0{2*&9FpYCevG=bLANq zJ3VBBp6c`ri#p$%ghveX3a1t-ggHXX!jbCvm?hbZgPvf{K{2Y67i}KwbjV95 zBW7dDI~)}H^lM4fQ1OS=@r7*-n4eD6TQnl$A~ziG=&P#IH_6#BeS}4_i5bdHo7c5} zk4Fs-M8Qacq(-bfi1L0wBQ~PS^G+++?w|&+aHx0L4Fq7!gk{l&c;OlApRacaM^pOq z0k@vOhQmo$dL4kyKgB8hzd=(c#+c4){|g1R2|Fqv~~?iFz+WSqY*YCPOcy>^rB zLaFM>9UVi_Tg@v-5TV&?ur`FwJ)u$6pYIYeoY5J+EICQ}kDdd)${M)_MXR(yv z){*>pSa?OLkZwt%Sh-ypnemG)V&9l zZNPE*CV#TK<0KL|)~wPn!4V!sYs6?Zh$wo_l{yYdVN~?A_bs+tqS%8f@3;BdUKHHJ zKtK|aNF9rlumYQ>pri<)_!enSup?qzP__b9E|M^c8Wz&GGsDbGk>!j+1BKIq-JE98 zJ15STd&Glj@!!Z70tFRFbZGNvCBaA}dVfLwOE2ZGD3GwI>wH=TP^vMaWi3j+#Ohle zjia9cFO#m4Cc2eaDZ)ys!&b4JU-(gCjzjB|k_yc)>b@q#Q~0tZa83x#O>90obo_26 z#C%D{(7%g5lys6PQ&rTx@vN}Xj|*1W-ha2|7iXd>foYBg^I$lto4d)}=lqOKrB*bl z%mm0%e*^a7jIVrw>Z%PfBArAtj<4+1NXlmsSOJPiCaaM1WfpfDD0Vii1OJO5DiR$c&9ld4~0EiXG!$P$%!>C zlaYw)>F0c8!o~BhH-1Qce;qOY;;z?6D+TGx0dk>C;wS`Mc6bxl&2GOO>+w*o1z-X6 zW>uIHH;~xg+zG?J0){I7{-bw#9qxgD#xHI5cusTppFJ+u0(Evcr16u9>tuO|*8wIc zAG`$bN3p^Tne2IgW-H^L+z0y|8}x~)Jo2x5Xahr>^Oli6NMv#bb-;P@nh&5X)x?k= zM|bZGOVk;jbHp#0)}|i1_AY_RvsFV}*-tQuE>k|e+sHt$PXTvhclR62978Iu+GKQa zm0pJVx)qCrLfij0cITmm_)}C|r|)&6O4IFM)Sz3n?v{dvVuA^!Mvf_6bF`AD%0WKafQ~rx&gN{H^%^V+J~1GjBip``ZMiF8;^+`frmFD4Xz|Qkyx(`VJIQDwQRY zQ&QS}XY2s~M{c$XXq&5X840Fm!fmIFcd7r4xc*bI*hupJE0QGZ#s4FvYXmsrX=C4t z)qiSd{`*muLSZ;_)!#S+HT*c{PCbe)X8Y*@L_w$a$ zz`($Qm&tSb4;$Vmz5WtZcSl3srhrYrVrRDAa)U&m)&i)zU+k_*}Ap`{`m?x#%?UO=*uj0`%2;R?HRAF!V>(LTg}{73&6hW<|@0vuZ2qsEMbp zUQD(nzcgysQ&ngUp}w;mdI*uZ?Uv6kbn0DAM85nypW(1=1Xz$|tTN~I8^`Z>j#HQu z4oJ>Pf+v$!FIJ-%1iX&9&XoFInZJ{%dvUj`?4L!1<-NK4%oz0TDl8Lgwe<+itytK# z$8ZWh_ZQx+vJXz^8h`KPT933-nFt+;;jmp#-Q1N%a$C{HWwvPHd+tHwx%)$NdlRsC zJ85^YZ1IbBDM)~!adPNO%??iDuZ7(MRF9bm+z$9+xO*t>;^1w_f8H zU7AM!K5lx%^=(s+z`D!}h-sg~Nd~bxJXst`c{p6)@#HvYt|9(~ri6<;KH3XCdhL)~ zVrbZ(mtGO*Otq=)Cx9aDmFG7DM!=QCoo-pY%A7 zTGw>;kp8K~C4#d`ftIb5)jLHWth$tygATTfmb>pjiy-mX2%}((=xkDc(2kh4$Ew-F z>p@)vPFwg!t|;8f4kpJaOG*UaozWe6)46fd$RQtDEYpwE&v)qy5uK~~m$#2oZZ5g$ zD6oOG_AAvEVF+oRGq(H->HZ0Hm`{&bQhS$aSOP$|`!0vZW0wm1*EA+e8OVz7vzyEd! zQZ3iG6tsEGeqXNj)rkjAGe@dTE;RX?vE+A#LtXfS4h`aCnEqr9my$hxB<*(d z-*&M6u`BrXLHd5@PDz8PKH#3IQ8CvtUb;4uQUwuJTBU2cPMtR1IgEbF&b+=Ht5+*X zMu)(=>nwlH{xj0T!_{J)&GR!G+=nk;*H%;-Z=J^^5Yp3}Z5v8ZTpqlr&8(Q&m-jMC zm(_QYEN0r4*pKl9^difg8syrA`t_%{xJ?aP=cgcDRUZrSBl8)C7#dp9!=TVn3aMZ zY6UX>FUppfTm20*Xm#@9^vItjdz8l=BI)*Rc1_^az`)o(Ns0)mTqodpnc<4yW!`^t z@2EGPVrXQZ}3ZkzjMpegJ+^utt2v>I{HjzJmgeAu1VEFaLHVb7K?r4?4G1eYo zw+*9&TzD5=N=GT?ncd|~t4yag_=cB%zLX|DzBACOX}x@o$;<7+TK9WhWe#RTl~ILN z;%Bc{+fg`SQ{AfJ4s&8r`_v#Jj(RR@Y4ij#6y%g-GW9r zooDC@SOoN((*)E++L=w+PveWR@%h`^s87}rprYe3WXFav;PrxjI{4w09gwQW4mdW8@LaFcv##2J}#g@eBU8RpV(N z)K^+(eADfIW%10JnB2>$GH)pTO3A*ix}}$YJY;mb!F0rMn~A1YiHSG)w4Q<$Nof*a zeN|aO6KHyGew2G{pUK#XaoDO{6F(SO$#M5;wH;~7nWTr!%#q&J=JfSkqi5q^XFGc^ zq+~X$#5M1yQ;$-zt$`-=WJLPC!MsAX!lttIEc4~F5|69Lt-wdRBG~1# zR#rh&9^QUF=fC?D%j&2Mj@d-5KfW0cDf|eM*GHd2reF)8)t{*;Wt%qHoFtS*Kqb3s zOWqWdn!37<*ecX7{o2FmW}NG(6$YnP@C}q)Ew58eAp@79;!RY=DixAOYR^a#-RSLP ze>AT2N??+09n#xlF?Y~clG7%WOstd6gMjP)OtaL5RhsSpwYTC#zqVC$FrDwHMJOVOTxrqrDuHqFEZMGXek8gA7lJ1y{_5 zl%;tm(?ev_L1!{Lo>Y>vRE?un)OCPF&DQTgDnWN*%^`Lw+AH;6gERq2lH3R9q$>>Z zCNO8b$XDQb7^^rL8v(J7k-`Ry6bE_pw-{@5udjP_q<6JRFqD?lL!_8cbVg4fmksfQ zAy92WIm_$vvw+aDk|fPjxKsjnO#V9o*1No7y0Hs&3knfr8zuz>xmwsuzd$5w;19>` zBB#aqc|%^cxEcORS?M87dX{~OvB0Vt)2&4hR9G0wS=+lu5`@>+Mdg`jESq*7$}3d+ z2XQFqI#eT%VM9*OFmIkv!t)2s0I2y-ljHrg-jC6NQ$_rzc@iDkn@5F3;dJ8gq;MJh zsHnog{ajpup^pbJSPp9x{nsPlED$xutKoTOy?ebbs;Amq^a_xN$E1X^u&yk6Juiw4 zV|UU0h(4NFcr?G1rH5;(je=0HPoY=IeD0vR80$k3kYS&!$746IeTgFHmWb_KcFS3j zOK%);$SefHv_+A3H}F-N!UgQ{Sj;2vig8YutKz72%eJQ5NMM-$*sqsq# z#JXaZW@EF2hvb@_gGtN3?k4ORiS6IZTPHL5Dr{C8U4Sgtfdwc%dXra7-XLvMM@;+_XXtG^9c^|=xhG7Km zZFrpXd0bD6R{%9bx9=50TOAA?*Ri@l4d()YRDnLj&B#*`yGH9}qw*p4uT}b8-aL&g zcI)keqmx_*cu&XrZmYj~WejMVt^U$4ADF0Ei zqG%I%-i2w%7+9n@q~21TkvdsLTHw-6^$;<#3X4%ryt2ypp*ver>7c7vhtQ$n45G9_dDePvt}c<1ADoL}8;v1o zMRa3}&IpB9Mvi0{N(AN#B$QNDfR;gI3Vq{JNwH9zLN{iD$yQ%Z(Hk8A9Fo4Bk$?0@ z{)9b2O>w{{O2cu#8M!~0Q_n80l^=KM=>B6_SL3nQR$Bn zcH2XID#<{qrxnz&=n0n`j}Aw6Ak;j@LoDs0=|>Xh*%7wyuzmcprLpZng;i2M$4_QIGK}_ z(Hk1h5@mOO^E@Gc5XB3Ef&(@#h5L3hpjKUYm%2oPxQxsk|K|*zl|jUe&vFelF*H_h zR9&>ak|UL3xca9i{cpcH`OzEbd*zoGD&WfWnrVbv;!=1n0{R7aD=|_`1r$PIg~?gn zn+FYK8-iFM3hoaHWP9~Kb)oBd1T1bruuGr(TVldI>Sb6wCXwoo4L6?zZB1|ASHo?|V=sbSYJ%?@TP`Jyu za%>d*X^f!iTsqhjv0BrqxD)I^Ac`M&S@at86z&_?PL4@y6lF2aI1wbHh0!>|xzp~h zvype7HvziEPTF+ep>F7Xfu;O#SGaW9-5eRpHlm&f69y*~5=d4@h=!h4LIpN)$&bkj zGZgMY)|DhdhZZRwt8$0Toq5@)<0{NOFH^mO9!4Y5W)Q4knW9A_BJnL|C#jL7Z<zf+t~NEXO!CflKJ4Rq+{~*B^LTm#9}d<)+sHDJf4%ob547JksFQdRXu#zNJ_Go$ zRZ2>V;gfZc7tvb+l4WmENdypL;0Ww|@9N?Swr@n(z1j*!Ud3MY-d0p95%tx zBtQw>?)`-``MT6%kpnh%Lpcv4k~HFcViG3_A4gANle~|!{CWkh)P0`T@MUnfqn@Ii zaBNk!`R|BQda~*&ec{1#wiGYU`Lmi)@5bK5J zUziiv6n#h(rL{&f{ST2aP~o#boXB=TmRz|cBtIatTahEB6|vwt(PM;Ru43}-RbkL* zs6tK#S!J5;Sg5o?s zv=SdeiLE>@JW>PM{7*vyrIwSa-=Vn4%4hFilzcGEVJZ!>o8CQRmK?nN+K2hnIc(nAWxCsIWuP6tjz4Z;_oH0){c% z(!&=SX^aN3hbWInyXp$4x)MDgcKI^nb0jboHb&u$;m4&z$sFZG#o7X*l@GI~wxLzC za_VnezBfH?Y4odUP#mOUhJG2!9(S?sjyG;qo5oZeIA3zWw+VX{79>3`RoE8EpnXe_ zTGhW3$AkPn{1B(g#lu3?_$@&qf0ShVa?raP{}Dt6P4kcsbqFlk#2gf`fDib(;boR# zZt(qq2dBTe46CkIq07*cbzXy{|*VormnCp`nJRDSA zfaw~qTCC6mU}|Ha`q`9dm#W|T3DM{N2RRv;Mh3St(3Ad!MMZo4VBqRZZ&KPye3Kb$ zxc@>rP)c{2df-uSMI(Wq_9KHpJBucVckcsCMlY@0Jr-(ZZ0ddXu#szrqN;)cY@Sw8 zI(=u~AoZJ78zCROAjOJIF=Oa)y;8zFW~C)XV5t_28>z_hFJ#Uoq^Wk6aMd}2tG(eY z(p}_j2n+Jw9QnJSE^Qz%>cQCT3!!0*Dvhw0@q7$_EgjUG9uh5$)QL3M(Sit=qsvm? z$2c^d;SX@AV#UO9H|qxrizb~p8CB2Mk8tV{Y%ut{9@UQAHRNzrq9Mi*_}FCl2@#U7 zgrX37ZIz}(2OroZ5xK%hs1%pz6mb;q?JoNv{MrR8tLf&Q(&jcQLVs)66qRH#+*uo% zO9Z}7RtF{`=b_b%Katp}z`Y)u%9gKACw!1JgaFcH&3pw`Q_4xKpW*(Zc{TB@(y=k? z4iT>}jpco_Ar4P0Jwgz@Cl+~A#bOCP>%>}$Q4XPrdZAK+q5er1%k%44o&NCyHFRRDLd%BeTHvD`zB&3FzD2Z09CkqBraMGpf_69Rg)|G3PSN6x2I`is zq)gk{20h-dJ}R}&eaJbPra79wH`YNWx^DFLjJK{4hMu?_R!zAp=d&@A&MkuyRbSHT z8@Tw2oA3dc2}S|>O|*im%2K*@1dMUHC|18W<`V(Lq_;v3p>R(@r!X4x`&aWLB&})Rr?W;@(|or}e3`sMT{_r+JFQ4=0FGAGG3X$bWZf1R3Ll zQ0|GsPFaX&69Sj(lGqRqh;ue}DgJU&r}u_`h@{>D8_NNc04Ou`^GCpjt&o* zc+(Rf?RnOPrAYYOm}~LQBpekFIp%|<{Mgg^zb4UmFp$j5%>Jz*MTjs`$2Pl1vigwxzn z3?iAYZ3%Rm%7HB9n3bqk;KIGBe+LrXlB7Lp#MFe!F8DPM@21d{|{X8FpVOaZ7dch^vi)}!aid=+h zJ)Fb5a_p7V#q~89_@5L+@yW^lrueaZSf~-r(Flq*f#EsLzPQ950w=D+dYWYF;UuUz zH;&TQFnD4{(x}wb87eG!Lqh|d7W`TBYOU0L8%_45CT>T}SR~Q{s$v;G*3*X@e`|p| zV=x?+F9k#2HE#{21^!)gJ2c1a>4@J{x?dFB7O1MiGi12n zm&7RdifXGkXhaB<0h<8bMRAr@TW7;pNJ+N0i(Mh@7z))@!XIJNylS{$6EYQHm1+r z(ZLY|T9tP#ZIK^(#~q$47g|S1&igr#Y6LezY>7^=4wwctAfXAe`k5~=GEkofn)Q&b zCU<;({|i2GY9L|px>kEVUk=>@IwF)R8hRp^gq+JDwmDWQEl?Py`(0NfUn~OW<1%@9 zvr37QP>gP^NysG*>(}Ux+Z8J@PRET-uMgOfD+5A!*j&v(T(uD>4_Q|DS9|j7d+tTc zWT+L`QDdtR9fW|3@v2s)Mqk{ZVnNZA_>zMl@x|-M+>CeMPlO*JnXk;pyYp8ic|0De ziw&Rs_b|TbUT!X~dmBT>>Mj>(5pV1#3q_OX{RjQ(88s@x5$bQK+X@S8-*cLy$4 zVvEpLEMURRc7f{)(D&~dMI!Tsx}{VH+6V#S$F>L>G}jQ7s>}s3nNHjvmYj)SfgcQK zY6hL*cB)vI9J> z#;r>Qhj3bYqQxSiqNKo;(=lTlWJ*+iH6$4aJK|bJGYo=3rr|)u2t6zIE)zZu^5+c; z&)BPsD`ip`meJ2qxC+Or{lSqIf$xuW|A=;EnQuI#Klc@eSHnREHss^R5>u~hMxV2~ z3C(TmSVOYEC{+q45trI!^Nd}!a0+EV7F|!mWiMwB=g(;2LCiZWB{d@N-3rGuq!hts z#sjFp8Jb}DSb2QAoUGoWL`NBmAVxb!TXAXPJ-z;iUbl~DSVPRc_|V|SKbU&?zBFz# zxX$_vLOmg^eJ3g{u0lGZLh!x$!*bwFmji#0I0$|xz!*NE8Sflg#`O6QB33_cj8w;C zgqn%C6cxch@{UHKW%*1Kje9THF5ZtRM?CB(MU8LP9(Z||D+C892MBKM45eTgiYSW1 z?k86OvUw*AZ%`0ulDYP%f$21=rD(&1#9dTnm;H&Jsz6QS@(Zxm3O&y8B%&-9^`NazmlxujyVBL4gAE zl^g4K2cVVGj}#s}_{eSY+4_5^fhgPo^2Z+VHC-CsyCkK%*4}R7aN8h4hybC#_w;a@ zq5+SKXXIp$XH684L*QG_w*S7`%fOUtH%)ZDy*?=fhy0#Nq}SeG;e!*4DT6Z%53k+; zPO;?wUu|C*7e&AKt%wMSurx?_ODNq-ccX+fl1oaL2uP=tq;xN}3)0O}0#cG9jil5f zv2YL9xz2gceSfaE&%WKy{AXrocJ{a5TyLDIG7?Ns4rB-d#^5|U$}iF(7!Cdx$K%M6 zPtRpu({`saFfe|)UbN_oG5`X!&X?Z6v)S7GiF(9MxR(HQ06@(O2#QK>Bpj;J0i&Z%B>;U_X3HK#dJQ>-oSus zd90!PR4v`j`2#ZV9`ol76X{0jk;aQL;*L-kpcjzjH}`QYJ}Q3Hp0fP(K9L`hZQRif zJ*>2eb+7dNruW_QC8qBcaLPbalGL<0ksc;f{48D8xf#!<^g1e^tfaUYLl16H|7NB{ zBbUktel;=1kTibqShGFuA0z^gMA1sWlvb4%fDj>HOFxek1hDH@+5&c)skm;Cw@!H(bB_wDiTg5_sg9Z|E==)k2K-0hy5%u;I?hCSp64N{`3E=Lx~0m z5X8}Olf1tD)8=L`?|i;dkwJg!Cja;5E+7VwczX3u=|zONCs2%L{pQVqtFY;RXC?o~ zUHkL5G_8&?NVE`Z|1t(=0cJP3;;!qj@z){#?*n#0M@HOReberLfeQf}<$JrTsH!fm zjb8qfzC;Ku91l&bfkj+=Nh}=sTe!HL<*!@uza<|(F)6j~PBI_2@v!nAE&#BCx-DL= zGVaa7o~JCi)P z{%}Fgn$;Q%QL59zaaCVuDQilhV@w1=sEu^gtK6o(9ew4x>kA}FSljZ+>66SJ&nWB` zQ%k#Ux;)K5jylxkwZr^8%`Tsb4VRJ4^e_n=?a{VjtJ4}u?6RtglKLV|%TLIEE`b6L zT1Oy;M}!nyo{*VYCCq|ZRki%k$047IWYn40f2JW~kFV<*W#Cbz3aCzg^f1{`#J&W0 zf6tbKel;V=Vk^IXhZ`?Ps^+--h-y8HWVRE^x1pwvDR3e3%t>@pQUvXaJh-tv*BRB3 zYeNdFvPVokgEY4Bj^236J+GiUZtB>pz#86P$|afQ5D7wlF#Gkk@yG2aM~Hn|EkN5Y zn=TF3W=p%32mCpq_bYn&c{Wa*3aB>H6r5IYO+3SHj*Z(`r0l&Q0!~QuV(k# zIS)CISJKFa!*j?%RLt*%8(Ldq22%==F^t&PPcioms@Uf)5V~={V&@v8B79_qWz}UH zj9@PJ{iFice8V9ij4`|n>z?9j>`-J9E}N(JN4L58xn&xmA8VV%1{Xr zfL=ZdcrSHZX<{%vV&{&0%G9W`w%jb7gZ2ILoU5G%e+QU98*YE$g{LLSHPlo(@7+&} zs%;inxx#hsZ`p-u%k4=lY0z`NIzj-!HgM-ngGPZA*w_XV%#weYC9DAe zhua4fR~a|%YJTc)17^b~KJ>6q zUIf90=^JQWygX+EX|+>M)ry)?gSAefzEasQ)Qy$j>T17!wKlJ4`5Ps_OUc5~C9$=1QSr@uq(n{HD z6_`^J%C_;pQNc|=i7TsH^Np1;JMKRHyc(a|!7LHiAaiH{yEFn%r|_XyS#nbrf*}hF(-SWO*5Ga=;?}YW~*sUx^PwQ~2-1 zB(8t=+{H$7ysG&OL`@9>T~#FQq6t@bZDt%MtzQ5*`Ky5Q4@bawS8~@Ac&E>NFc)hI zue!VNAGFhJHbI{d>$VyViat%=o1{^HQgtKTstI*Myl&3&PGneDUOTH}5=t;Hsrsh3 zl5l8`LxrFj{E33M&ZZ+Tx<_v4^)}qpuGu+q&rvIn_ltGxKMdm2eanq8cBJ6%5>fv6 zlLM{_9f?cWy!|}@hy?;7?TV6mN5}=f{28Yb*G@g^ynbbe7Xr@w`G8$ zozb&5r6~K7$d%y!i^lZpjIjPVbA;+t%E{KYq4l1m$V&mmX^V^JM*1)|dP+&9UoBc& zV^8rvbVPUF3A700n0*!19Q5jSG5rFyAXVDi+~sp{M9Bxxm_||mbXArWVur&ZK9Fzv zj{YAY4LxAbuC8)O!QDdo^^nZdCZ5pS6CO)vbbc+F!p<$YIX-u1OQTVYWI8QqQrw*2 zr??XYUhY#ie6pKz5-<5akd=Q*crFJP4cx(LrhR;%4<=gkl8_|O2~ z=qO)3%vU&{zH}21U#cV{zIM~P)v1}bj$Q@{YAFAHbA?(UeBe{b>QT3xAe={~tCRJ_ z3^y_;=ns9*{aORuF9q;r<7x|;VBumJS#^!nB;R~Y5dk;-i~vC&YXPv4^uo`uZwJF6 zTeBDR366LRoU7;XI1wvuG0^0w+VvzwA>wFuOg zHqvZX0}|q3J}qy?nKfStp6w6vctXWvUu)0eILQwyeEqGgxsCo>ao-FFEWvI6lAn_T zC1Wdw_za<7<5HGzr%p02Y5Yw#lq|-QwA} z5MdhRd{x(S=5@Ys(6FW#=M_Fm9cT$2>Rr2&VZrMnk!8&4s|oh&E(>Zp7n#6RN~6u?l?fWBWf|TQ!}kq|8k+8zAH5UHFWUL zckB{>1wtM`N2CdUr}AvAC7BtC5KwF=kdvJtvWR{Umu|{|$flE>(A?Cqf*y4{XX=en zmuskRpKH@-HT!03G9;7)Mf`b9OCL(F=xy^MHTXqbPCYYg+AYaZ)-%50ra9$>PTpQV zjYv)+4Nj}ZovVE8K_(axMaB5-1@>T=w{-cNh$&-t|1+t99F)KQtN>kpbp(2jkFH$U zcYUm##nL&uIZP}_qWteuo9BD4UO#$9N=`|qcYMXhA+ybv?YMs~Sk38L`e@{_?q0j!h zS7d5e(Zf`!XgWDMx7Rka*WP~wz`juti^^9E4{o_zJ{Yd~M-#>0W?*%P8 zd@|fj-HzNhrYJuOe!AFXF6^g{c>MmWx70&%6=lxR{>aA@Au{OnCh}yI1)vj8-Y7Si zc=D{a2(FTw!~_c^9WimnqG6Dh$6Qav3xNz)*j1~5o~-dlFV+TF7d+eb`m~eW^J;f( zZ-`VLdy@E?C}s^030nEd8W9|`ra*+IuKjNnX%9s(z!iXI{D#;{UQHIO?S~SoWA^d| zRs&h&RJxNA0hhA|HrdwKD1h4An^56~1CfLX34oQSs=y)V>-9a|Hs8wegNg(BQw`=a zGpO}Bn_M^$nS9rD`BW6B3B3ESWu6THtP6oR7dC5$0J&iohD}@t#KSDy8AIpuP(YbO zxb^er&-a~!t}-vZ3GR+s)5U9&@=3-Li`(_hE=y4wULz5c3WX!>;wgWyKEOM9}y0k&*3C}-4*sQnq zW>V0k12^lKFO3A+AK%R33vJ`St4Wx|zF+RYCF^8Q#SN9s zm!kUK?E$z8 z=)~4fH@r&+@a;{7&6ScB01ZsNk3QX-geCOX4u*C{Vbi3^TDqDPVGamieqz;Z6?|BDgv0@fR)eunzM$#K8vl^%AP^LI=F# zA29qFkm+j*r;k0J+ut5SqI8Aj3KNnlqPrKNPUNC5v3V@l!tFS^$t<&ClP7}}DZ#Zy zg{jzb=dWGZrrpUhqJZwAy_Hn^;S zTYzTb{W~0m@$H}AD=m93h64cpIW-}{%xgKoi?%-C3JC{L6N7MEDjYY(FUQGjI(s>O z2eo(3C?|jgzl*pNM=|g;B3uQiUOBTA-K`2CQ_T2_)ELtoB_d)YEX%l<$Z|kn#!BCr zZln7AhkIQ=TVIc`lsEH`wK~bbCUTmNWud|SUVGG-`-VR_lJnW|X_1?_DUFC=!m?4J zKT@K)y$!YI@25leg=5A^TL_}8xn$8e*pMI9lU4q3)?{0<=~#47!SR{%-em%}qNf$8 zAlpH1`AzmYERzilebE1p|CyRknRBVLt^@Pb1r9!Ppc5Z0jq;pQBRSB`Yf0l@*G)W||U=$Wf+XZ^gk#XJQB)?j7%x=TWG zdqG^8sRM-W6c(Qv88_;tjglh4&t)vqe-dLM3i2W}dcW)5oWm2Wb+F6{BXE3b)h=+~nr1M0L&{fHXGq<`4#~fuI zkNu4;g!7;+HqyB!i~tb%!<5smM>Mdzt_EcQw5w{+Q=bMB#}A!)y)J84i1=bLI&F8lgr{glgQk&mV(QPmMGW; zH=I~}3lQZVzU1S@a%&w?70-l4A$N3a}RN%rF@+^2E8i1zH-|*v|;7 z*&d7!4sT=`nuk8^s5q&W!bOK_O%u?;QWn3~4&gDkl7h(_BP*Y5o3^vWr0otiMXi4x z628dHWv|q)*stlPADm8#o*&;|sR-RApw4EWrii|5wG2xaY%WB1!;X}BSXunu_^fFC zMyqg-F43RJhG-ano;$8b66!=!eoWwsmQ#zd!V;7|Zk1X@Llj9*LsYPHSO+(-N?T^V zo>CjKE9@QBu@y|@lC9QM%kki~CjiB%%tBhF{Rb0cp(*Ri1zGuTU$SMB=^Dm9_-ueJN)zWQkXER0*?4CS! zx_!h%#)sn?hFQ=sVLD%e2aByml`gOE)k%JnsD%WEtZzbOVHU01K+$dS%Z8Sj|vwCi|7)AP^@Z6^k;c1Sif@HgdO{Tv=TktzG> zDv_ZPrt~;|lMekP{!k6eJS~(-yU?m0SL6a-+T3PBUI5m9sEZ@_kr56Eq9~&n* zct_QkDtCu}PDg4}2;JjQgda?_f-#AM z&N7Ab{t)(3hTm)Ief7L33 zaPel~ao<$kU216*2fUcU5$ZW&!XPQ#1@91BdGzFEi)Dpez-I4wS2SEyRAexi#I#>g z-HyG(A&UUnQE#kV`n_&4Ei)HH!=o6_2^lR3`S4`og6Ux+FR;fJJ z-Fb9-y4oK=1w{3fyAw`ThVX7AB94l}EfTARd6A4*q}sC=G_RA9f;Y{(hNr16#oHu< zRR(JV+o%u!UWzT5!n`mBJYb=#yx-hyJ`qWH$<-&6C~W_zDmN2x(|5xpmF@eS;b7+m zdtrp?aNh|RlgvRVr8C6itz0Ck*3nFd0+=IQn@Ql&G=2N3ofGQ#kSaI?>%QU=O<|JU z*ma?zR_?(QFeaN-bv3n~oSwN!Jcld{hK=lfnwQC`fyqXaX*A>&A3>HPb)k)G4GDvS zF}>HZm4Aupk!a}qfyk1TavqAvm$QXp(g#mOEd3}dW}hery$46p==*7Tm=MWE5Uz}a z2pi59iPgG=hw44FW;LH$LJ|i!0=$ot`svbg$_LhuyVXP^Ml}CmuK6A*WFM}VxwRKC z#%XDBP&4(Pg>UH~C@u!Xjw7N*g*s;utYR6Ujm7TIP3@=CzM}#?gQh9pHEy1%ixHW02YUQUUahc%i@!#5i=U?~s|TI8 zjFwVmk;4Yzbmc4uKOcF^q58W}Sm zaX*7e&BAC0k*2y`9{*F*h}*E#T&dY?o0AvHh#JaPVH@)24ibF8!oeFiD06Z zs42@hrZM78e7Te4pv5+bwWxAaOV*)M1`@!t&qMT)|q zl!WsteU{iFd5ir|7nuZdiQY%>May*@iC)yK!%bYe9)1vMah$75xE*pUg?$t8e{-Rj zBEFe!35IgHlXfTDNv^7BU4h1cn(I)+g=QzV-WiYrg-bUGBPEBN9WG0*&k{JPy0SDp zC@W^21_F940HL!fZI{Q+6c)f6s(Bs$5QlwjKcQT7sBRNTI4WHdM|~}c+uWO2p3Jyi zTaH99$N4)`U#gg}({=j2pzAKoz^cjo>qmfA>dy}9P@O243#7#bT-v|^c%erFOzbRcX2GASF&UgMk%Ikm z+4R@3auatX+8w-$8-z|9zupeMzS9V(?Z+T^E6%)A}=TJj}pyLoE)*x_xEb*r)d zcHDr+(MbMCN=m8(+N(st9}C)#({Av6Rc|;T1UsrZ&!*Go6q3IKQ_eyksVOBp@5umd zj6~x1$KSp>9B}51yL2-|jbp&B|Aj>(@$W~`sOf6afK|)fREDI~<+pdyix@R~%j(?3 zc3IJJJD0*YEVnzUbW67S`=2;KA-aI?p_1)K z9$?_q09DWIKYt= 4.2.6.1" + }, + "arguments": { + "install" : [ + { + "name": "domain", + "type": "domain" + }, + { + "name": "path", + "type": "path", + "default": "/gitea" + }, + { + "name": "admin", + "type": "user" + }, + { + "name": "is_public", + "type": "boolean", + "help": { + "en": "A public server means that everybody is able to access to the main page of the forge, on the public profile of the user and on the public repository. But you still can limit the access to each repository if you set it as private. Note that to be able to use the remote Git command (clone, pull, push) with HTTP and to use the API by (by example with a smartphone), you need to set this application as public.", + "fr": "Un serveur public signifie que tout le monde peut accéder à la page principale de la forge, au profil public des utilisateurs et aux dépôts publics. Vous pouvez également définir les dépôts comme étant privés. Notez que pour pouvoir utiliser les commandes Git distantes (clone, pull, push) avec HTTP et pour pouvoir utiliser l'API (par exemple avec un smartphone), vous devez paramétrer cette application comme étant publique." + }, + "default": true + } + ] + } +} diff --git a/scripts/_common.sh b/scripts/_common.sh new file mode 100644 index 0000000..45b115d --- /dev/null +++ b/scripts/_common.sh @@ -0,0 +1,70 @@ +#================================================= +# SET ALL CONSTANTS +#================================================= + +app=$YNH_APP_INSTANCE_NAME +dbname=$app +db_user=$app +final_path="/opt/$app" +datadir="/home/yunohost.app/$app" +repos_path="$datadir/repositories" +data_path="$datadir/data" +ssh_path="$datadir/.ssh" + +# Detect the system architecture to download the right tarball +# NOTE: `uname -m` is more accurate and universal than `arch` +# See https://en.wikipedia.org/wiki/Uname +if [ -n "$(uname -m | grep arm64)" ] || [ -n "$(uname -m | grep aarch64)" ]; then + architecture="arm64" +elif [ -n "$(uname -m | grep 64)" ]; then + architecture="x86-64" +elif [ -n "$(uname -m | grep 86)" ]; then + architecture="i386" +elif [ -n "$(uname -m | grep armv7)" ]; then + architecture="armv7" +elif [ -n "$(uname -m | grep arm)" ]; then + architecture="arm" +else + ynh_die --message "Unable to detect your achitecture, please open a bug describing \ + your hardware and the result of the command \"uname -m\"." 1 +fi + +#================================================= +# DEFINE ALL COMMON FONCTIONS +#================================================= + +create_dir() { + mkdir -p "$final_path/data" + mkdir -p "$final_path/custom/conf" + mkdir -p "$ssh_path" + mkdir -p "$repos_path" + mkdir -p "$data_path/avatars" + mkdir -p "$data_path/attachments" + mkdir -p "/var/log/$app" +} + +config_nginx() { + if [ "$path_url" != "/" ] + then + ynh_replace_string --match_string "^#sub_path_only" --replace_string "" --target_file "../conf/nginx.conf" + fi + ynh_add_nginx_config +} + +config_gitea() { + ssh_port=$(grep -P "Port\s+\d+" /etc/ssh/sshd_config | grep -P -o "\d+") + ynh_add_config --template="app.ini" --destination="$final_path/custom/conf/app.ini" +} + +set_permission() { + chown -R $app:$app "$final_path" + chown -R $app:$app "$datadir" + chown -R $app:$app "/var/log/$app" + + chmod u=rwX,g=rX,o= "$final_path" + chmod u=rwx,g=rx,o= "$final_path/gitea" + chmod u=rwx,g=rx,o= "$final_path/custom/conf/app.ini" + chmod u=rwX,g=rX,o= "$datadir" + chmod u=rwX,g=rX,o= "/var/log/$app" + chmod u=rwx,g=,o= "$ssh_path" +} diff --git a/scripts/backup b/scripts/backup new file mode 100644 index 0000000..a311d22 --- /dev/null +++ b/scripts/backup @@ -0,0 +1,51 @@ +#!/bin/bash + +#================================================= +# GENERIC START +#================================================= + +# Load common variables and helpers +source ../settings/scripts/experimental_helper.sh +source ../settings/scripts/_common.sh + +# IMPORT GENERIC HELPERS +source /usr/share/yunohost/helpers + +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +# Retrieve app settings +ynh_print_info --message="Loading installation settings..." +domain=$(ynh_app_setting_get --app $app --key domain) + +if [[ ! "$(systemctl status $app.service)" =~ "Active: inactive (dead)" ]]; then + ynh_print_warn --message="It's hightly recommended to make your backup when the service is stopped. Please stop $app service and with this command before to run the backup 'systemctl stop $app.service'" +fi + +#================================================= +# STANDARD BACKUP STEPS +#================================================= + +# Copy the app source files +ynh_print_info --message="Backing up code..." +ynh_backup --src_path "$final_path" + +# Copy the data files +ynh_print_info --message="Backing up user data..." +ynh_backup --src_path "$datadir" --is_big=1 + +ynh_print_info --message="Backing up configuration..." + +# Copy the conf files +ynh_backup --src_path "/etc/nginx/conf.d/${domain}.d/${app}.conf" +ynh_backup --src_path "/etc/systemd/system/${app}.service" + +# Backup logs +ynh_print_info --message="Backing up logs..." +ynh_backup --src_path "/var/log/$app" + +# Dump the database +ynh_print_info --message="Backing up database" +ynh_mysql_dump_db "$dbname" > ./db.sql + +ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." diff --git a/scripts/change_url b/scripts/change_url new file mode 100644 index 0000000..46a03f3 --- /dev/null +++ b/scripts/change_url @@ -0,0 +1,66 @@ +#!/bin/bash + +#================================================= +# GENERIC START +#================================================= + +# Import common cmd +source ./experimental_helper.sh +source ./_common.sh + +# IMPORT GENERIC HELPERS +source /usr/share/yunohost/helpers + +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +ynh_script_progression --message="Loading installation settings..." + +# RETRIEVE ARGUMENTS +old_domain=$YNH_APP_OLD_DOMAIN +domain=$YNH_APP_NEW_DOMAIN +path_url=$(ynh_normalize_url_path --path_url ${YNH_APP_NEW_PATH:-'/'}) +app=$YNH_APP_INSTANCE_NAME + +db_password=$(ynh_app_setting_get --app $app --key mysqlpwd) +admin=$(ynh_app_setting_get --app $app --key adminusername) +key=$(ynh_app_setting_get --app $app --key secret_key) +lfs_key=$(ynh_app_setting_get --app $app --key lfs_key) +port=$(ynh_app_setting_get --app $app --key web_port) +upstream_version=$(ynh_app_setting_get $app upstream_version) + +#================================================= +# STANDARD MODIFICATIONS +#================================================= + +ynh_script_progression --message="Updating nginx configuration..." + +# MODIFY URL IN NGINX CONF +nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf + +# Change the domain for nginx +# Change the domain for nginx +if [[ "$old_domain" != "$domain" ]]; then + # Delete file checksum for the old conf file location + ynh_delete_file_checksum --file "$nginx_conf_path" + mv $nginx_conf_path /etc/nginx/conf.d/$domain.d/$app.conf + # Store file checksum for the new config file location + ynh_store_file_checksum --file "/etc/nginx/conf.d/$domain.d/$app.conf" +fi + +config_nginx + +# Update gitea config +ynh_script_progression --message="Updating gitea configuration..." +config_gitea + +# RELOAD services +ynh_script_progression --message="Starting services..." +ynh_systemd_action -l "Starting new Web server: tcp:127.0.0.1:" -p "/var/log/$app/gitea.log" -t 10 -a restart +sleep 1 + +# Store the checksum with the 'INTERNAL_TOKEN' value. +# Should be removed when the issue https://github.com/go-gitea/gitea/issues/3246 is fixed +ynh_store_file_checksum --file "$final_path/custom/conf/app.ini" + +ynh_script_progression --message="Change of URL completed for $app" --last diff --git a/scripts/experimental_helper.sh b/scripts/experimental_helper.sh new file mode 100644 index 0000000..8757149 --- /dev/null +++ b/scripts/experimental_helper.sh @@ -0,0 +1,257 @@ +# Execute a command as another user +# usage: exec_as USER COMMAND [ARG ...] +exec_as() { + local USER=$1 + shift 1 + + if [[ $USER = $(whoami) ]]; then + eval "$@" + else + sudo -u "$USER" "$@" + fi +} + +# Need also the helper https://github.com/YunoHost-Apps/Experimental_helpers/blob/master/ynh_handle_getopts_args/ynh_handle_getopts_args + +# Make the main steps to migrate an app to its fork. +# +# This helper has to be used for an app which needs to migrate to a new name or a new fork +# (like owncloud to nextcloud or zerobin to privatebin). +# +# This helper will move the files of an app to its new name +# or recreate the things it can't move. +# +# To specify which files it has to move, you have to create a "migration file", stored in ../conf +# This file is a simple list of each file it has to move, +# except that file names must reference the $app variable instead of the real name of the app, +# and every instance-specific variables (like $domain). +# $app is especially important because it's this variable which will be used to identify the old place and the new one for each file. +# +# If a database exists for this app, it will be dumped and then imported in a newly created database, with a new name and new user. +# Don't forget you have to then apply these changes to application-specific settings (depends on the packaged application) +# +# Same things for an existing user, a new one will be created. +# But the old one can't be removed unless it's not used. See below. +# +# If you have some dependencies for your app, it's possible to change the fake debian package which manages them. +# You have to fill the $pkg_dependencies variable, and then a new fake package will be created and installed, +# and the old one will be removed. +# If you don't have a $pkg_dependencies variable, the helper can't know what the app dependencies are. +# +# The app settings.yml will be modified as follows: +# - finalpath will be changed according to the new name (but only if the existing $final_path contains the old app name) +# - The checksums of php-fpm and nginx config files will be updated too. +# - If there is a $db_name value, it will be changed. +# - And, of course, the ID will be changed to the new name too. +# +# Finally, the $app variable will take the value of the new name. +# The helper will set the $migration_process variable to 1 if a migration has been successfully handled. +# +# You have to handle by yourself all the migrations not done by this helper, like configuration or special values in settings.yml +# Also, at the end of the upgrade script, you have to add a post_migration script to handle all the things the helper can't do during YunoHost upgrade (mostly for permission reasons), +# especially remove the old user, move some hooks and remove the old configuration directory +# To launch this script, you have to move it elsewhere and start it after the upgrade script. +# `cp ../conf/$script_post_migration /tmp` +# `(cd /tmp; echo "/tmp/$script_post_migration" | at now + 2 minutes)` +# +# usage: ynh_handle_app_migration migration_id migration_list +# | arg: -i, --migration_id= - ID from which to migrate +# | arg: -l, --migration_list= - File specifying every file to move (one file per line) +ynh_handle_app_migration () { + # Need for end of install + ynh_package_install at + + #================================================= + # LOAD SETTINGS + #================================================= + + old_app=$YNH_APP_INSTANCE_NAME + local old_app_id=$YNH_APP_ID + local old_app_number=$YNH_APP_INSTANCE_NUMBER + + # Declare an array to define the options of this helper. + declare -Ar args_array=( [i]=migration_id= [l]=migration_list= ) + # Get the id from which to migrate + local migration_id + # And the file with the paths to move + local migration_list + # Manage arguments with getopts + ynh_handle_getopts_args "$@" + + # Get the new app id in the manifest + local new_app_id=$(grep \"id\": ../manifest.json | cut -d\" -f4) + if [ $old_app_number -eq 1 ]; then + local new_app=$new_app_id + else + local new_app=${new_app_id}__${old_app_number} + fi + + #================================================= + # CHECK IF IT HAS TO MIGRATE + #================================================= + + migration_process=0 + + if [ "$old_app_id" == "$new_app_id" ] + then + # If the 2 id are the same + # No migration to do. + echo 0 + return 0 + else + if [ "$old_app_id" != "$migration_id" ] + then + # If the new app is not the authorized id, fail. + ynh_die --message "Incompatible application for migration from $old_app_id to $new_app_id" + fi + + echo "Migrate from $old_app_id to $new_app_id" >&2 + + #================================================= + # CHECK IF THE MIGRATION CAN BE DONE + #================================================= + + # TODO Handle multi instance apps... + # Check that there is not already an app installed for this id. + (yunohost app list --installed -f "$new_app" | grep -q id) \ + && ynh_die "$new_app is already installed" + + #================================================= + # CHECK THE LIST OF FILES TO MOVE + #================================================= + + local temp_migration_list="$(tempfile)" + + # Build the list by removing blank lines and comment lines + sed '/^#.*\|^$/d' "../conf/$migration_list" > "$temp_migration_list" + + # Check if there is no file in the destination + local file_to_move="" + while read file_to_move + do + # Replace all occurences of $app by $new_app in each file to move. + local move_to_destination="${file_to_move//\$app/$new_app}" + test -e "$move_to_destination" && ynh_die "A file named $move_to_destination already exists." + done < "$temp_migration_list" + + #================================================= + # COPY YUNOHOST SETTINGS FOR THIS APP + #================================================= + + local settings_dir="/etc/yunohost/apps" + cp -a "$settings_dir/$old_app" "$settings_dir/$new_app" + cp -a ../{scripts,conf} "$settings_dir/$new_app" + + # Replace the old id by the new one + ynh_replace_string "\(^id: .*\)$old_app" "\1$new_app" "$settings_dir/$new_app/settings.yml" + # INFO: There a special behavior with yunohost app setting: + # if the id given in argument does not match with the id + # stored in the config file, the config file will be purged. + # That's why we use sed instead of app setting here. + # https://github.com/YunoHost/yunohost/blob/c6b5284be8da39cf2da4e1036a730eb5e0515096/src/yunohost/app.py#L1316-L1321 + + # Change the label if it's simply the name of the app + old_label=$(ynh_app_setting_get $new_app label) + if [ "${old_label,,}" == "$old_app_id" ] + then + # Build the new label from the id of the app. With the first character as upper case + new_label=$(echo $new_app_id | cut -c1 | tr [:lower:] [:upper:])$(echo $new_app_id | cut -c2-) + ynh_app_setting_set $new_app label $new_label + fi + + yunohost tools shell -c "from yunohost.permission import permission_delete; permission_delete('$old_app.main', force=True, sync_perm=False)" + yunohost tools shell -c "from yunohost.permission import permission_create; permission_create('$new_app.main', url='/' , sync_perm=True)" + + #================================================= + # MOVE FILES TO THE NEW DESTINATION + #================================================= + + while read file_to_move + do + # Replace all occurence of $app by $new_app in each file to move. + move_to_destination="$(eval echo "${file_to_move//\$app/$new_app}")" + local real_file_to_move="$(eval echo "${file_to_move//\$app/$old_app}")" + echo "Move file $real_file_to_move to $move_to_destination" >&2 + mv "$real_file_to_move" "$move_to_destination" + done < "$temp_migration_list" + + #================================================= + # UPDATE SETTINGS KNOWN ENTRIES + #================================================= + + # Replace nginx checksum + ynh_replace_string "\(^checksum__etc_nginx.*\)_$old_app" "\1_$new_app/" "$settings_dir/$new_app/settings.yml" + + # Replace php5-fpm checksums + ynh_replace_string "\(^checksum__etc_php5.*[-_]\)$old_app" "\1$new_app/" "$settings_dir/$new_app/settings.yml" + + # Replace final_path + ynh_replace_string "\(^final_path: .*\)$old_app" "\1$new_app" "$settings_dir/$new_app/settings.yml" + + #================================================= + # MOVE THE DATABASE + #================================================= + + db_pwd=$(ynh_app_setting_get $old_app mysqlpwd) + db_name=$dbname + + # Check if a database exists before trying to move it + local mysql_root_password=$(cat $MYSQL_ROOT_PWD_FILE) + if [ -n "$db_name" ] && mysqlshow -u root -p$mysql_root_password | grep -q "^| $db_name" + then + new_db_name=$(ynh_sanitize_dbid $new_app) + echo "Rename the database $db_name to $new_db_name" >&2 + + local sql_dump="/tmp/${db_name}-$(date '+%s').sql" + + # Dump the old database + ynh_mysql_dump_db "$db_name" > "$sql_dump" + + # Create a new database + ynh_mysql_setup_db $new_db_name $new_db_name $db_pwd + # Then restore the old one into the new one + ynh_mysql_connect_as $new_db_name $db_pwd $new_db_name < "$sql_dump" + + # Remove the old database + ynh_mysql_remove_db $db_name $db_name + # And the dump + ynh_secure_remove --file="$sql_dump" + + # Update the value of $db_name + db_name=$new_db_name + ynh_app_setting_set $new_app db_name $db_name + fi + + #================================================= + # CHANGE THE FAKE DEPENDENCIES PACKAGE + #================================================= + + # Check if a variable $pkg_dependencies exists + # If this variable doesn't exist, this part shall be managed in the upgrade script. + if [ -n "${pkg_dependencies:-}" ] + then + # Define the name of the package + local old_package_name="${old_app//_/-}-ynh-deps" + local new_package_name="${new_app//_/-}-ynh-deps" + + if ynh_package_is_installed "$old_package_name" + then + # Install a new fake package + app=$new_app + ynh_install_app_dependencies $pkg_dependencies + # Then remove the old one + app=$old_app + ynh_remove_app_dependencies + fi + fi + + #================================================= + # UPDATE THE ID OF THE APP + #================================================= + + app=$new_app + + # Set migration_process to 1 to inform that an upgrade has been made + migration_process=1 + fi +} diff --git a/scripts/install b/scripts/install new file mode 100644 index 0000000..bc590ae --- /dev/null +++ b/scripts/install @@ -0,0 +1,151 @@ +#!/bin/bash + +#================================================= +# GENERIC START +#================================================= + +# Load common variables and helpers +source ./experimental_helper.sh +source ./_common.sh + +# IMPORT GENERIC HELPERS +source /usr/share/yunohost/helpers + +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +ynh_script_progression --message="Validating installation parameters..." + +# Retrieve arguments +domain=$YNH_APP_ARG_DOMAIN +path_url=$YNH_APP_ARG_PATH +admin=$YNH_APP_ARG_ADMIN +is_public=$YNH_APP_ARG_IS_PUBLIC +upstream_version=$(ynh_app_upstream_version) + +# Register (book) web path +ynh_webpath_register --app $app --domain $domain --path_url $path_url + +# Check user parameter +ynh_user_exists "$admin" \ + || ynh_die --message "The chosen admin user does not exist." + +# Check Final Path availability +test ! -e "$final_path" || ynh_die --message "This path already contains a folder" + +if [ -e "$datadir" ]; then + old_data_dir_path="$datadir$(date '+%Y%m%d.%H%M%S')" + ynh_print_warn "A data directory already exist. Data was renamed to $old_data_dir_path" + mv "$datadir" "$old_data_dir_path" +fi + +# Generate random password and key +ynh_script_progression --message="Defining db password and key..." +db_password=$(ynh_string_random) +key=$(ynh_string_random) +lfs_key=$(ynh_string_random) + +# Find available ports +port=$(ynh_find_port --port 6000) + +# Store Settings +ynh_script_progression --message="Storing installation settings..." +ynh_app_setting_set --app $app --key mysqlpwd --value $db_password +ynh_app_setting_set --app $app --key adminusername --value $admin +ynh_app_setting_set --app $app --key secret_key --value $key +ynh_app_setting_set --app $app --key lfs_key --value $lfs_key +ynh_app_setting_set --app $app --key web_port --value $port + +#================================================= +# STANDARD MODIFICATIONS +#================================================= + +# Initialize database and store mysql password for upgrade +ynh_script_progression --message="Configuring MySQL database..." +ynh_mysql_create_db "$dbname" "$db_user" "$db_password" + +# Add users +ynh_script_progression --message="Configuring system user..." +ynh_system_user_create --username=$app --home_dir=$datadir --use_shell +# Add ssh permission for gitea user +adduser $app ssh.app + +# create needed directories +create_dir + +# Configure init script +ynh_script_progression --message="Configuring a systemd service..." --weight=2 +ynh_add_systemd_config + +# Modify Nginx configuration file and copy it to Nginx conf directory +ynh_script_progression --message="Configuring nginx..." --weight=1 +config_nginx + +# Configure gitea with app.ini file +ynh_script_progression --message="Configuring application, step 1/2..." +config_gitea + +ynh_script_progression --message="Installing sources files..." --weight=10 + +# Install gitea +ynh_setup_source $final_path source/$architecture + +# Set permissions +ynh_script_progression --message="Protecting directory" +set_permission + +ynh_script_progression --message="Configuring application, step 2/2..." + +# Start gitea for building mysql tables +systemctl start "$app".service + +# Wait untill login_source mysql table is created +while ! $(ynh_mysql_connect_as "$db_user" "$db_password" "$dbname" <<< "SELECT * FROM login_source;" &>/dev/null) +do + sleep 2 +done + +# Add ldap config +ynh_replace_string --match_string "__APP__" --replace_string "$app" --target_file ../conf/login_source.sql +ynh_mysql_connect_as "$db_user" "$db_password" "$dbname" < ../conf/login_source.sql + +# SETUP FAIL2BAN +ynh_script_progression --message="Configuring fail2ban..." +ynh_add_fail2ban_config --logpath "/var/log/$app/gitea.log" --failregex ".*Failed authentication attempt for .* from " --max_retry 5 + +#================================================= +# GENERIC FINALIZATION +#================================================= + +# Unprotect root from SSO if public +ynh_script_progression --message="Configuring permissions..." +if [ "$is_public" == '1' ]; +then + ynh_permission_update --permission "main" --add "visitors" +fi + +# Create permission +ynh_script_progression --message="Configuring permissions" +ynh_permission_create --permission="admin" --allowed=$admin + +# Add gitea to YunoHost's monitored services +ynh_script_progression --message="Register Gitea service..." +yunohost service add "$app" --log="/var/log/$app/gitea.log" + +# Configure logrotate +ynh_script_progression --message="Configuring log rotation..." +ynh_use_logrotate --logfile "/var/log/$app" + +# Save Version +ynh_app_setting_set --app $app --key upstream_version --value $(ynh_app_upstream_version) + +# Reload services +ynh_script_progression --message="Starting gitea services..." --weight=3 + +ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/gitea.log" --line_match="Starting new Web server: tcp:127.0.0.1:" + +# Store the checksum with the 'INTERNAL_TOKEN' value. +# Should be removed when the issue https://github.com/go-gitea/gitea/issues/3246 is fixed +ynh_store_file_checksum --file "$final_path/custom/conf/app.ini" + +ynh_script_progression --message="Installation of $app completed" --last diff --git a/scripts/remove b/scripts/remove new file mode 100644 index 0000000..ebfab83 --- /dev/null +++ b/scripts/remove @@ -0,0 +1,64 @@ +#!/bin/bash + +#================================================= +# GENERIC START +#================================================= + +# Load common variables and helpers +source ./experimental_helper.sh +source ./_common.sh + +# IMPORT GENERIC HELPERS +source /usr/share/yunohost/helpers + +ynh_script_progression --message="Loading installation settings..." + +# Retrieve domain from app settings +domain=$(ynh_app_setting_get --app $app --key domain) + +#================================================= +# STANDARD REMOVE +#================================================= + +# Stop gitea +ynh_script_progression --message="Stoping services..." +systemctl stop "$app".service + +# Drop MySQL database and user +ynh_script_progression --message="Removing databases..." +ynh_mysql_drop_db "$dbname" 2>/dev/null +ynh_mysql_drop_user "$db_user" 2>/dev/null + +# Delete app directory and configurations +ynh_script_progression --message="Removing code..." +ynh_secure_remove --file="$final_path" +ynh_script_progression --message="Removing logs..." +ynh_secure_remove --file="/var/log/$app" + +# Remove the app-specific logrotate config +ynh_remove_logrotate + +# Remove nginx config +ynh_script_progression --message="Removing nginx configuration..." +ynh_remove_nginx_config + +# Remove gitea user and data +ynh_script_progression --message="Removing the dedicated system user..." +ynh_system_user_delete $app + +# Remove init script +ynh_script_progression --message="Removing systemd units..." +ynh_remove_systemd_config + +# Remove monitor +ynh_script_progression --message="Removing gitea service..." +yunohost service remove "$app" + +# Remove fail2ban config +ynh_script_progression --message="Removing fail2ban configuration..." +ynh_remove_fail2ban_config + +ynh_print_info --message="Due of the backup core only feature the data directory in '$datadir' was not removed. It need to be removed manually to purge app user data." + +ynh_script_progression --message="Removal of $app completed" --last +sleep 1 diff --git a/scripts/restore b/scripts/restore new file mode 100644 index 0000000..a7ae980 --- /dev/null +++ b/scripts/restore @@ -0,0 +1,81 @@ +#!/bin/bash + +#================================================= +# GENERIC START +#================================================= + +# Load common variables and helpers +source ../settings/scripts/experimental_helper.sh +source ../settings/scripts/_common.sh + +# IMPORT GENERIC HELPERS +source /usr/share/yunohost/helpers + +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +ynh_script_progression --message="Loading settings..." + +# Retrieve old app settings +domain=$(ynh_app_setting_get --app $app --key domain) +path_url=$(ynh_app_setting_get --app $app --key path) +db_password=$(ynh_app_setting_get --app $app --key mysqlpwd) +admin=$(ynh_app_setting_get --app $app --key adminusername) +port=$(ynh_app_setting_get --app $app --key web_port) +upstream_version=$(ynh_app_setting_get $app upstream_version) + +# Check user parameter +ynh_user_exists "$admin" \ + || ynh_die --message "The chosen admin user does not exist." + +# Check Final Path availability +test ! -e "$final_path" || ynh_die --message "This path already contains a folder" + +#================================================= +# STANDARD RESTORATION STEPS +#================================================= + +# Add users +ynh_script_progression --message="Configuring system user..." +ynh_system_user_create --username=$app --home_dir=$datadir --use_shell + +# Restore all files +ynh_script_progression --message="Restoring files..." --weight=10 +ynh_restore + +# Create and restore the database +ynh_script_progression --message="Restoring database..." --weight=3 +ynh_mysql_create_db "$dbname" "$db_user" "$db_password" +ynh_mysql_connect_as "$db_user" "$db_password" "$dbname" < ./db.sql + +# Restore systemd files +systemctl daemon-reload +systemctl enable "$app".service --quiet + +# SETUP FAIL2BAN +ynh_script_progression --message="Configuring fail2ban..." +ynh_add_fail2ban_config --logpath "/var/log/$app/gitea.log" --failregex ".*Failed authentication attempt for .* from " --max_retry 5 + +#================================================= +# GENERIC FINALIZATION +#================================================= + +# Set permissions +ynh_script_progression --message="Protecting directory..." +set_permission + +# Configure logrotate +ynh_script_progression --message="Configuring log rotation..." +ynh_use_logrotate --logfile "/var/log/$app" + +# Add gitea to YunoHost's monitored services +ynh_script_progression --message="Register Gitea service..." +yunohost service add "$app" --log=/var/log/$app/gitea.log + +# Reload services +ynh_script_progression --message="Reloading services..." +systemctl reload nginx.service +ynh_systemd_action -l "Starting new Web server: tcp:127.0.0.1:" -p "/var/log/$app/gitea.log" -t 10 +sleep 1 + +ynh_script_progression --message="Restoration completed for $app" --last diff --git a/scripts/upgrade b/scripts/upgrade new file mode 100644 index 0000000..e6ffa01 --- /dev/null +++ b/scripts/upgrade @@ -0,0 +1,308 @@ +#!/bin/bash + +#================================================= +# GENERIC START +#================================================= + +# Load common variables and helpers +source ./experimental_helper.sh +source ./_common.sh + +# IMPORT GENERIC HELPERS +source /usr/share/yunohost/helpers + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." + +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_normalize_url_path --path_url $(ynh_app_setting_get --app $app --key path)) +db_password=$(ynh_app_setting_get --app=$app --key=mysqlpwd) +admin=$(ynh_app_setting_get --app=$app --key=adminusername) +key=$(ynh_app_setting_get --app=$app --key=secret_key) +lfs_key=$(ynh_app_setting_get --app=$app --key=lfs_key) +port=$(ynh_app_setting_get --app=$app --key=web_port) +upstream_version=$(ynh_app_setting_get --app=$app --key=upstream_version) + +#================================================= +# STOP SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Stopping a systemd service..." --weight=1 + +# We stop the service before to set ynh_clean_setup +ynh_systemd_action --service_name=$app --action="stop" + +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." + +if [ "0$(ynh_app_setting_get --app=$app --key=disable_backup_before_upgrade)" -ne 1 ] +then + ynh_backup_before_upgrade + ynh_clean_setup () { + # Clean installation remainings that are not handled by the remove script. + ynh_clean_check_starting + ynh_restore_upgradebackup + } +fi + +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# ENSURE DOWNWARD COMPATIBILITY +#================================================= +ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 + +# If lfs_key doesn't exist, create it +if [ -z "$lfs_key" ]; then + lfs_key=$(ynh_string_random) + ynh_app_setting_set --app=$app --key=lfs_key --value=$lfs_key +fi + +#================================================= +# MIGRATION FROM GOGS +#================================================= + +[[ $YNH_APP_ID == "gogs" ]] \ + && [[ "$(cat "/opt/$app/templates/.VERSION")" != 0.11.79.1211 ]] \ + && ynh_die --message "It look like that you have an old Gogs install. You need first upgrade Gogs instance (id: $gogs_migrate_id) and after migrate to Gitea." +ynh_handle_app_migration --migration_id=gogs --migration_list=gogs_migrations + +if [[ $migration_process -eq 1 ]]; then + # Reload variables + dbname=$app + db_user=$app + final_path="/opt/$app" + datadir="/home/""$app" + repos_path="$datadir/repositories" + data_path="$datadir/data" + + # Replace the user + ynh_system_user_delete $old_app + test getent passwd "$app" &>/dev/null || \ + useradd -d "$datadir" --system --user-group "$app" --shell /bin/bash || \ + ynh_die --message "Unable to create $app system account" + + # Clean old binary + ynh_secure_remove --file=$final_path/gogs + ynh_secure_remove --file=$final_path/custom/conf/auth.d + + # Restore authentication from SQL database + ynh_replace_string --match_string __APP__ --replace_string "$app" --target_file ../conf/login_source.sql + ynh_mysql_connect_as "$db_user" "$db_password" "$dbname" < ../conf/login_source.sql + + # Fix hooks + if [[ -e $repos_path ]];then + ls $repos_path/*/*.git/hooks/pre-receive | while read p; do + ynh_secure_remove --file=$p + done + ls $repos_path/*/*.git/hooks/post-receive | while read p; do + ynh_secure_remove --file=$p + done + fi + + upstream_version="0.0.1" +fi + +# Move data directory +if [ -e "/home/""$app" ] && [ ! -e $datadir ]; then + mv "/home/""$app" "$datadir" +fi + +# Ensuring the user has the right home dir +if [ ~$app != "$datadir" ]; then + usermod -d "$datadir" $app +fi + +#================================================= +# STANDARD UPGRADE STEPS +#================================================= +ynh_script_progression --message="Configuring application..." + +# Clean template to fix issue : https://github.com/gogits/gogs/issues/4585 +ynh_secure_remove --file="/opt/$app/templates" + +# Configure gitea with app.ini file +config_gitea + +# Configure init script +ynh_script_progression --message="Updating systemd units..." +ynh_add_systemd_config + +# Modify Nginx configuration file and copy it to NGINX conf directory +ynh_script_progression --message="Configuring NGINX..." --weight=1 +config_nginx + +#================================================= +# DB migration +#================================================= +ynh_script_progression --message="Upgrading database and sources..." --weight=6 + +# Before the version 1.7 the upstream version was not stored +# The way to find the version for the install < 1.7 is to parse the binary file to find which version is installed +if [ -z ${upstream_version:-} ]; then + for version in "0.0." "1.0." "1.1." "1.2." "1.3." "1.4." "1.5." "1.6." "1.7."; do + if strings $final_path/gitea | grep -P "^${version//./\\.}\d"; then + upstream_version="${version}0" + break + fi + done +fi + +restart_gitea() { + # Set permissions + set_permission + ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/gitea.log" --line_match="Starting new Web server: tcp:127.0.0.1:" + # Leave the time to update the database schema + sleep 5 + systemctl stop $app +} + +case $upstream_version in +"0.0."* ) + ynh_setup_source $final_path source/${architecture}_1.0 + set_permission + systemctl start $app + sleep 20 + systemctl stop $app +;& +"1.0."* ) + ynh_setup_source $final_path source/${architecture}_1.1 + restart_gitea +;& +"1.1."* ) + ynh_setup_source $final_path source/${architecture}_1.2 + restart_gitea +;& +"1.2."* ) + ynh_setup_source $final_path source/${architecture}_1.3 + restart_gitea +;& +"1.3."* ) + ynh_setup_source $final_path source/${architecture}_1.4 + restart_gitea +;& +"1.4."* ) + ynh_setup_source $final_path source/${architecture}_1.5 + restart_gitea +;& +"1.5."* ) + ynh_setup_source $final_path source/${architecture}_1.6 + restart_gitea +;& +"1.6."* ) + ynh_setup_source $final_path source/${architecture}_1.7 + restart_gitea +;& +"1.7."* ) + ynh_setup_source $final_path source/${architecture}_1.8 + restart_gitea +;& +"1.8."* ) + ynh_setup_source $final_path source/${architecture}_1.9 + restart_gitea +;& +"1.9."* ) + ynh_setup_source $final_path source/${architecture}_1.10 + restart_gitea +;& +"1.10."* ) + ynh_setup_source $final_path source/${architecture}_1.11 + restart_gitea +;& +"1.11."* ) + ynh_setup_source $final_path source/${architecture}_1.12 + restart_gitea +;& +"1.12."* ) + ynh_setup_source $final_path source/${architecture}_1.13 + restart_gitea +;& +"1.13."* ) + ynh_setup_source $final_path source/${architecture}_1.14 + restart_gitea +;& +"1.14."* ) + ynh_setup_source $final_path source/${architecture}_1.15 + restart_gitea +;& +"1.15."* ) + ynh_setup_source $final_path source/${architecture}_1.16 + restart_gitea +;& +"1.16."* ) + ynh_setup_source $final_path source/${architecture}_1.16 + restart_gitea +;& +esac + +# Install gitea source +ynh_setup_source $final_path source/$architecture +restart_gitea + +# SETUP FAIL2BAN +ynh_script_progression --message="Configuring Fail2Ban..." +ynh_add_fail2ban_config --logpath="/var/log/$app/gitea.log" --failregex=".*Failed authentication attempt for .* from " --max_retry 5 + +#================================================= +# GENERIC FINALIZATION +#================================================= + +# Set all permissions +ynh_script_progression --message="Update permission..." +if ! ynh_permission_exists --permission admin; then + ynh_app_setting_delete --app $app --key unprotected_uris + ynh_permission_create --permission="admin" --allowed="$admin" + # Update ldap config + ynh_replace_string --match_string="__APP__" --replace_string="$app" --target_file="../conf/login_source.sql" + ynh_mysql_connect_as "$db_user" "$db_password" "$dbname" < ../conf/login_source.sql +fi + +# Add gitea to YunoHost's monitored services +ynh_script_progression --message="Register Gitea service..." +yunohost service add "$app" --log="/var/log/$app/gitea.log" + +# Add ssh permission for gitea user +adduser $app ssh.app + +# Set permissions +ynh_script_progression --message="Protecting directory" +set_permission + +# Save Version +ynh_app_setting_set --app=$app --key=upstream_version --value=$(ynh_app_upstream_version) + +# Reload services +ynh_script_progression --message="Starting Gitea services..." --weight=3 +#ynh_systemd_action -l "Starting new Web server: tcp:127.0.0.1:" -p "/var/log/$app/gitea.log" -t 10 +#sleep 1 +ynh_systemd_action --service_name=$app --action="start" --log_path="/var/log/$app/gitea.log" --line_match="Starting new Web server: tcp:127.0.0.1:" + +# Store the checksum with the 'INTERNAL_TOKEN' value. +# Should be removed when the issue https://github.com/go-gitea/gitea/issues/3246 is fixed +ynh_store_file_checksum --file="$final_path/custom/conf/app.ini" + +#================================================= +# FINISH MIGRATION PROCESS +#================================================= + +if [[ $migration_process -eq 1 ]]; then + echo "Gogs has been successfully migrated to Gitea! \ +A last scheduled operation will run in a couple of minutes to finish the \ +migration in YunoHost side. Do not proceed any application operation while \ +you don't see Gogs as installed." >&2 + + # Execute a post migration script after the end of this upgrade. + # Mainly for some cleaning + script_post_migration=gogs_post_migration.sh + ynh_replace_string --match_string __OLD_APP__ --replace_string "$old_app" --target_file ../conf/$script_post_migration + ynh_replace_string --match_string __NEW_APP__ --replace_string "$app" --target_file ../conf/$script_post_migration + cp ../conf/$script_post_migration /tmp + chmod +x /tmp/$script_post_migration + (cd /tmp; echo "/tmp/$script_post_migration > /tmp/$script_post_migration.log 2>&1" | at now + 2 minutes) +fi + +ynh_script_progression --message="Upgrade of $app completed" --last